CentOS 7 iptables 防火墙 SNAT DNAT 用法
iptables 命令基本参数和用法
iptables[-t 表名]命令选项[链名][条件匹配][-j 目标动作或跳转]
说明:
表名链名:用于指定 iptables 命令所操作的表和链
命令选项:用于指定管理 iptables 规则的方式(比如:插入、增加、删除、查看等)
条件匹配:用于指定对符合什么样 条件的数据包进行处理
动作跳转:用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转给其它链处理)
|
参数 |
作用 |
|
-P |
设置默认策略:iptables -P INPUT(DROP|ACCEPT) |
|
-F |
清空规则链 |
|
-L |
查看规则链 |
|
-A |
在规则链的末尾加入新规则 |
|
-I num |
在规则链的头部加入新规则 |
|
-D num |
删除某一条规则 |
|
-s |
匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 |
|
-d |
匹配目标地址 |
|
-i 网卡名称 |
匹配从这块网卡流入的数据 |
|
-o 网卡名称 |
匹配从这块网卡流出的数据 |
|
-p |
匹配协议 如tcp,udp,icmp |
|
--dport num |
匹配目标端口号 |
|
--sport num |
匹配来源端口号 |
首先说说局域网内封包的传送

- 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
- 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
- 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如果内网主机访问外网而经过路由时,源 IP 会发生改变,这种变更行为就是 SNAT。反之当外网的数据经过路由发往内网主机时,数据包中的目的IP(路由器上的公网IP)将修改为内网 IP,这种变更行为就是 DNAT
在 VMware 创建2个虚拟机,环境如下
| 主机 | 名称 | 内网 | 模拟外网 |
| 网关服务器 | kvm200 | ens37:10.1.0.200(HOST) | ens33:192.168.26.200(NAT) |
| 客户机 | kvm201 | ens37:10.1.0.201(HOST) |
拓扑图:

一、kvm200 虚拟机
1、创建 2张网卡:一个NAT模式,一个仅主机模式

[root@kvm200 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.26.200 netmask 255.255.255.0 broadcast 192.168.26.255
inet6 fd15:4ba5:5a2b:1008:c0d8:937d:ed09:c0d5 prefixlen 64 scopeid 0x0<global>
inet6 fe80::8735:cc32:f095:3e11 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:21:2a:53 txqueuelen 1000 (Ethernet)
RX packets 38072 bytes 34377140 (32.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16715 bytes 2201613 (2.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.0.200 netmask 255.255.255.0 broadcast 10.1.0.255
inet6 fe80::8830:37df:81ac:3a00 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:21:2a:5d txqueuelen 1000 (Ethernet)
RX packets 12565 bytes 1468734 (1.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27327 bytes 51224592 (48.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、检查网络互通
# 跟客户机 ens37 端口
[root@kvm200 ~]# ping 10.1.0.201 -c 4
PING 10.1.0.201 (10.1.0.201) 56(84) bytes of data.
64 bytes from 10.1.0.201: icmp_seq=1 ttl=64 time=0.436 ms
64 bytes from 10.1.0.201: icmp_seq=2 ttl=64 time=1.17 ms
64 bytes from 10.1.0.201: icmp_seq=3 ttl=64 time=2.39 ms
64 bytes from 10.1.0.201: icmp_seq=4 ttl=64 time=1.35 ms
--- 10.1.0.201 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3030ms
rtt min/avg/max/mdev = 0.436/1.342/2.399/0.702 ms
# 访问外网
[root@kvm200 ~]# ping www.baidu.com -c 4
PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=128 time=24.5 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=2 ttl=128 time=26.3 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=3 ttl=128 time=23.1 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=4 ttl=128 time=24.6 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3028ms
rtt min/avg/max/mdev = 23.152/24.702/26.397/1.155 ms
3、查看路由
[root@kvm200 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.26.2 0.0.0.0 UG 102 0 0 ens33
10.1.0.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37
192.168.26.0 0.0.0.0 255.255.255.0 U 102 0 0 ens33
二、kvm201 虚拟机
1、创建 1 张网卡:网络选仅主机模式,注意要手动指向 网关服务器 10.1.0.200

vim /etc/sysconfig/network-scripts/ifcfg-ens37
# 省略
......
NAME=ens37
UUID=06bb4b98-8c50-4697-9168-651e5574c32e
DEVICE=ens37
ONBOOT=yes
IPADDR=10.1.0.201
NETMASK=255.255.255.0
GATEWAY=10.1.0.200 # 指向网关服务器
[root@kvm201 ~]# ifconfig
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.0.201 netmask 255.255.255.0 broadcast 10.1.0.255
inet6 fe80::135d:9bb7:e42:d740 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6e:81:b3 txqueuelen 1000 (Ethernet)
RX packets 27742 bytes 32541988 (31.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9728 bytes 1257471 (1.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 25 bytes 2640 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25 bytes 2640 (2.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、查看路由表
(1)这里有一条默认网关,手动添加的命令:route add default gw 10.1.0.200
[root@kvm201 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.1.0.200 0.0.0.0 UG 100 0 0 ens37
10.1.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens37
3、检查网络互通
# 跟网关服务器 ens37 端口
[root@kvm201 ~]# ping 10.1.0.200 -c 4
PING 10.1.0.200 (10.1.0.200) 56(84) bytes of data.
64 bytes from 10.1.0.200: icmp_seq=1 ttl=64 time=0.645 ms
64 bytes from 10.1.0.200: icmp_seq=2 ttl=64 time=1.28 ms
64 bytes from 10.1.0.200: icmp_seq=3 ttl=64 time=1.42 ms
64 bytes from 10.1.0.200: icmp_seq=4 ttl=64 time=1.60 ms
--- 10.1.0.200 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3087ms
rtt min/avg/max/mdev = 0.645/1.240/1.607/0.363 ms
[root@kvm201 ~]#
# 跟网关服务器 ens33 端口
[root@kvm201 ~]# ping 192.168.26.200 -c 4
PING 192.168.26.200 (192.168.26.200) 56(84) bytes of data.
64 bytes from 192.168.26.200: icmp_seq=1 ttl=64 time=0.709 ms
64 bytes from 192.168.26.200: icmp_seq=2 ttl=64 time=1.08 ms
64 bytes from 192.168.26.200: icmp_seq=3 ttl=64 time=0.966 ms
64 bytes from 192.168.26.200: icmp_seq=4 ttl=64 time=1.04 ms
--- 192.168.26.200 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3066ms
rtt min/avg/max/mdev = 0.709/0.950/1.085/0.149 ms
基础环境已经部署完成,现在 kvm 201是不能上网的,接下来我们配置 SNAT,让它可以上网
三、配置 SNAT、DNAT
1、网关服务器上开启转发功能
[root@kvm200 ~]# vim /etc/sysctl.conf
# 添加
net.ipv4.ip_forward = 1
# 生效
sysctl -p
2、网关服务器配置SNAT:源地址转换
能够让多个内网用户通过一个外网地址上网,解决了IP资源匮乏的问题,路由器也就使用此技术,使用 POSTROUTING
(1)如果有外网固定IP(本例)
[root@kvm200 ~]# iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j SNAT --to-source 192.168.26.200
(2)如果是动态 IP
# MASQUERADE(动态伪装),动态 IP 使用
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j MASQUERADE
(3)此时 kvm201 就可以上网了
[root@kvm201 ~]# ping www.baidu.com -c 4
PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=127 time=24.2 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=2 ttl=127 time=35.1 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=3 ttl=127 time=22.1 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=4 ttl=127 time=21.8 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3092ms
rtt min/avg/max/mdev = 21.892/25.842/35.117/5.429 ms
3、网关服务器配置DNAT:目地地址转换
则能够让外网用户访问局域网内不同的服务器,使用 PREROUTING
(1)如果是本机端口跟其它主机端口转发:
访问服务器 2222 端口转到 内网 kvm201机器 22 端口
[root@kvm200 ~]# iptables -t nat -A PREROUTING -d 192.168.26.200 -p tcp --dport 2222 -j DNAT --to-destination 10.1.0.201:22
(2)如果是本机端口转发
# 将发往本机 80 端口流量 转到本机 8080 端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
(3) 宿主机打开 PowerShell 看下是否成功
PS C:\Users\shihua.ma.SBI> ssh root@192.168.26.200 -p 2222
The authenticity of host '[192.168.26.200]:2222 ([192.168.26.200]:2222)' can't be established.
ECDSA key fingerprint is SHA256:kF7UVt4ESc2S9PFATiAJaKLjI9Dvxjp9tsyj5TYuUn4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.26.200]:2222' (ECDSA) to the list of known hosts.
root@192.168.26.200's password:
Last login: Thu Mar 9 11:19:03 2023 from 192.168.26.1
[root@kvm201 ~]#
(4)最后我们来看下网关服务器上面的 iptables中NAT表规则
[root@kvm200 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.26.200 tcp dpt:2222 to:10.1.0.201:22
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
SNAT all -- 10.1.0.0/24 0.0.0.0/0 to:192.168.26.200
其它常用场景
- 到本机应用的数据包:PREROUTING → INTPUT
- 由本机转发数据包:PREROUTING → FORWARD → OUTPUT
- 由本机应用发出的数据包:OUTPUT → POSTROUTING
- 本机作为lvs转发数据包:PREROUTING → INTPUT → IPVS → POSTROUTING
更多推荐
所有评论(0)