小樱 发表于 2018/2/5 03:15

Linux 单台服务器多IP出口出网 均衡负载 爬虫CDN端口多IP回源的方法 nth模块 iptables数据流向图

环境:服务器配有:主ip:192.168.1.195与192.168.1.196/197/198/199 四个额外扩展ip

希望:实现对外发送请求时,对方看到我的出口ip每次都是不一样的,共五个ip同时使用轮训负载作为出口IP

方案:iptables的nth模块
注意设置好出网端口和网卡eth0,例如cdn一般使用80端口(下方使用的是25端口,有需要自己改),主IP不知道如何排除195使用,仅用扩展IP,下面教程会同时使用五个IP一起轮训负载。
/sbin/iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 4 --packet 0 -j SNAT --to-source 192.168.1.196
/sbin/iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 4 --packet 1 -j SNAT --to-source 192.168.1.197
/sbin/iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 4 --packet 2 -j SNAT --to-source 192.168.1.198
/sbin/iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 4 --packet 3 -j SNAT --to-source 192.168.1.199

如果使用80端口出向负载的话,可以用这个命令来尝试
curl myip.ipip.net

效果图


参考:netfilter的数据包流向图


参考:iptables的数据包流向图


这个就是有个毛病
主ip一起出去了。。
可能影响,被引起流量攻击,引起DNS无法解析,45S超时,被运营商黑洞导致部分程序响应失败等问题。

如果提示,代表你的vps为openvz虚拟化,是不支持的,可以先尝试联系工单客服打开,沟通不行的话,需要更换xen或者kvm等更高级虚拟化vps服务器。
iptables v1.4.7: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
之后在尝试命令,OJBK,可以用了
我这台openvz是两个IP地址的,直接命令一键回源端口80和443端口都自动走均很负载,every改成2即可,主IP是.12,写一条.13足够
/sbin/iptables -t nat -I POSTROUTING -m state --state NEW -p tcp -m multiport --dport 80,443 -o venet0 -m statistic --mode nth --every 2 --packet 0 -j SNAT --to-source 192.157.201.13
要下次开机后永久生效记得保存下
service iptables save
chkconfig iptables on

打印已经保存的nat规则
cat /etc/sysconfig/iptables | grep 'A POSTROUTING'


openvz服务器购买注册地址:https://www.budgetvm.com/account/aff.php?aff=1184


部分参考:http://www.run-debug.com/?p=508


2020年4月4日20:13:49
补充,后期了解到,every代表次数,,比如服务器4个IP,指定2个IP走端口就写--every 1 --every 2两行,packet貌似是几个数据包执行一次?packet值所以应该始终为0,所以有时候会跳到主IP。。。或者多个IP只写一行的情况,但是因为every用的2也是跳主IP就是这个毛病

feiyu2020 发表于 2021/8/14 23:05

补充:如果不开放端口会导致kangle 无法打开
还有下面红色的是网卡名称别搞错了
/sbin/iptables -t nat -I POSTROUTING -m state --state NEW -p tcp -m multiport --dport 80,443 -o venet0 -m statistic --mode nth --every 2 --packet 0 -j SNAT --to-source 192.157.201.13
iptables -P INPUT ACCEPT   
iptables -P OUTPUT ACCEPT
service iptables save
附带一个出错的
centos 7 中没有iptables 和service iptables save 指令使用失败问题解决方案
1.任意运行一条iptables防火墙规则配置命令:

iptables -P OUTPUT ACCEPT

2.对iptables服务进行保存:

service iptables save

如果上述命令执行失败报出:The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.

解决方法:
systemctl stop firewalld 关闭防火墙
yum install iptables-services 安装或更新服务
再使用systemctl enable iptables 启动iptables
最后 systemctl start iptables 打开iptables

再执行service iptables save

3.重启iptables服务:

service iptables restart

执行完毕之后/etc/syscofig/iptables文件就有了

再附加一个规则自定义防火墙端口
iptables -F /* 清除所有规则 */
iptables -A INPUT -p tcp --dport 22 -j ACCEPT /*允许包从22端口进入*/
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT /*允许从22端口进入的包返回*/
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT /* 域名解析端口,一般不开 */
iptables -A INPUT -p udp --sport 53 -j ACCEPT /* 域名解析端口,一般不开 */
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT /*允许本机访问本机*/
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT /*允许所有IP访问80端口*/
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables-save > /etc/sysconfig/iptables /*保存配置*/
iptables -L /* 显示iptables列表 */
页: [1]
查看完整版本: Linux 单台服务器多IP出口出网 均衡负载 爬虫CDN端口多IP回源的方法 nth模块 iptables数据流向图