|
发表于 2017/3/25 16:39
|
显示全部楼层
|阅读模式
|Google Chrome 56.0.2924.87 |Windows 7
本帖最后由 三笠·阿克曼 于 2017/3/25 17:05 编辑
原先在弄VPN的时候就想过1台VPN服务器多IP出口,不过苦因度娘和谷歌娘查了大半个月,都找不到一篇有用的资料,然后问了下樱妹,他也说VPN没法实现多IP出口,就放弃了。工作室300多台的机器租了60多台的VPN服务器,30台韩国的,30台国内的用来做中转,钱包苦不堪言啊。。。
最近因工作室新增了100台机器,所以相应的也要增加VPN服务器,今天我在配置VPN服务器的时候,在添加iptables规则的时候,突然灵机一动,原来有时候真的是我们把东西想到太过复杂,它其实简单的可怕。
发出来既是为了共享,也是自己做一个记录。
Part1:多IP出口
原来iptables规则如下:
- 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
在写到上面的规则的时候,我突然想到,如果在下面再加一条:
- 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指定对应的出口应该也是可以的咯
接着又继续进行测试:
- iptables -t nat -A POSTROUTING -s 10.1.0.2 -j SNAT --to-source "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规则如下:
- iptables -t nat -A PREROUTING -d 1.1.1.0 -p udp --dport 1701 -j DNAT --to-destination 1.1.1.1:1701
复制代码- iptables -t nat -A PREROUTING -d 1.1.1.0 -p udp --dport 500 -j DNAT --to-destination 1.1.1.1:500
复制代码- iptables -t nat -A PREROUTING -d 1.1.1.0 -p udp --dport 4500 -j DNAT --to-destination 1.1.1.1:4500
复制代码
#设置去程
- iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp --dport 1701 -j SNAT --to-source 1.1.1.0
复制代码- iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp --dport 500 -j SNAT --to-source 1.1.1.0
复制代码- 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:开始配置路由策略转发
- iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ppp0 -j MASQUERADE
复制代码- iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o ppp1 -j MASQUERADE
复制代码- iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -o ppp2 -j MASQUERADE
复制代码- iptables -t nat -A POSTROUTING -s 10.0.4.0/24 -o ppp3 -j MASQUERADE
复制代码
#指定不同内网IP段走不同的ppp连接
- ip rule add from 10.0.1.0/24 table 1
复制代码- ip rule add from 10.0.2.0/24 table 2
复制代码- ip rule add from 10.0.3.0/24 table 3
复制代码- ip rule add from 10.0.4.0/24 table 4
复制代码
#把10.0.*.0来源的路由,转到 table *上
- ip route add 10.1.0.1 dev ppp0 table 1
复制代码- ip route add 10.1.0.10 dev ppp1 table 2
复制代码- ip route add 10.1.0.20 dev ppp2 table 3
复制代码- 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策略
- iptables -t nat -A POSTROUTING -s 10.1.0.2 -j SNAT --to-source "1.1.1.1"
复制代码- iptables -t nat -A POSTROUTING -s 10.1.0.11 -j SNAT --to-source "2.2.2.2"
复制代码- 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等平台上的游戏,正好这些游戏不同的区服也多,一台服务器中转多台,能节省不少的中转服务器的钱
国内这个服务器的费用,真心是贵的可怕。。。
|
|