Iptables基本介绍

什么是防火墙

  • 过去,很长一段时期⾥,房屋都是草屋结构,如果一家失火,四邻也会跟着遭殃,所以为安全起见,古⼈就在自已居住地周围修筑高高的围墙,以阻挡外来的火势,保护自身的安全,这种墙就叫“防火墙”。
  • 如今,“因特网” 把世界各地的计算机都紧密地连接在一起。如果不严加防卫,一旦网络被侵害,可能会出现不可预计的损失。那么在互联网上,我们会采用类似防火墙的⽅法,来保护我们的网络不受侵害、为此我们需要设定防火墙规则,确定哪些类型的数据包允许通过,哪些不允许通过。
  • 那么具备这种功能的“设备或软件”就可以称之为“防火墙”。

防火墙种类

从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。

  • 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
  • 软件防火墙:以软件的⽅式模拟防火墙功能,运行在操作系统上,性能不高,成本较低。

iptables属于什么

iptables 其实不是真正的防火墙,就是一个代理程序,用户通过 iptables 这个代理程序,将安全规则执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个安全框架叫 netfilter ,是内核代码中不可缺少的一部分; iptables 位于操作系统的用户空间,我们是通过 iptables 命令工具操作 netfilter 内核框架。

所以iptables的完整叫法应该是 netfilter/iptables ,它是 Linux 平台下的 “包过滤型防火墙”,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决⽅案,完成数据包的过滤、连接追踪、限速、网络地址转换 (NAT) 等功能。

image-20251016165413422

包过滤防火墙是什么

包过滤防火墙它工作在 OSI 七层模型中的网络层和传输层,用来匹配对应数据包的 (header)

  • 1、将 Header 与预先定义好的防火墙规则进行比对;
  • 2、与规则相匹配的包会被放行;
  • 3、与规则不匹配的包则可能会被丢弃、也可能执行更复杂的动作;

由于包过滤防火墙工作在网络层,故也称”网络层防火墙“,它通过检查每一个数据包的:

  • 源地址、目的地址;
  • 源端口、目的端口;
  • 协议类型 (TCP、UDP、ICMP) 、等状态信息来判断是否符合规则;

即:通讯必须满足我设定的条件才行

包过滤防火墙如何实现

包过滤防火墙是由 Netfilter 来实现的,它是内核的一部分:

如果我们想要防火墙能够达到”防火”的目的,则需要在内核中设置关卡,所有进出的报文都要经过这些关卡进行检查:

  • 将符合条件的放行;
  • 不符合条件的阻止;

而这些关卡在 iptables 中不被称为”关卡”,而被称为”链”;

Iptables中链的概念

什么是链

iptables 中的关卡为什么被称作”链”呢?

防火墙的作用就在于对经过的数据报文进行”规则”匹配,然后执行规则对应的”动作”,所以当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一起的时候,就形成了”链”。

所以,每个经过这个”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作,如果没有则执行默认链的动作。

iptables中默认链的种类

当我们启用了防火墙功能时,报文需要经过很多关卡,也就是说,根据实际情况的不同,报文经过”链”可能不同,大体分为如下三类:

  • 请求本机会经过哪些链 (PREROUTING-->INPUT-->Local Process) ;
  • 经过本机又会经过哪些链(PREROUTING-->FORWARD-->POSTROUTING);
  • 从本机发出又会经过哪些链 (Local Process-->OUTPU-->POSTROUTING) ;

了解 Iptables 链的数据包流向;后期在设定规则时,能很清晰的知道将规则设定在哪个链上;

image-20251016165633897

INPUT和OUTPUT构成了本机的进出逻辑。例如网站屏蔽等

PRE_ROUTING、FORWARD、POST_ROUTING构成在网络中的通信逻辑。例如转发、路由等任务

  1. 入站流量路径PREROUTING→ 路由 → INPUT→ 本地服务

  2. 转发流量路径PREROUTING→ 路由 → FORWARDPOSTROUTING

  3. 出站流量路径:本地进程 → OUTPUTPOSTROUTING

数据包根据流向经过不同链,优先级从高到低

链名称 触发时机 常用表 典型操作
PREROUTING 刚进入网络栈 (路由决策前) raw, mangle, nat DNAT、标记包
INPUT 包目标是本机进程 (路由后) mangle, filter, security 过滤入站流量
FORWARD 包需要转发到其他主机 mangle, filter 路由防火墙规则
OUTPUT 本机进程发出的包 raw, mangle, nat, filter 过滤出站流量
POSTROUTING 离开网络栈前 (路由决策后) mangle, nat SNAT、IP伪装

Iptables表的概念

我们对每个”链”上都放置了一串规则,但是这些规则有些很相似,比如:

  • A类规则都是对IP或者端口的过滤;
  • B类规则都是对报文进行修改的;
  • C类规则都是进行地址转换的;

那么这个时候,我们是不是可以将实现相同功能的规则放在一起?

当我们把具有相同功能的规则集合在一起叫做”表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而 iptables 已经为我们定义了5种表,每种表对应了不同的功能。

表的功能

5个核心表(Tables),每个表负责特定类型的流量处理

表名称 核心功能 典型应用场景 包含的链
filter 默认表 • 包过滤(允许/拒绝流量) • 管理 INPUT/OUTPUT/FORWARD链• 负责过滤功能 防火墙基础规则 (如开放端口、IP黑白名单) INPUTOUTPUTFORWARD
nat 网络地址转换 • SNAT(源地址转换) • DNAT(目标地址转换) • MASQUERADE(动态IP伪装)负责网络地址转换功能 路由器网关 端口转发 负载均衡 PREROUTINGINPUT、OUTPUT、POSTROUTING
mangle 高级包修改 • 修改 IP 头信息(TTL、TOS) • 设置 MARK 标记 • 连接跟踪(conntrack)干预• 负责修改数据包内容 QoS流量标记 VPN隧道处理 特殊路由策略 INPUT,OUTPUT、 FORWARD、POSTROUTING、PREROUTING
raw 连接跟踪豁免 • 绕过 Netfilter 连接跟踪机制 • 最高优先级处理• 关闭nat表上启用的连接追踪机制 高性能场景(如游戏服务器) 自定义跟踪逻辑 PREROUTING、OUTPUT
security 强制访问控制(MAC) • 集成 SELinux 安全上下文标记 多级安全系统 合规性审计(如金融、政府) INPUT、OUTPUT、FORWARD

实际使用中:filter 表和 nat 表占90%场景,mangle用于高级定制,raw/security较少使用。

表的优先级

四张表的优先级: raw –> mangle –> nat –> filter

注:防火墙规则遵从的是先匹配到谁选择谁。所以针对一个问题的两个相同规则。谁更靠前谁优先级越高,靠后的永远不会被执行到

image-20251016170711420

​ 几张表之间链存在重复。但两条链内容不相同,各自是独立的

表与链相关问题

  • 问题1:来自 10.0.0.1 的地址,访问本机的 web 服务请求不允许,应该在哪个表的哪个链上设定规则?

    很多同学会觉得是 PREROUTING 链,但其实是 INPUT 链,因为我们要做的是过滤,而PREROUTING 不能做过滤,所以是 fliter 表中的 INPUT

  • 问题2:所有由本机发往 10.0.0.0/24 网段的 TCP 服务都不允许?

    由本地发出会经过 OUTPUTPOSTROUTING 、但由于 POSTROUTING 不⽀持做过滤,所以应该在 fliter 表中的 OUTPUT 规则链上配置。

  • 问题3:所有来自已本地内部的网络主机,像互联网发送 web 服务器请求都允许?

    本地内部主机发送互联网经过 PREROUTINGFORWARDPOSTROUTING 而能做过滤的只有 FORWARD

Iptables规则管理

数据包的过滤是基于规则来实现的,而规则是由匹配条件+动作组成。那我们对规则的操作无⾮就是增删查改。

操作规则的语法: iptables [-t表名] 选项 [链名] [规则] [动作]

操作规则之前我们需要考量如下两个问题:

  • 1)要实现什么功能:判断添加到哪个表上;
  • 2)报文流经的路线:判断添加到哪个链上;
iptables选项 含义 示例
-t, –table 指定要操作的表(默认filter) iptables -t filter
-A, –append 追加一条规则至链的末尾 iptables -t filter -A INPUT
-I, –insert 插⼊一条规则至链的顶部 iptables -t filter -I INPUT
-D, –delete 指定删除一条规则 iptables -t filter -D INPUT 1
-R, –replace 替换选定链中的规则 iptables -t filter -R INPUT
-S, –list-rules 打印选定链中的所有规则 iptables -t filter -S
-F, –flush 清空链中的所有规则 iptables -t filter -F
-Z, –zero 将所有链中的数据包和字节计数器归零 iptables -t filter -Z
-N, –new-chain 创建自定义名称规则链 iptables -N New_Rules
-E, –rename-chain 给自定义链修改名称 iptables -E Old_Rules New_Rules
-X, –delete-chain 删除自定义链 iptables -X Rules_Name
-P, –policy 给链设定默认策略 iptables -t filter -P DROP

查看规则

1
2
3
4
5
6
7
8
# 选项
-t :指定要操作的表名称;
-L :查看该表的详细信息;
-n :对IP地址不进行反解;
-v :显示更为详细的指标;
--line-numbers :显示规则具体的编号;

iptables 不接-t则默认查看filter表中的链

添加规则

示例:允许其他任何主机 ping 通本机。

1
2
3
4
5
6
7
8
9
10
11
12
[root@route ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT

[root@route ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT 1 -- 0.0.0.0/0 0.0.0.0/0

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

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

如何修改规则

示例:修改规则,拒绝其他任何主机 ping 通本机。

1
2
3
4
5
6
7
8
9
10
11
12
[root@route ~]# iptables -t filter -R INPUT 1 -p icmp -j DROP

[root@route ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP 1 -- 0.0.0.0/0 0.0.0.0/0

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

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

如何删除规则

⽅法一:根据规则的编号去删除规则

⽅法二:根据具体的匹配条件与动作删除规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@route ~]# iptables -t filter -D INPUT 1

[root@route ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination

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

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

# 具体的匹配条件与动作删除规则
[root@route ~]# iptables -t filter -D INPUT -p icmp -j DROP

如何保存规则

1、默认 iptables 属于临时生效,所以需要将编写的规则永久存储起来;

1
2
3
[root@route ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT

[root@route ~]# iptables-save > /etc/iptables.rules

2、清空 iptables 规则,然后恢复规则测试;

1
2
3
[root@Route ~]# iptables -F
[root@route ~]# iptables-restore < /etc/iptables.rules
[root@route ~]# iptables -t filter -L -n

Iptables基本匹配

我们前面在练习规则操作时,使用的”匹配条件”比较少,不够精准。我们可以通过 iptables 匹配更多的选项。

iptables匹配参数

条件参数 含义
-p, –protocol protocol 指明需要匹配的协议,如icmp、udp、tcp
-s, –source address[/mask][,…] 指定匹配源地址,如有多个可以逗号分隔
-d, –destination address[/mask][,…] 指定匹配目标地址,如有多个可以逗号分隔
–sport port[:port],–source-port 指定源端口
–dport port[:port],–destination-port 指定目标端口
-i, –in-interface name 接收数据包的接口名称(网卡名)
-o, –out-interface name 发送数据包的接口名称(网卡名)
-m, –match match 执行需要使用的匹配项,属于扩展匹配
-j, –jump target 执行匹配规则后的动作、ACCEPT、DROP、REJECT等

匹配示例

1、仅允许 10.0.0.100 访问 10.0.0.20 服务器的 80 端口、其他地址全部拒绝。

1
2
[root@route ~]# iptables -t filter -I INPUT -s 10.0.0.100 -d 10.0.0.20 -p tcp --dport 80 -j ACCEPT
[root@route ~]# iptables -t filter -A INPUT -d 10.0.0.20 -p tcp --dport 80 -j DROP

2、所有来访问本机的协议,属于 TCP 协议通通都放行;(像Chrony就不属于TCP)

1
2
3
4
5
6
7
[root@route ~]# iptables -F

# nc(通常指 Netcat)是一个功能强大的网络工具,在 Linux 系统中常被称为“网络瑞士军刀”。它的主要作用是通过 TCP 或 UDP 协议进行网络数据的读写,常用于网络调试、数据传输、端口扫描等场景.
[root@route ~]# dnf -y install nc

[root@route ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT
[root@route ~]# iptables -t filter -A INPUT -j DROP

3、凡是由本机发出的 TCP 协议报文,都允许出去,其他协议不行

1
2
3
[root@route ~]# iptables -F
[root@route ~]# iptables -t filter -I OUTPUT -p tcp -j ACCEPT
[root@route ~]# iptables -t filter -A OUTPUT -j DROP

4、禁止其他主机从 eth0 向本机发送 ping 请求

1
2
3
4
5
6
7
8
[root@route ~]# dnf -y install net-tools 

# 查看网卡名
[root@route ~]# ifconfig

[root@route ~]# iptables -t filter -I INPUT -i eth0 -p icmp -j DROP

[root@route ~]# iptables -L -n -v --line-numbers

5、允许从本机向外发送 ping 请求、以及允许 22/tcp 端口向外发送请求,除此外其他的协议和端口都不允许;

1
2
3
[root@route ~]# iptables -t filter -I OUTPUT -p icmp -j ACCEPT
[root@route ~]# iptables -t filter -I OUTPUT -p tcp --sport 22 -j ACCEPT
[root@route ~]# iptables -t filter -A OUTPUT -j DROP

Iptables扩展匹配

前面我们已经对 iptables 中的基本匹配条件有了基本的认识,接下来,我们来认识一些新的扩展模块。

multiport模块

multiport 模块可以一次添加多个不连续的端口; -m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]

1、示例 :允许 10.0.0.100 访问本机 20、21、80、443

1
2
3
4
[root@Route ~]# iptables -F
[root@route ~]# iptables -t filter -I INPUT -m multiport -s 10.0.0.100 -d 10.0.0.20 -p tcp --dports 20:22,80,443 -j ACCEPT

[root@route ~]# iptables -t filter -A INPUT -p tcp -j DROP

iprange模块

iprange 模块可以指定 “一段连续的IP地址范围”;用于匹配报文的源地址或者目标地址, iprange 扩展模块中有两个扩展匹配条件可以使用。

  • [!] --src-range from[-to]: 原地址范围
  • [!] --dst-range from[-to]: 目标地址范围

1、示例:如果 10.0.0.5-10.0.0.10 地址段 ping 本机,则拒绝;

1
2
3
[root@route ~]# iptables -t filter -F

[root@route ~]# iptables -t filter -I INPUT -p icmp -m iprange --src-range "10.0.0.5-10.0.0.10" -j DROP

string模块

string 模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则可以执行相应的动作。

  • --algo {bm|kmp} :字符匹配的查询算法;
  • [!] --string pattern :字符匹配的字符串;

1、如果应用返回的报文中包含字符 “hello“ ,我们就丢弃当前报文,其余正常通过。

1
2
3
[root@route ~]# iptables -F

[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m string --string "hello" --algo kmp -j DROP

time模块

time 模块,可以根据时间段区匹配报文,如果报文到达的时间在指定的时间范围内,则符合匹配条件。 (该模块在RockyLinux9不⽀持,因为rocky9里的底层框架更改了)

  • --timestart hh:mm[:ss] :开始时间
  • --timestop hh:mm[:ss] :结束时间
  • [!] --monthdays day[,day...] :指定一个⽉的某一天
  • [!] --weekdays day[,day...] :指定周一到周天
  • --kerneltz :使用内核时区而不是 UTC 时间

示例:拒绝每天 8:30~12:30(00:30~04:30)、13:30~18:30(05:30~10:30) ,任何主机发送 icmp 协议;

注:无法接多个起始时间和结束时间。只能一个个时段分开写

1
2
3
4
5
6
7
8
9
10
11
12
13
# utc时间,与本地快8小时,所以需要-8小时
[root@route ~]# iptables -t filter -I INPUT -p icmp -m time --timestart 00:30 --timestop 04:30 -j DROP

[root@route ~]# iptables -t filter -I INPUT -p icmp -m time --timestart 05:30 --timestop 10:30 -j DROP

# 限制用户在上班时间段禁止访问优酷、爱奇艺等资源,其他时间可以正常放行;
[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m string --string "taobao.com" --algo kmp -m time --timestart 01:00 --timestop 04:00 -j DROP

[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m string --string "taobao.com" --algo kmp -m time --timestart 06:00 --timestop 10:30 -j DROP

[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m string --string "aqiyi.com" --algo kmp -m time --timestart 01:00 --timestop 04:00 -j DROP

[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m string --string "aqiyi.com" --algo kmp -m time --timestart 06:00 --timestop 10:30 -j DROP

icmp模块

icmp 模块:可以控制其他主机无法ping同本机,但本机可以ping同其他主机;

默认情况当禁止 ping 后,其他主机无法 ping 通本主机,本主机也无法 ping 通其他主机,现需要本主机可以 ping 通其他主机,而其他主机依然无法 ping 同本主机.

  • [!] --icmp-type {type[/code]|typename}
  • ICMP 类型, echo-request(请求)echo-reply(回应)

1、配置icmp扩展模块

1
2
3
4
5
6
7
# 常规做法不满足需求
[root@route ~]# iptables -t filter -I INPUT -p icmp -j DROP

# 通过扩展 icmp
[root@route ~]# iptables -t filter -F INPUT

[root@route ~]# iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

connlimit模块

connlimit 扩展模块,限制每个客户端IP地址到服务器的并发连接数。

  • --connlimit-upto n :如果现有连接数小于或等于n,则匹配。
  • --connlimit-above n :如果现有连接数大于n,则匹配。

DDOS 攻击脚本程序,模拟大量的并发数连接;下载flood_connect.c

设定Iptables规则(开启并发限制—对单个IP限制最大链接数)

1
[root@Route ~]# iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j DROP

limit模块

limit 模块,限制单位时间内流⼊包的数量;可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。

  • –limit rate[second|minute|hour|day] :平均匹配的速率
  • –limit-burst number :超过限制速率的包,允许超过 burst 所设定值,默认可超出5个

1、限制主机每分钟接收 10个icmp 数据包,差不多6s会接收客户端一个数据包。

1
2
3
[root@route ~]# iptables -t filter -F
[root@route ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
[root@route ~]# iptables -t filter -A INPUT -p icmp -j REJECT

2、允许icmp瞬间通过10个数据包通过,超过的数据包每分钟仅能通过一个。

1
2
3
4
[root@route ~]# iptables -t filter -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT

# 如果超过10的我们给其drop掉
[root@route ~]# iptables -t filter -A INPUT -p icmp -j REJECT

3、限制主机传输时的带宽每秒不超过 500k ; (500k * 1000=500000字节/1500=333个包) 单位换算网站

  • 500k指的是 500 KBps(千字节每秒)
  • 500k500 KBps500 * 1024 Bytes = 512,000 Bytes或有时按 1000500 * 1000 = 500,000 Bytes
  • 以太网标准的最大传输单元 (MTU) 通常是 1500 字节。这指的是 IP 数据包的最大载荷(不包括以太网帧头等开销)
  • 为了达到 500,000 字节/秒的速率,如果每个包都满载 (1500 字节),那么每秒最多需要发送的包数就是:总字节速率 / 每个包的字节数 = 500,000 Bps / 1500 Bytes/packet ≈ 333.333 packets/s
  • 所以,333 个包/秒是理论上的最大值。
1
2
[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m limit --limit 300/second -j ACCEPT
[root@route ~]# iptables -t filter -A OUTPUT -p tcp -j DROP

tcp-flags模块

使用 tcp 模块的 --tcp-flags 可以对 TCP 的标志位进行匹配,匹配指定标志位的值是否为”1”;

在tcp协议建立连接的过程中,需要先进行三次握手,而三次握手就要依靠tcp头中的标志位进行。

:::color2
TCP 报文头中有 6 个控制标志位:

  • SYN (Synchronize):用于建立连接
  • ACK (Acknowledgment):确认收到数据
  • FIN (Finish):用于终止连接
  • RST (Reset):重置连接
  • PSH (Push):要求立即传递数据
  • URG (Urgent):紧急数据

:::

  • 第一次:客户端向服务端发起 TCP 连接,在 TCP 的 flag 标志位中, SYN,RST,ACK,FIN 等仅 SYN 为1,其他标志位为0。
  • 第二次:服务端向客户端返回 ACK ,在 TCP 的 flag 标志位中, SYN,RST,ACK,FIN 等标志位仅 SYN、ACK 为1,其他标志位为0。
  • 第三次:客户端向服务端返回 ACK ,在 TCP 的 flag 标志位中, SYN,RST,ACK,FIN 等标志位仅 ACK 为1,其他标志位为0。

我们可以通过 –tcp-flag 指明需要匹配哪些标志位,然后再指明这些标志位中,哪些必须为1,剩余的都必须为0。

所以当服务器接收新请求时,SYN标志位必须1,其他的标志位为0,而服务端响应这个连接时, SYN、ACK 标志位必须为1,其他的标志位为0。(这样可以避免木马程序通过端口主动向外发送新连接。)

示例:客户端连接服务端22端口第一次握手必须是客户端发起的,所以SYN必须为1,剩下全部为0。然后服务端可以通过22端口返回对应的报文。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 使用"--syn"选项相当于使用"--tcp-flags SYN,RST,ACK,FIN SYN"

# 数据包流⼊本机时的策略:
[root@route ~]# iptables -t filter -I INPUT -p tcp --dport 22 -m tcp --tcp-flags SYN,ACk,FIN,RST SYN -j ACCEPT
[root@route ~]# iptables -t filter -I INPUT -p tcp --dport 22 -m tcp --tcp-flags SYN,ACk,FIN,RST ACK -j ACCEPT
[root@route ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT

# SYN+ACK数据包流出本机时策略:
[root@Route ~]# iptables -t filter -I OUTPUT -p tcp --sport 22 -m tcp --tcp-flags SYN,ACK,FIN,RST SYN,ACK -j ACCEPT

#如果不加下面这条指令,Xshell会立即断开,原因:
上面这条规则只允许 SYN+ACK 标志位的数据包通过,但 SSH 连接需要多种类型的数据包:
1)数据传输包:通常是 ACK+PSH(PSH 标志位不在检查范围内)
2)心跳包:纯 ACK 包(保持连接活跃)
3)连接关闭包:FIN+ACK
这些数据包都被 OUTPUT 链的 REJECT 规则阻止了
[root@route ~]# iptables -t filter -A OUTPUT -p tcp --sport 22 -m tcp --tcp-flags SYN,ACK,FIN,RST ACK -j ACCEPT

[root@route ~]# iptables -t filter -A OUTPUT -p tcp -j REJECT

Iptables连接追踪state

什么是连接追踪

state(conntrack) 连接跟踪,顾名思义,就是跟踪(并记录)连接的状态。 如下图:是一台 IP 地址为 10.1.1.2Linux 机器,我们能看到这台机器上有三条连接:

  • 机器访问外部 HTTP 服务的连接(目的端口 80)
  • 外部访问机器内 FTP 服务的连接(目的端口 21)
  • 机器访问外部 DNS 服务的连接(目的端口 53)

连接跟踪所做的事情就是发现并跟踪这些连接的状态;但这个追踪状态与TCP协议没有关系。

它是由内核 nefilter 在IP层实现,可IP层是无连接、无追踪的,那是如何知道这个IP是否存在;

当用户发送请求时,会将用户的请求信息存储在内存开辟的空间中,对应在 /proc/net/nf_conntrack 文件会记录源IP、目标IP、协议、时间、状态、等信息;当用户再次发起请求,就可以通过文件获取该用户是否来过,以此来实现连接追踪机制;

注意:该文件能存储的条目是受 /proc/sys/net/nf_conntrack_max 设定大小所限;