一、iptables介绍
iptables服务是用户管理内核空间的iptables的管理工具,通过iptables书写内核空间的iptables策略
iptables的规则是至上而下的读取方式,遇到与数据包信息匹配的规则后直接采用
iptables的规则默认保存在内存中,如果需要永久保存需要把策略以字符的形式保存到/etc/sysconfig/iptables中
二、iptables命令的语法格式及常用参数
语法格式如下:
iptables -t 表名 <-A/I/D/R> 规则链名[规则号] <-i/o 网卡名> -p 协议名 <-s 源ip/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
常用参数如下:
参数 | 说明 |
-t | 对指定的表进行操作,table必须是raw,nat,filter,mangle中的一个。默认是filter表。 |
-p | 指定要匹配的数据包协议类型 |
-S | -source address/mask:把指定的一个或者一组地址作为源地址,按此规则进行过滤。当后面没有mask时,address是一个地址,比如:192.168.1.1;当mask指定时,可 以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0 |
-d | --destinationaddress/mask:地址格式同上,但这里指定地址为目的地址,按此进行过滤 |
-i | --in-interface name:指定数据包的来自来自网络接口,比如最常见的eth0。注意:它只对INPUT,FORWARD,PREROUTING这三个链起作用。如果没有指定此选项,说明 可以来自任何一个网络接口。同前面类似,"!"表示取反 |
-0 | ---0ut-interfacename:指定数据包出去的网络接口。只对OUTPUT,FORWARD,POSTROUTING三个链起作用 |
-L | --list[chain]列出链chain上面的所有规则,如果没有指定链,列出表上所有链的所有规则 |
-A | --append chain rule-specification:在指定链chain的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定 |
-i | --insert chain[rulenum]rule-specification:在链chain中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号 |
-D | --delete chain rule-specification -D,-delete chain rulenum:在指定的链chain中删除一个或多个指定规则 |
-R num | Replays替换/修改第几条规则 |
-P | --policy chain target:为指定的链chain设置策略target。注意,只有内置的链才允许有策略,用户自定义的是不允许的 |
-F | --flush[chain]清空指定链chain上面的所有规则。如果没有指定链,清空该表上所有链的所有规则 |
-N | --new-chain chain用指定的名字创建一个新的链 |
-X | --delete-chain[chain]:删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链 |
-E | --rename-chain old-chain new-chain:用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响 |
-Z | --zero[chain]:把指定链,或者表中的所有链上的所有计数器清零 |
-j | --jump target<指定目标>:即满足某条件时该执行什么样的动作。target可以是内置的目标,比如ACCEPT,也可以是用户自定义的链 |
-h | 显示帮助信息 |
三、firewalld服务管理方式与iptables的管理方式区别
iptables是基于Linux内核的Netfilter子系统构建的,直接操作Netfilter; 而firewalld则通过libnftables库与Netfilter交互,提供了一个更高的抽象层
iptables使用基于表的规则集,包括filter、nat、mangle、raw及securty五个表;firewalld采用基于区域的规则集,包括default、public、internal、external和dmz五个区域
iptables的配置较为复杂,需要用户掌握特定的命令行语法;firewalld提供了更直观和灵活的配置方式,支持命令行和图形界面
由于firewalld通过libnftables库与Netfilter交互,其性能相对于直接操作Netfilter的iptables来说较低。
由于firewalld通过libnftables库与Netfilter交互,其性能相对于直接操作Netfilter的iptables来说较低。
四、实验环境
主机名 网卡 用途
node1 nat-172.25.254.10 外网主机
node2 nat-172.25.254.100 路由器
hostonly-192.168.0.100
node3 hostonly-192.168.0.10 内网主机
五、iptables启用
[root@node2 ~]# dnf install iptables-nft-services.noarch -y
[root@node2 ~]# systemctl start iptables.service
[root@node2 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
六、三张表五条链
Iptables是基于Netfilter框架实现的报文选择系统
iptables用于报文的过滤、网络地址转换和报文修改等功能
Iptables本质上是包含了5个规则表,而规则表则包含了一些列的报文的匹配规则以及操作目标
1、raw表:
第一优先级的表,设置raw表规则后,不会对数据包进行链接跟踪和NAT转换,使用于
PREROUTING和OUTPUT链,对应的动作为NOTRACK。
2、mangle表:
第二优先级的表,根据规则,修改数据包的TOS(Type Of Service,服务类型)、TTL(TimeToLive,生存周期)以及设置Mark标记,以实现Qos以及策略路由等。
3、nat表:
第三优先级的表,网络地址转换表,用于修改源和目的的地址,分SNAT(源目的地址转换)和DNAT(目的地址转换)。
4、filter表:
第四优先级的表,用于控制到达链(forward链、input链、output链)上的数据包,是放行(accepte)、丢弃(drop)或者拒绝(reject)。
5、security表:
最不常用的表(通常,我们说iptables只有4张表,security表是新加入的特性),用于在数据包上应用SELinux。
NFIPPREROUTING:位于路由之前,报文一致性检查之后(报文一致性检查包括:报文版本、报文长度和checksum
NF_IP_LOCAL_IN:位于报文经过路由之后,并且目的是本机的
NF_IP_FORWARD:位于在报文路由之后,目的地非本机的。
NF_IP_LOCAL_OUT:由本机发出去的报文,并且在路由之前。
NF_IP_POST_ROUTING:所有即将离开本机的报文
七、filter表
在本机设定apache只能被192.168.0.0/24网段访问
[root@node2 ~]# echo 172.25.254.100 > /var/www/html/index.html
[root@node2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@node2 ~]# iptables -I INPUT 5 -p tcp --dport 80 -s 192.168.0.0/24 -m state --state new -j ACCEPT
[root@node2 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 192.168.0.0/24 0.0.0.0/0 tcp dpt:80 state NEW
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
测试
[root@node1 ~]# curl 172.25.254.100
curl: (7) Failed to connect to 172.25.254.100 port 80: 没有到主机的路由
[root@node3 ~]# curl 192.168.0.100
172.25.254.100
八、nat表
1.内网访问外网
[root@node3 ~]# ping 172.25.254.10
ping: connect: 网络不可达
#设定网关
[root@node3 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@node3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@node3 ~]# nmcli connection reload
[root@node3 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@node3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
在双网卡主机中设置出战策略
把所有从此主机中出去的数据包来源都转换成eth0网卡的ip
[root@node2 ~]# iptables -D FORWARD 1
[root@node2 ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
[root@node2 ~]# 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
SNAT all -- 0.0.0.0/0 0.0.0.0/0 to:172.25.254.100
#打开内核路由功能
[root@node2 ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
[root@node2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@node2 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@node2 ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
测试
[root@node3 ~]# ping 192.168.0.100
PING 192.168.0.100 (192.168.0.100) 56(84) 比特的数据。
64 比特,来自 192.168.0.100: icmp_seq=1 ttl=64 时间=0.292 毫秒
[root@node1 ~]# w -i
11:37:55 up 1:36, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 10:02 1:35m 0.01s 0.01s -bash
root pts/0 172.25.254.1 10:32 2.00s 0.04s 0.00s w -i
root pts/1 172.25.254.100 11:37 6.00s 0.00s 0.00s -bash
2.外网访问内网
[root@node3 ~]# ping 192.168.0.100
PING 192.168.0.100 (192.168.0.100) 56(84) 比特的数据。
64 比特,来自 192.168.0.100: icmp_seq=1 ttl=64 时间=0.292 毫秒
[root@node1 ~]# w -i
11:37:55 up 1:36, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 10:02 1:35m 0.01s 0.01s -bash
root pts/0 172.25.254.1 10:32 2.00s 0.04s 0.00s w -i
root pts/1 172.25.254.100 11:37 6.00s 0.00s 0.00s -bash
测试
[root@node1 ~]# ssh -l root 172.25.254.100
Activate the web console with: systemctl enable --now cockpit.socket
Register this system with Red Hat Insights: rhc connect
Example:
# rhc connect --activation-key <key> --organization <org>
The rhc client and Red Hat Insights will enable analytics and additional
management capabilities on your system.
View your connected systems at https://console.redhat.com/insights
You can learn more about how to register your system
using rhc at https://red.ht/registration
Last login: Tue Jul 21 10:33:22 2026 from 192.168.0.1
[root@node3 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:1e:58:f3 brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::575a:d7ac:c15a:3503/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@node3 ~]#