首先,先确认服务器是否已开启转发,运行:
sysctl net.ipv4.ip_forward

如果已经启动则显示

net.ipv4.ip_forward = 1

如果没有启动则显示(请按照下面步骤进行开启)

net.ipv4.ip_forward = 0

echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
sysctl -p

//设置 DNAT
iptables -t nat -A PREROUTING -p tcp --dport [本地端口号] -j DNAT --to-destination [目标IP:目标端口号]

//设置SNAT

iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [本地服务器IP]

经过这样的设置就可以了。但这样的iptables 记录在服务器重启后会丢失掉。我们使用iptables-save命令把这些设置保存的文件里

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

当服务器重启后,使用下面的命令恢复。

iptables-restore < /etc/iptables/rules.v4

这个过程看起来有点傻,我们需要iptables能够自动加载。安装iptables-persistent服务就可以了

apt-get install iptables-persistent
它会自动读取/etc/iptables/rules.v4这个文件里的配置。

iptables -t nat -vnL是什么命令?
用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号

iptables -L
粗略列出 filter 表所有链及所有规则

iptables -t nat -vxnL PREROUTING
用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解

iptables -t nat -F PREROUTING
-F: FLASH,清空规则链的(注意每个链的管理权限)
PREROUTING (路由前)
-t nat:显示所有的关卡的信息

iptables -t nat -F 清空nat表的所有链

iptables -t nat -F PREROUTING 清空nat表PREROUTING链
iptables -t nat -vnL | grep SNAT | awk -F : {'print $2'} 得到snat ip
iptables -t nat -D POSTROUTING -o eth1 -j SNAT --to ${snat_ip} 删除所有源地址转换表项
iptables -t nat -A PREROUTING -i %{G_HOST_IF0_0_0} -p tcp --dport %{G_TESTBED_SELENIUM_DPORT} -j DNAT --to %{G_PROD_IP_BR0_0_0}:80 添加源转换表项
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to ${ip} 添加目的转换表项
iptables -t nat -vnL 察看定义规则的详细信息

1 、本地端口转发
将外网访问本地的4444端口的流量转发到本地的22端口:

iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 22

删除规则用-D参数:iptables -t nat -D PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 22

将本地访问本地的4444端口的流量转发到本地的22端口:

iptables -t nat -A OUTPUT -p tcp --dport 4444 -j REDIRECT --to-ports 22

2、分流
通过PREROUTING链,将172.16.250.1网段访问4444端口的包转发到本机22端口,其他网段则正常访问4444端口,MASQUERADE类似于SNAT,只是不用写源地址。

iptables -t nat -A PREROUTING --source 172.16.250.1 -p tcp --dport 4444 -j DNAT --to-destination 172.16.250.3:22
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE
iptables -t nat -A POSTROUTING --dst 172.16.250.3 -p tcp --dport 22 -j MASQUERADE

3、远程端口转发
同样也需要改配置文件,使iptables允许ipv4转发

假如我们想使用192.168.171.139:5555去访问192.168.171.1:9999端口,那么需要在192.168.171.139的机器上执行下面的命令:

iiptables -F -t nat
iptables -t nat -A PREROUTING --dst 192.168.171.139 -p tcp --dport 5555 -j DNAT --to-destination 192.168.171.1:9999
iptables -t nat -A POSTROUTING --dst 192.168.171.1 -p tcp --dport 9999 -j SNAT --to-source 192.168.171.139

iptables -t nat -nL --line #查看已有规则
iptables -t nat -D PREROUTING 2
iptables -F -t nat #删除所有规则

Last modification:November 2, 2022
如果觉得我的文章对你有用,请随意赞赏