开启内核转发
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 命令、规则、参数详解