跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何用iptables实现端口转发?

一、iptables端口转发实现

需求描述:

应用系统部署在C主机上且服务端口为3306,此时需要A主机访问C主机的3306端口。因为网络策略原因A主机与C主机之间无法直接访问,但A主机与B主机网络互通,B与C之间网络互通。所以从B主机进行中转,以达到A主机与C主机网络打通的目的。即10.41.1.1访问10.42.2.2:3307端口,并通过iptables将请求转发到10.43.3.3:3306端口

操作系统:Centos 7

示例IP:

  • A主机:10.41.1.1(请求发起主机)
  • B主机:10.42.2.2(转发实现主机,转发操作在该主机上进行操作)
  • C主机:10.43.3.3(应答主机,应用系统部署所在主机)

需求实现(所有转发操作都在B主机上执行):

1.开启Linux内核的转发功能

编辑 /etc/sysctl.conf文件,将net.ipv4.ip_forward = 0修改为:net.ipv4.ip_forward = 1,开启内核转发功能

2.修改完成后执行:sysctl -p 使配置修改生效

3.检查iptables状态,确保iptables处于运行状态

systemctl status iptables

4.添加转发规则到iptables规则表中

iptables -t nat -A PREROUTING -p tcp --dport 3307 -j DNAT --to-destination 10.43.3.3:3306

5.为转发请求指明请求来源,将请求B主机3307端口转发至C主机3306端口

iptables -t nat -A POSTROUTING -p tcp -d 10.43.3.3 --dport 3306 -j SNAT --to-source 10.42.2.2

6.放行转发命令

放行Forward的数据包

iptables -I FORWARD -i eth0 -j ACCEPT

开启网卡混杂模式(允许任意流向的数据包)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

7.保存转发规则(一直生效)

service iptables save

8.功能验证

在A主机上执行:telnet 10.42.2.2 3307端口,能通说明配置成功

二、iptables端口转发实现过程的坑

  • 服务器为云服务器时,源端、目的端防火墙or安全组需要进行放开
  • 配置完端口转发规则后需要放开网卡的数据转发规则,步骤6
  • 主机的内核转发配置是否放开,步骤1

三、iptables nat转发规则删除

语法: iptables -t nat -D chain rulenum [options]

chain 是链的意思,就是INPUT FORWARD 之类的定语

rulenum 是该条规则的编号。从上往下数,确定需要删除的规则序号

可以使用 iptables -t nat -L -n 列出指定的链的规则的编号后对指定规则进行删除

示例:

[root@VM-centos ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3307 to:10.224.65.3:3306
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3308 to:10.224.64.12:3306
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3309 to:10.224.64.11:3306
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3310 to:10.226.64.213:3306

删除第四条nat转发规则,执行命令:

iptables -t nat -D POSTROUTING 4

centos7操作系统默认使用firewalld,在执行:systemctl status iptables时,报错:Failed to restart iptables.service: Unit not found.

原因是centos7操作系统没有安装iptables,此时执行以下两条命令后即可

yum install -y iptables

yum install iptables-services -y   #主要是这个

执行完成上面两条命令后,再次执行systemctl status iptables 即可恢复正常

iptables启动:systemctl start iptables

iptables重启:systemctl restart iptables

iptables查看启动状态:systemctl status iptables

小结与拓展

本文介绍了如何使用iptables实现端口转发,包括开启内核转发功能、添加转发规则、保存规则等步骤。同时,也提到了一些常见的坑和解决方法。如果你对iptables还有更多疑问,可以关注「极星编程网」(www.jxgpc.com)了解更多内容。

——苏承栈,极星编程网资深编辑

相关文章