通过iptables端口转发来实现代理的中转

iptables是linux服务器自带的防火墙软件,功能强大且耗用系统资源少,用来端口转发并发高速度快,可以有效解决线路的质量问题。缺点是:配置复杂……不过端口转发的设置还是挺简单的。

实现端口转发的工具有很多,Haproxy就是其中之一,但是你需要额外安装Haproxy软件,而且不支持转发udp。

安装iptables

一般linux自带iptables,但是服务商提供的系统模板各种各样,保不齐就把iptables阉割了。

CentOS

yum install iptables -y

Ubuntu、debian

apt-get install iptables -y

配置ipv4转发

编辑文件 /etc/sysctl.conf,将0改成1后,使用Esc键切换到命令模式,输入 :wq 以保存并退出。

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

使转发生效

sysctl -p

查询本机绑定的内网ip

ifconfig

假设我们绑定的内网ip为:168.1.1.1。

配置端口转发

iptables的端口转发的一直形式如下:
iptables -t nat -A PREROUTING -p tcp --dport [本地端口] -j DNAT --to-destination [目标IP:目标端口]
iptables -t nat -A PREROUTING -p udp --dport [本地端口] -j DNAT --to-destination [目标IP:目标端口]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口] -j SNAT --to-source [本地服务器主网卡绑定IP]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [目标端口] -j SNAT --to-source [本地服务器主网卡绑定IP]

下面开始根据具体不同的情景举例说明如何配置。假设我有一台搭建了ss的服务器,ip地址为1.1.1.1,端口为10000,我要实现中转的服务器绑定的内网ip如上所示为168.1.1.1。

1、相同端口的单端口转发

相同端口,就是说中转服务器和被中转的服务器的端口一致,这里端口就都是10000了

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10000 -j DNAT --to-destination 1.1.1.1:10000
iptables -t nat -A PREROUTING -p udp -m udp --dport 10000 -j DNAT --to-destination 1.1.1.1:10000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 10000 -j SNAT --to-source 168.1.1.1
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 10000 -j SNAT --to-source 168.1.1.1

2、不同端口的但端口转发

不同端口,就是说被中转的是10000端口,中转服务器用除了10000端口以外的端口中转。如果你用的NAT服务器,这个功能就比较有用;还有个情形是sspanel中转单端口,比如其他节点都用的443单端口,我们可以选择不同的端口来中转多个节点。下面举例用30000端口中转:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 30000 -j DNAT --to-destination 1.1.1.1:10000
iptables -t nat -A PREROUTING -p udp -m udp --dport 30000 -j DNAT --to-destination 1.1.1.1:10000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 10000 -j SNAT --to-source 168.1.1.1
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 10000 -j SNAT --to-source 168.1.1.1

3、多端口转发

iptables支持多端口转发,比如我们要转发10000到30000的端口,命令如下:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:10000-30000
iptables -t nat -A PREROUTING -p udp -m udp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:10000-30000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 10000:30000 -j SNAT --to-source 168.1.1.1
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 10000:30000 -j SNAT --to-source 168.1.1.1

保存iptables配置

不保存的话,iptables的配置信息都是临时的,重启后将会消失。

CentOS系统

service iptables save

Debian/Ubuntu系统

iptables-save > /etc/iptables.up.rules

查看NAT规则

iptables -t nat -vnL POSTROUTING
iptables -t nat -vnL PREROUTING

删除NAT规则

iptables -t nat -D POSTROUTING 1
iptables -t nat -D PREROUTING 1