Iptables

Iptables简介

​ Netfilter/Iptables 是一个包过滤防火墙系统。Netfilter 是 Linux 内核的一个子系统,采用模块化设计,具有良好的可扩充性。Iptables 工具模块能让用户通过它去调用 Netfilter 内核,并允许使用者对数据报进行过滤、地址转换、处理等操作。Iptables 是有状态防火墙。

有状态防火墙和无状态防火墙

有状态防火墙

​ 有状态防火墙会检查数据包中的所有内容、数据特征以及数据的通信通道,还会检查数据包的行为,如果发现任何异常,可以过滤掉可疑数据。此外,有状态防火墙可以跟踪数据的行为方式,对行为模式进行编录。

无状态防火墙

​ 无状态防火墙利用数据包的来源、目的地和其他参数来查明数据是否会构成威胁。这些参数必须由管理员或制造商通过他们事先设置的规则输入。

Netfilter/Iptables的状态信息

​ netfilter/iptables 有四种有效状态分别为: established(建立)、invalid(无效)、new(新)、related(相关的)。

established

​ 状态 established 指出该信息包属于已建立的连接,该连接一直用于发送和接受信息包并且完全有效。

invalid

​ 状态 invalid 指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。

new

​ 状态 new 意味着该信息包已经或将启动新的连接,或者它尚未用于发送和接受信息包的连接相关联。

​ 状态 related 表示该信息包正在启动新连接,以及它与已建立的连接相关联。

Netfilter实现

​ Netfilter 主要通过表、链实现规则。Netfilter 中包含表,表中包含链,链中包含规则,最终形成对数据报处理规则的实现。

规则(rules)

​ 规则(rules) 其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理这个数据包”。这些规则分别指定了源地址、目的地址、传输协议 (如TCP、UDP、ICMP) 和服务类型 (如HTTP、FTP和SMTP) 等。当数据包与规则匹配时,Iptables 就根据规则所定义的方法来处理这些数据包,如放行 (accept)、拒绝 (reject) 和丢弃 (drop) 等。配置防火墙的主要工作就是添加、修改和删除这些规则。

链(chains)

​ 链(chains) 是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或者数条规则。

表(tables)

​ 表(tables) 提供特定的功能,Iptables 内置了4个表,即 raw 表、filter 表、nat 表和 mangle 表,分别用于实现包过滤,网络地址转换和包重构的功能。

![](https://lsky.happyladysauce.cn/i/2025/04/06/1/iptable tables.webp)

Iptables命令

1
2
iptable [-t 表] -命令 匹配 操作
#默认iptable使用filter表

点击并拖拽以移动

命令

1
2
3
4
5
6
7
8
9
10
-P  --policy        <链名>  定义默认策略
-L --list <链名> 查看iptables规则列表
-A --append <链名> 在规则列表的最后增加1条规则
-I --insert <链名> 在指定的位置插入1条规则
-D --delete <链名> 从规则列表中删除1条规则
-R --replace <链名> 替换规则列表中的某条规则
-F --flush <链名> 删除表中所有规则
-Z --zero <链名> 将表中数据包计数器和流量计数器归零
-X --delete-chain <链名> 删除自定义链
-v --verbose <链名> 与-L他命令一起使用显示更多更详细的信息

点击并拖拽以移动

规则

1
2
3
4
5
6
7
-i --in-interface    网络接口名>     指定数据包从哪个网络接口进入,
-o --out-interface 网络接口名> 指定数据包从哪个网络接口输出
-p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source 源地址或子网> 指定数据包匹配的源地址
--sport 源端口号> 指定数据包匹配的源端口号
--dport 目的端口号> 指定数据包匹配的目的端口号
-m --match 匹配的模块 指定数据包规则所使用的过滤模块

点击并拖拽以移动

动作

1
2
3
4
5
6
7
8
REJECT    阻拦数据包,并返回数据包通知对方。
返回的数据包有几个选择:
#1 ICMP port-unreachable
#2 ICMP echo-reply
#3 tcp-reset (这个数据包会要求对方关闭联机)
执行完此动作后将不再对比其他规则,直接中断过滤程序

iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply

点击并拖拽以移动

1
DROP    丢弃数据包不予处理,执行完此动作后将不再对比其他规则,直接中断过滤程序

点击并拖拽以移动

1
2
3
REDIRECT    将封包重定向到另一个端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081

点击并拖拽以移动

1
2
3
4
MASQUERADE    改写封包来源IP为防火墙IP,可指定port对应的范围
执行完此动作后,直接跳往下一个规则链

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

点击并拖拽以移动

1
2
3
4
5
LOG    将数据包相关信息记录在 /var/log 中
详细位置可以查看 /etc/rsyslog.conf 配置文件
执行完此处理动作后,将会继续对比其他规则

iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"

点击并拖拽以移动

1
2
3
4
SNAT    改写封包来源IP为某特定IP或范围IP,可以指定port对应的范围
执行完此动作后,将直接跳往下一个规则链

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200

点击并拖拽以移动

1
2
3
4
DNAT    改写数据包目的IP为某特定IP或IP范围,可以指定port对应的范围
进行完此处理动作后,将会直接跳往下一个规则链

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100

点击并拖拽以移动

1
2
MIRROR    镜像数据包,将来源IP与目的IP对调后,将数据包返回
进行完此处理动作后,将会中断程序

点击并拖拽以移动

1
QUEUE    中断过滤程序,将封包放入队列,交给其它程序处理

点击并拖拽以移动

常用服务和其端口

协议名 端口号 协议名 端口号 协议名 端口号 协议名 端口号
FTP 20/tcp SMTP 25/tcp TFTP 69/udp SMTP SSL 465/tcp
FTP 21/tcp DNS 53/tcp/udp HTTP 80/tcp IMAP SSL 993/tcp
SSH 22/tcp DHCP 67/udp POP3 110/tcp POP3 SSL 995/tcp
Telnet 23/tcp DHCP 68/udp IMAP 143/tcp

还有一些端口是局域网互联和文件传输相关的:137,138,139,444,445,3358。

不清楚的端口4500-5000

赛题

SNAT规则

源地址为内网地址的IP经过外网网卡ens37时转换为外网地址。

1
2
[root@routersrv ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens37 -j MASQUERADE 
[root@routersrv ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens37 -j MASQUERADE

点击并拖拽以移动

DNAT规则

实现外网访问网关设备映射到内网服务器上。

AppSrv

1
2
[root@routersrv ~]# iptables -t nat -A PREROUTING -d 81.6.63.254 -p udp --dport 53 -j DNAT --to 192.168.100.100
[root@routersrv ~]# iptables -t nat -A PREROUTING -d 81.6.63.254 -p tcp -m multiport --dport 53,80,443,465,993 -j DNAT --to 192.168.100.100

点击并拖拽以移动

StorageSrv

1
[root@routersrv ~]# iptables -t nat -A PREROUTING -d 81.6.63.254 -p tcp -m multiport --dport 20,21,137,138,139,444,445,3358,4500:5000 -j DNAT --to 192.168.100.200

点击并拖拽以移动

默认拒绝和放行必要流量通行

1
2
3
[root@routersrv ~]# iptables -P INPUT DROP
[root@routersrv ~]# iptables -P FORWARD DROP
[root@routersrv ~]# iptables -P OUTPUT DROP

点击并拖拽以移动

1
2
3
4
5
[root@routersrv ~]# iptables -A INPUT -p tcp -m multiport --dport 22 -j ACCEPT
[root@routersrv ~]# iptables -A INPUT -p udp -m multiport --dport 67,68 -j ACCEPT
[root@routersrv ~]# iptables -A FORWARD -p udp -m multiport --dport 53 -j ACCEPT
[root@routersrv ~]# iptables -A FORWARD -p tcp -m multiport --dport 20,21,53,80,443,137,138,139,444,445,3358,4500:5000,465,993 -j ACCEPT
[root@routersrv ~]# iptables -A OUTPUT -p udp -m multiport --dport 67,68 -j ACCEPT

点击并拖拽以移动