CENTOS 7 使用iptables端口转发

标签: none

开启内核转发
LINUX 启用 IP 转发 (IPV4 / IPV6) | 内核转发

vim /etc/sysctl.conf
net.ipv4.ip_forward=1

保存后,使修改内容生效
sysctl -p

用户 --> 中转IP --> 目标IP

多端口 端口转发
将中转服务器(IP 2.2.2.2)10000~30000 端口转发至目标服务器(IP 1.1.1.1)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 -p tcp -m tcp -d 1.1.1.1 --dport 10000:30000 -j SNAT --to-source 2.2.2.2
iptables -t nat -A POSTROUTING -p udp -m udp -d 1.1.1.1 --dport 10000:30000 -j SNAT --to-source 2.2.2.2

按需要 替换对应的 中转服务器IP 和 目标服务器IP.

同端口/单端口 端口转发

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

保存iptables配置 (未测试)

mkdir /etc/iptables
iptables-save > /etc/iptables.up.rules
iptables-restore < /etc/iptables.up.rules

#由于这种方式并不是下次启动就会自动加载iptables规则。开机自动恢复iptables规则方法:
vim /etc/rc.local

#在exit 0前加入下面代码
iptables-restore < /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

iptables -m参数的含义

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT

最终到了iptables的规则列表中,是一样的。都是:
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

双网卡Iptables端口转发

跳板机A是双网卡,有一个内网IP和一个公网IP
内网IP: 10.0.10.30
外网IP: 58.68.255.123

内网机器:10.0.30.88,可以和10.0.10.30通讯

内网机器需要通过公网去连接ssh,由于这台内网设备没有公网IP所以需要跳板机通过Iptables做端口转发
刚开始用的Iptbales做端口映射命令如下

iptables -t nat -A PREROUTING -p tcp -d 58.68.255.123 --dport 31688 -j DNAT --to-destination 10.0.30.88:22
iptables -t nat -A POSTROUTING -p tcp -d 10.0.30.88 --dport 22 -j SNAT --to-source 58.68.255.123

发现无法通过58.68.255.123:31688去ssh连接这台机器,试了好几次都是如此,开始想是不是因为双网卡原因

查看路由表后发现58.68.255.123并没有到内网10.0.10.0的路由,大概就是这个原因了,
iptables把请求转发到内网10.0.30.88后,10.0.30.88跨网段了无法把包通过58.68.255.123转发回客户端就是连接这台机器的ssh客户端,
因为30.88无法回原,必须通过10.0.10.30转发给58.68.255.123再转发给客户端,大概明白这个道理就该知道怎么做了。

iptables -t nat -A PREROUTING -p tcp -d 58.68.255.123 --dport 31688 -j DNAT --to-destination 10.0.30.88:22
iptables -t nat -A POSTROUTING -p tcp -d 10.0.30.88 --dport 22 -j SNAT --to-source 10.0.10.30

只是下一条命令变了而已,把回原地址更改为内网的了,这样就可以在跳板机上把请求转发给客户端了。
或者用以下命令也可以

iptables -t nat -A PREROUTING -p tcp -i em1 --dport 31688 -j DNAT --to 10.0.30.88:22
iptables -t nat -A POSTROUTING -j MASQUERADE

效果是一样的,需要指定网卡,em1为外网网卡

以上第一次命令不生效原因主要还是跨网段的原因,30跨到10,导致这个问题,如果公网IP转发端口的这台机器内网IP也在30段,那么第一条命令是可以生效的。

nanopi neo利用iptables实现中继(中转/端口转发) 对于之前已失效的文章最大限度重现
iptables -m参数的含义
双网卡Iptables端口转发
IPTABLES 命令、规则、参数详解


扫描二维码,在手机上阅读!

添加新评论