一、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.放行转发命令
#eth0改为实际使用网卡(一般是eth0)
# 放行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端口转发实现过程的坑
1.服务器为云服务器时,源端、目的端防火墙or安全组需要进行放开
2.配置完端口转发规则后需要放开网卡的数据转发规则,步骤6
3.主机的内核转发配置是否放开,步骤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