iptables 端口转发设置

发布时间 2023-09-14 11:48:16作者: sky_cheng

一、iptables命令

查看当前iptables的nat表内的规则

-t nat指定看nat表,不用-t默认为filter表

-L 列出表内所有规则,可以指定特定链

-n 使输出中的IP地址和端口以数值的形式显示

-v 输出详细化

--line 显示出每条规则在相应链中的序号

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8078 to:172.28.17.220:8078

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination   

可以看到NAT表有很多类型的链chain,每个链内有很多规则rule,不同的链代表的转发功能不一样

PREROUTING链的作用是在包刚刚到达防火墙时改变它的目的地址,是从外部连接过来时的转发OUTPUT链改变本地产生的包的目的地址,是本机连接时的转发

POSTROUTING链在包就要离开防火墙之前改变其源地址

想实现端口转发,必须编辑sysctl.conf配置文件开启内核转发,需要管理员权限

vim /etc/sysctl.conf

开启ipv4 forward

net.ipv4.ip_forward = 1

我们想实现端口转发,主要是用nat表的上面三个链实现该功能

-t 指定配置表

-A 链中添加规则

-D 删除链中规则

-C 修改链中规则

-j target 决定符合条件的包到何处去,

target模式很多

一、转发本机端口到本机其他端口

REDIRECT模式是防火墙所在的机子内部转发包或流到另一个端口,也就是所有接收的包只转发给本地端口它只能用在nat表的PREROUTING、OUTPUT链 ,并有一个--to-ports选项

通过PREROUTING链,将外网访问7000端口转发到本机80端口,此时本机访问7000并不进行转发

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A PREROUTING -p tcp --dport 7000 -j REDIRECT --to-ports 80
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:7000 redir ports 80

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         

 

二、分流本机端口到本机其他端口

通过PREROUTING链,将172.28.146.0/24网段访问7000端口的包转发到本机80端口,其他网段则正常访问7000端口

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A PREROUTING -p tcp -s 172.28.146.0/24 --dport 7000 -j REDIRECT --to-ports 80
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:7000 redir ports 80
2    REDIRECT   tcp  --  172.28.146.0/24      0.0.0.0/0            tcp dpt:7000 redir ports 80

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination  

三、删除指定规则

先使用-nL --line-number参数查看需要删除的规则ID,然后使用iptables -D 删除

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line-number
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:7000 redir ports 80
2    REDIRECT   tcp  --  172.28.146.0/24      0.0.0.0/0            tcp dpt:7000 redir ports 80

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination 

需要删除NAT表的PREROUTING链里的num为1 的规则:1 REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:7000 redir ports 80

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -D  PREROUTING 1

再次查看

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line-number
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    REDIRECT   tcp  --  172.28.146.0/24      0.0.0.0/0            tcp dpt:7000 redir ports 80

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination  

已删除

四、清空nat规则

[root@hlcc ~]# iptables -t nat -F
[root@hlcc ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (0 references)
target     prot opt source               destination         
[root@hlcc ~]# 

 

五、本机端口转发到后端其他服务器的服务端口

DNAT:目的地址转换,将指定端口的入向过来的数据包里的目标IP和端口设置为后向服务器IP和端口,只能用在nat表的PREROUTING和OUTPUT链,--to-destination选项

SNAT:源地址转换,将目标地址为后向服务器IP的出向数据包里的源地址修改为转发服务器IP地址,后向服务器是不能直接回包到客户端的,所以需要改为转发服务器的P地址。
只能用在nat表的POSTROUTING链,--to-source选项

1、通过PREROUTING链,将访问本机的7000端口入向数据包的目标地址修改为172.28.17.220的8078端口

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A PREROUTING -p tcp --dport 7000 -j DNAT --to-destination 172.28.17.220:8078
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line      
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  0.0.0.0/0            172.28.17.230        tcp dpt:7000 to:172.28.17.220:8078

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
[root@localip hlcc_v11.1104_centos7]# 

 

2、通过POSTROUTING链,将目标地址为172.28.17.220:8078端口出向数据包的源地址修改为转发服务器IP

[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A POSTROUTING --dst 172.28.17.220 -p tcp --dport 8078 -j SNAT --to-source 172.28.17.230
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  0.0.0.0/0            172.28.17.230        tcp dpt:7000 to:172.28.17.220:80

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    SNAT       tcp  --  0.0.0.0/0            172.28.17.220        tcp dpt:8078 to:172.28.17.230
[root@localip hlcc_v11.1104_centos7]# 

如果不添加POSTROUTING链的SNAT规则,那么在后端服务器上收到的数据包的源IP地址不是转发服务器的地址,而是客户端的地址,这样服务端回包的时候不能回到转发服务器上。

 iptables的端口转发,不会在转发服务器上建立连接,而是客户端和后向服务器端直连,只不过修改数据包的地址而已。在转发服务器上看不到连接。