使用 iptables 进行端口转发
笔者在网上找了些代码,大部分都没有成功。后面根据网上的博文测试,最终调通~~~
这里使用三台 CentOS7 虚拟机进行测试。分别是A(192.168.187.153)、B(192.168.187.152)、C(192.168.187.142)
A上面启动了nginx,监听8000端口,上下文 /test
B上面配置iptables端口转发
C上面进行最终测试
最终的访问链路
C ---> B (port 8888) ---> A (port 8000)
-
在A上面请求本地8000端口,确保后端服务可以正常访问。注意防火墙要允许外部计算机网络本地8000端口,笔者
这里关闭掉了防火墙,方便测试。
- 在B上面配置iptables等内容
vim iptab.sh
#!/bin/bash
iptables -t nat -A PREROUTING -d 192.168.187.152 -p tcp --dport 8888 -j DNAT --to-destination 192.168.187.153:8000
iptables -t nat -A POSTROUTING -d 192.168.187.153 -p tcp --dport 8000 -j SNAT --to-source 192.168.187.152
:x 保存退出执行 sh iptab.sh
PREROUTING链的作用是数据到达防火墙时改变目的地址,POSTROUTING链的作用是离开防火墙时改变源地址。
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
:x 保存退出执行 sysctl -p
开启内核转发
# 放行FORWARD数据包
# 笔者虚拟机使用的是ens33网卡的IP
iptables -I FORWARD -i ens33 -j ACCEPT
FORWARD 解释:在 Linux 的 iptables 防火墙中,FORWARD 链是用于处理转发的数据包的一个默认链。当一台 Linux 主机作为路由器或网关时,它会转发经过它的数据包,这些数据包会经过 FORWARD 链进行处理。iptables 的 FORWARD 链通常用于控制传入或传出系统的数据包是否允许转发。
# 查看iptables nat转发链路
iptables -t nat --list --line
注意这里并未保存iptables的配置,如果重启iptables服务就失效了。如果安装有 iptables-service,可以使用
service iptables save 来持久化配置
- 最后我们在C上面进行测试
curl -XGET http://192.168.187.152:8888/test -i
OK,测试成功!
注意第二步里面配置 PREROUTING 和 POSTROUTING 必不可少,配置内核转发也需要,最后还需要配置 FORWARD 链路规则,之前笔者没有配置 FORWARD,一直不成功,最后调整以后就可以了。