设为首页收藏本站

ZMX - IT技术交流论坛 - 无限Perfect,追求梦想 - itzmx.com

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

搜索
查看: 9934|回复: 8

Centos配置VPN多IP出口实现单用户单IP And 中转服务器与多服务器进行中转

[复制链接]

签到天数: 31 天

[LV.5]常住居民I

发表于 2017/3/25 16:39 | 显示全部楼层 |阅读模式 |Google Chrome 56.0.2924.87|Windows 7
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
本帖最后由 三笠·阿克曼 于 2017/3/25 17:05 编辑

原先在弄VPN的时候就想过1台VPN服务器多IP出口,不过苦因度娘和谷歌娘查了大半个月,都找不到一篇有用的资料,然后问了下樱妹,他也说VPN没法实现多IP出口,就放弃了。工作室300多台的机器租了60多台的VPN服务器,30台韩国的,30台国内的用来做中转,钱包苦不堪言啊。。。

最近因工作室新增了100台机器,所以相应的也要增加VPN服务器,今天我在配置VPN服务器的时候,在添加iptables规则的时候,突然灵机一动,原来有时候真的是我们把东西想到太过复杂,它其实简单的可怕。

发出来既是为了共享,也是自己做一个记录。

Part1:多IP出口

原来iptables规则如下:
  1. iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j SNAT --to-source "1.1.1.1"
复制代码

10.1.0.0/24是内网IP段,1.1.1.1是VPN外网出口IP

在写到上面的规则的时候,我突然想到,如果在下面再加一条:
  1. iptables -t nat -A POSTROUTING -s 10.2.0.0/24 -j SNAT --to-source "2.2.2.2"
复制代码

是不是就能实现不同内网IP段走不同的外网IP出口了

接着我就马上在VPN的配置里多增加了一个内网IP段10.2.0.0/24,并新建一个用户,分配这个IP段的内网IP,然后在VPS的后台新增了一个IP,接着本地用2台机器测试

结果让我高兴的直接跳了起来,A机器走的是1.1.1.1的外网IP,B机器走的是2.2.2.2的外网IP

但是机智的我并没有被短暂的成功冲昏头脑,我想到,既然能为整个内网IP段指定对应的出口,那么为单个内网IP指定对应的出口应该也是可以的咯

接着又继续进行测试:
  1. iptables -t nat -A POSTROUTING -s 10.1.0.2 -j SNAT --to-source "1.1.1.1"
复制代码
  1. iptables -t nat -A POSTROUTING -s 10.1.0.3 -j SNAT --to-source "2.2.2.2"
复制代码

实验结果不出意外的成功了,掩住内心的喜悦,直接联系机房购买了1个C段的IP,内网的IP也是一个C段,正好用一个for循环添加到iptables里搞定

Part2:中转服务器与多服务器进行中转
上paypal取消了25台韩国VPS的自动续费,剩下5台升级了下内存和带宽,每台新增了1个C的IP

接着又把国内中转的25台服务器取消自动续费,想到每个月省下来的服务器费用,我高兴的像个100斤的瘦子(不高兴也是个100斤的瘦子

原来中转服务器是一对一的,比如CN1中转KR1,CN2中转KR2,CN3中转KR3这样

因为服务器实在太多了,搞的我都不知道哪台是对那台的,剩下的30台中转服务器,我找不到与剩下的5台韩国服务器对应的中转服务器是哪5台,干脆全部删了,重新部署算了,懒得一个个看

又是在部署到iptables转发规则的时候,我突然想到,既然VPN服务器能通过指定内网IP走指定的外网IP出口,那中转服务器能不能通过指定的内网IP走指定的中转出口呢?这样就能实现1对多中转了

原来iptables规则如下:
  1. iptables -t nat -A PREROUTING -d 1.1.1.0 -p udp --dport 1701 -j DNAT --to-destination 1.1.1.1:1701
复制代码
  1. iptables -t nat -A PREROUTING -d 1.1.1.0 -p udp --dport 500 -j DNAT --to-destination 1.1.1.1:500
复制代码
  1. iptables -t nat -A PREROUTING -d 1.1.1.0 -p udp --dport 4500 -j DNAT --to-destination 1.1.1.1:4500
复制代码

#设置去程

  1. iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp --dport 1701 -j SNAT --to-source 1.1.1.0
复制代码
  1. iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp --dport 500 -j SNAT --to-source 1.1.1.0
复制代码
  1. iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp --dport 4500 -j SNAT --to-source 1.1.1.0
复制代码

#设置回程

那么问题来了,这里只要是连接中转服务器1.1.1.0的VPN服务的1701端口的就全部被转到1.1.1.1去了,怎么根据内网IP段指定出口中转呢

在抽了半包烟之后,我想起了我刚开始弄时候的笨办法,不做端口转发,用VPN来进行转发

既:用户VPN连接---中转服务器,中转服务器VPN连接韩国VPN服务器,然后在中转服务器上加个路由指定流量走中转服务器---韩国服务器的VPN连接出口

方法如下:
1:用pptpclient设置5个VPN连接,然后拨号连上,分别得到5条VPN链路ppp0-ppp4

2:因为我现在工作室在4个不同地方的机房有机器,所以在中转服务器上设置4个不同的VPN内网IP段,不同地方的机器用不同用户组的方式实现分配不同的IP段拨入例如:10.0.1.0/24,10.0.2.0/24,10.0.3.0/24,10.0.4.0/24

3:开始实测,4台机器拨上VPN,得到4条VPN链路ppp5-ppp8

4:内网IP记得区分开,例如本例中,中转服务器与韩国服务器之间的内网IP段为:10.1.0.0/24。本地拨号机器与中转服务器之间的内网IP段为:10.0.1.0/24,10.0.2.0/24,10.0.3.0/24,10.0.4.0/24。(当然你爱怎么设置你是自己的事,我是为了区分的明显,用不同的B段,你要设置成不同的C段也可以,我没测试过,不知道会不会发生IP冲突之类的)

5:开始配置路由策略转发
  1. iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ppp0 -j MASQUERADE
复制代码
  1. iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o ppp1 -j MASQUERADE
复制代码
  1. iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -o ppp2 -j MASQUERADE
复制代码
  1. iptables -t nat -A POSTROUTING -s 10.0.4.0/24 -o ppp3 -j MASQUERADE
复制代码

#指定不同内网IP段走不同的ppp连接

  1. ip rule add from 10.0.1.0/24 table 1
复制代码
  1. ip rule add from 10.0.2.0/24 table 2
复制代码
  1. ip rule add from 10.0.3.0/24 table 3
复制代码
  1. ip rule add from 10.0.4.0/24 table 4
复制代码

#把10.0.*.0来源的路由,转到 table *上

  1. ip route add 10.1.0.1 dev ppp0 table 1
复制代码
  1. ip route add 10.1.0.10 dev ppp1 table 2
复制代码
  1. ip route add 10.1.0.20 dev ppp2 table 3
复制代码
  1. ip route add 10.1.0.30 dev ppp3 table 4
复制代码

#设置不同的table走不同的ppp网关

PS:当我设置到上面这一步的时候,我突然发现,中转服务器连接5个韩国服务器,既ppp0-ppp4的VPN网关都是10.1.0.1,为了防止出错,赶紧把5个韩国服务器设置了不同的VPN网关,例:10.1.0.1,10.1.0.2,10.1.0.3,10.1.0.4,10.1.0.5

设置完测试的时候,就发现问题了,ppp0的VPN网关为10.1.0.1,中转服务器拨号后得到的内网IP地址是10.1.0.2,但是ppp1的VPN网关又是10.1.0.2。。。。

赶紧又重新把韩国服务器的VPN网关修改成了:10.1.0.1,10.1.0.10,10.1.0.20,10.1.0.30,10.1.0.40,这样中转服务器拨号后得到的内网IP地址分别为:10.1.0.2,10.1.0.11,10.1.0.21,10.1.0.31,10.1.0.41

PPS:别问我为什么连了5条韩国VPN,只中转了4条,留1条是作为紧急时刻备用

最后,高兴的像个100斤的瘦子的我,用4个不同机房的机器连上测试后,发现悲剧了

估计可能有人发现问题所在了,不同机房的机器能连上了,也能根据不同的内网IP段转发到不同的韩国服务器了

使用端口转发的话,中转服务器完全就只是个中转,VPN验证和分配IP都是交给韩国服务器的,用户分配到的是韩国VPN服务器的内网IP段10.1.0.0/24,能根据我们前面的iptables策略
  1. iptables -t nat -A POSTROUTING -s 10.1.0.2 -j SNAT --to-source "1.1.1.1"
复制代码
  1. iptables -t nat -A POSTROUTING -s 10.1.0.11 -j SNAT --to-source "2.2.2.2"
复制代码
  1. iptables -t nat -A POSTROUTING -s 10.1.0.* -j SNAT --to-source "*.*.*.*"
复制代码

走不同的外网IP出口

但是

但是

但是使用VPN中转的话,所有用户的验证和分配IP是中转服务器完成的,都是通过中转服务器拨号韩国服务器得到的同一个内网IP连接,所以只有1个外网IP出口

最后因为工作室的游戏对独立IP的需要我还是放弃了这个方法,乖乖用5台中转服务器来中转了,等以后想到完美的解决办法了,再接着折腾,现在部署生产环境是第一要素

不过VPN中转的方法可以用来针对一些对独立IP要求不高的游戏做中转,例如一些单机类的平台游戏等,例如:origin,steam等平台上的游戏,正好这些游戏不同的区服也多,一台服务器中转多台,能节省不少的中转服务器的钱

国内这个服务器的费用,真心是贵的可怕。。。

欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

签到天数: 31 天

[LV.5]常住居民I

 楼主| 发表于 2017/3/25 16:54 | 显示全部楼层 |Google Chrome 56.0.2924.87|Windows 7
大召唤术@小樱
我又来发心得了
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

 成长值: 9

签到天数: 4497 天

[LV.Master]伴坛终老

发表于 2017/3/25 20:28 | 显示全部楼层 |Google Chrome 57.0.2987.110|Windows 8.1
恩恩,大佬巨强无比,话说可以实现均衡负载随机IP出口么
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

签到天数: 31 天

[LV.5]常住居民I

 楼主| 发表于 2017/3/28 09:10 | 显示全部楼层 |Google Chrome 56.0.2924.87|Windows 7
小樱 发表于 2017/3/25 20:28
恩恩,大佬巨强无比,话说可以实现均衡负载随机IP出口么

中转服务器使用ros的话可以做负载均衡
centos的话目前还不知道要怎么做
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

 成长值: 9

签到天数: 4497 天

[LV.Master]伴坛终老

发表于 2017/3/28 13:01 | 显示全部楼层 |Google Chrome 53.0.2785.104|Windows 7
三笠·阿克曼 发表于 2017/3/28 09:10
中转服务器使用ros的话可以做负载均衡
centos的话目前还不知道要怎么做

嗯。。主要就是用出口IP用的,服务器/24 253个IP,做出口GET用
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

签到天数: 69 天

[LV.6]常住居民II

发表于 2017/4/20 07:47 | 显示全部楼层 |Firefox 52.0|GNU/Linux x64
收藏一下,研究研究
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2017/5/18 03:31 | 显示全部楼层 |Google Chrome 57.0.2987.110|Windows 7
@小樱  @三笠·阿克曼
我用 ros 利用多播技术 拨了50播,也就是相当于50条adsl光纤,并且开启代理ip端口
然后使用squid做了下简单二级代理转发的负载均衡,
只要通过squid的代理端口,就达到了,随机ip出口。
适合爬虫,注册,貌似搞游戏的话,这样操作,用途不大。
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

签到天数: 31 天

[LV.5]常住居民I

 楼主| 发表于 2017/5/18 09:22 | 显示全部楼层 |Google Chrome 57.0.2987.133|Windows 7
hanbingtel 发表于 2017/5/18 03:31
@小樱  @三笠·阿克曼
我用 ros 利用多播技术 拨了50播,也就是相当于50条adsl光纤,并且开启代理ip端口
...

貌似樱妹对这个比较感兴趣
[发帖际遇]: 三笠·阿克曼 乐于助人,奖励 6 贡献. 幸运榜 / 衰神榜
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

 成长值: 9

签到天数: 4497 天

[LV.Master]伴坛终老

发表于 2017/5/18 14:50 | 显示全部楼层 |Google Chrome 45.0.2454.101|Windows 7
hanbingtel 发表于 2017/5/18 03:31
@小樱  @三笠·阿克曼
我用 ros 利用多播技术 拨了50播,也就是相当于50条adsl光纤,并且开启代理ip端口
...

wc,,,这么6的啊。还能50拨
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 新浪微博账号登陆用百度帐号登录

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2024/4/27 23:07 , Processed in 0.313015 second(s), 25 queries , MemCache On.

Powered by itzmx! X3.4

© 2011- sakura

快速回复 返回顶部 返回列表