在路由之后,被送往本

地之前,mangle数据包

filter

路由判断,要使用的源

地址,外出接口等

filter

最初的路由判断之后,

最后一次更改包的目的

地址之前mangle数据包

filter

在所有更改包的目的地址

操作完成之后mangle数据包

用来改变数据包的生存时间域

一个字节(8个二进制位),一旦经过一个处理它的路由器,

它的值就减1,当该字段的值为0时,报文就被认为是不可转

发的,就会被丢弃

用来设置或改变数据包的服务类型域

8个二进制位组成,包括一个3bit的优先权字段,

4bit的TOS字段和1bit未用位(必须置为0)

iproute2 能识别这些标记,并根据不同的标记决

定不同的路由,可以做款待限制和基于请求的分类

不是包本身的一部分,而是在包穿越计算机过程中由内核

分配的和它关联的一个字段,可以和本地的高级路由功能

连用,以使不同的包能使用不同的队列要求

网络地址转换:转换包

的源或目的地址

只有流的第一个包会被这个链匹配

其后的包会被自动做相同处理

状态( 跟踪连接 )机制

未设置SYN而状态是NEW的包也会通过防火墙

拥有两个或更多的防火墙协同工作成为可能,而且可使数据在服

务器间无丢失的传输,如辅助防火墙可以接受子网的防火墙的操作。

iptables -A  INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK \

-m state --state NEW -j REJECT --reject-with tcp-reset 

丢弃状态是NEW的 SYN/ACK包

防止序列号预测攻击

表示处于 RELATED 状态的包将被防火墙忽略而不进行状态跟踪

除了本地产生的包由 OUTPUT 链处理,所有连接跟踪都是在 PREROUTING 链中进行处理的

conntrack记录读取:

/proc/net/ip_conntrack

tcp  6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \      

dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \     

dport=32775 use=2 

tc: 协议

6: 协议类型

117: conntrack记录的生存时间

SYN_SENT: 包的状态 (这个连接只在一个方向发送了TCP SYN包)

src: 源地址

dst: 目的地址

sport: 源端口

dport: 目的端口

[UNREPLIED]: 特殊标记

src,dst,sport,dport: 希望接收的应答信息,和前面正好相反

[UNREPLIED]

[ASSURED]

连接跟踪表大小设置:

/proc/sys/net/ipv4/netfilter/ip_conntrack_max

nf_conntrack_ipv4

nf_conntrack

iptable_nat

nf_nat

ip_nat

ip_conntrack

例: FTP : nf_conntrack_ftp, nf_nat_ftp, ip_conntrack_ftp, ip_nat_ftp

当conntrack机制不知道如何处理某个特殊的协议,尤其是在它不了解这个协议或不知道协议如何工作时, 第一个包被认作NEW,其后的应答包等等数据都是 ESTABLISHED

修改缺超时值:/proc/sys/net/ipv4/netfilter/ip_conntrack_generic_timeout

client              server
|--------SYN--------->|
|<-----SYN+ACK-----|
|--------ACk--------->|

client 端首先向 server 端发送一个 SYN 包,值为1。

server 端接收到 client 端发送的 SYN 包后,会回复

一个 SYN/ACK 包,SYN 值加1,ACK 值随机产生。

client 端收到 server 端答复的 SYN/ACk 包后,又会回复一个ACK

ACK 值是 server 端发送来的 SYN/ACK 包中的 ACK 值加1,连接建立

conntrack连接跟踪

/proc/net/ip_conntrack

连接跟踪一看到SYN包,就认为这个连接是NEW状态,一看

到返回的SYN/ACK包,就认为连接是ESTABLISHED状态。

有了这个特殊处理,NEWESTABLISHED包就可以发送

出本地网络,且只有ESTABLISHED的连接才能有回应信息

TCP连接状态

最初发出的SYN包已正确传输,并且SYN/ACK

包也到达了防火墙

client              server
|--------FIN---------->|
|<-------ACK----------|
|<-------FIN-----------|
|--------ACK--------->|

设第一个封包由 client 端发送,则 client 端会发送一个 FIN 封包,值为1

server 端收到 client 端发送的 FIN 包后,知道 client 端已完成数据的

传送要请求断开TCP连接。server 端会发送一个 ACK 包给 client 端。

server 端把未传送完的数据传送给 client 端后,也会给 client 端发送一

FIN,告知 client server 端已完成数据传送,可以断开TCP连接。

client 端收到 server 端发送的 FIN 封包后,会向 server 端回复

一个ACK 包,表示已确认 server 端的 FIN 封包,TCP连接断开。

conntrack连接跟踪

/proc/net/ip_conntrack

在发出最后一个ACK包之前,连接(指两个方向)是不会关闭的,注意,这只是针

对一般的情况。连接也可以通过发送RST包关闭,这用在拒绝一个连接的时候。在

RST包发送之后,要经过预先设定的一段时间,连接才能断掉。

连接关闭后,进入TIME_WAIT状态,缺省时间是2分钟。留这个时间,是为了让数据

包能完全通过各种规则的检查,也是为了数据包能通过拥挤的路由器,从而到达目的地。

如果连接是被RST包重置的,就直接变为CLOSE了。这意味着在关闭之前只有10秒的

默认时间。RST包是不需要确认的,它会直接关闭连接。

表示客户端已发送SYN

当客户端Socket执行连接时,它首先发送SYN,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个包。

表示接受到了SYN

在正常情况下,这个状态是服务器端的Socket在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat是很难看到这种状态的,当收到客户端的ACK包后,它会进入到ESTABLISHED状态

这种状态比较特殊,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,应该先收到(或同时收到)对方的ACK包,再收到对方的FIN包。但是CLOSING状态表示你发送FIN包后,并没有收到对方的ACK包,反而却也收到了对方的FIN包。那就是如果双方几乎在同时close一个Socket的话,就会出现了双方同时发送FIN包的情况,也即会出现CLOSING状态

表示等待对方的FIN

假设当Socket在ESTABLISHED状态时,客户端想主动关闭连接,向服务端发送了FIN包, 此时该Socket即进入到FIN_WAIT_1状态, 在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK包,所以FIN_WAIT_1状态一般是比较难见到的

当客户端close一个Socket发送FIN包给服务端,服务端回应一个ACK包给客户端, 此时客户端则进入到CLOSE_WAIT状态。接下来如果没有数据发送给客户端,就可以close这个Socket,服务端发送FIN包给客户端,进入LAST_ACK 状态。

表示等待对方的FIN

当服务端回应ACK包后,则进入到FIN_WAIT_2状态,FIN_WAIT_2状态下的Socket,表示半连接,也即有一方要求close连接,但另外还告诉对方: "我暂时还有点数据需要传送给你,稍后再关闭连接"

等待发送方的ACK

服务端一方在发送FIN包后,最后等待客户端的ACK包。当收到ACK包后,也即可以进入到CLOSED可用状态。

表示收到了对方的FIN包,并发送出了ACK

2分钟后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了服务端同时带FIN标志和ACK标志的包时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态

Timeout 值修改:

/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_*

状态(跟踪连接)机制 在用户空间里的部分不会查看TCP包的标志位

表示应答域有效,TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为0

表示Push操作。指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队

同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK=1

表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据

表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。

conntrack状态跟踪

/proc/net/ip_conntrack

[UNREPLIED]

第一个发出的包状态是 [UNREPLIED], 默认超时值是30

[ASSURED]

一旦收到第一个包的回应,[UNREPLIED]标记就会被删除,连接就被认为是ESTABLISHED

状态超时时间变为180秒,如果连接持续不了180秒就要被中断

udp      17 175 src=192.168.0.3 dst=202.96.209.5 sport=32863 dport=53 \

packets=6 bytes=396 src=202.96.209.5 dst=192.168.0.3 sport=53 dport=32863 \

packets=6 bytes=869 [ASSURED] mark=0 use=1 

应答状态是 RELATED

TYPE CODE Description Query Error
0 0 Echo Reply: 回显应答(Ping应答) x  
3 0 Network Unreachable: 网络不可达   x
3 1 Host Unreachable: 主机不可达   x
3 2 Protocol Unreachable: 协议不可达   x
3 3 Port Unreachable: 端口不可达   x
3 4 Fragmentation needed but no frag. bit set: 需要进行分片但设置不分片比特   x
3 5 Source routing failed: 源站选路失败   x
3 6 Destination network unknown: 目的网络未知   x
3 7 Destination host unknown: 目的主机未知   x
3 8 Source host isolated (obsolete): 源主机被隔离(作废不用)   x
3 9 Destination network administratively prohibited: 目的网络被强制禁止   x
3 10 Destination host administratively prohibited: 目的主机被强制禁止   x
3 11 Network unreachable for TOS: 由于服务类型TOS,网络 不可达   x
3 12 Host unreachable for TOS: 由于服务类型TOS,主机不可 达   x
3 13 Communication administratively prohibited by filtering: 由于过滤,通信被强制禁止   x
3 14 Host precedence violation: 主机越权   x
3 15 Precedence cutoff in effect: 优先中止生效   x
4 0 Source quench: 源端被关闭(基本流控制)    
5 0 Redirect for network: 对网络重定向    
5 1 Redirect for host: 对主机重定向    
5 2 Redirect for TOS and network: 对服务类型和网络重定 向    
5 3 Redirect for TOS and host: 对服务类型和主机重定向    
8 0 Echo request: 回显请求(Ping请求) x  
9 0 Router advertisement: 路由器通告    
10 0 Route solicitation: 路由器请求    
11 0 TTL equals 0 during transit: 传输期间生存时间为0   x
11 1 TTL equals 0 during reassembly: 在数据报组装期间生 存时间为0   x
12 0 IP header bad (catchall error): 坏的IP首部(包括各 种差错)   x
12 1 Required options missing: 缺少必需的选项   x
13 0 Timestamp request (obsolete): 时间戳请求(作废不用) x  
14   Timestamp reply (obsolete): 时间戳应答(作废不用) x  
15 0 Information request (obsolete): 信息请求(作废不用) x  
16 0 Information reply (obsolete): 信息应答(作废不用) x  
17 0 Address mask request: 地址掩码请求 x  
18 0 Address mask reply: 地址掩码应答 x  

conntrack状态跟踪

/proc/net/ip_conntrack

主机向目标发送一个回显请求, 防火墙就认为这个包处于NEW状态

目标回应一个回显请求, 防火墙就认为包处于ESTABLISHED状态

icmp     1 17 src=192.168.0.3 dst=202.96.209.5 type=8 code=0 id=13852 \

packets=42 bytes=3528 src=202.96.209.5 dst=192.168.0.3 type=0 code=0 \

id=13852 packets=0 bytes=0 mark=0 use=1 

type: ICMP类型

code: ICMP代码

id: icmp包ID,每个ICMP包被发送时都被分配一个ID,接受方把同样的ID分配给应答包

命令格式:iptables-restore [-c] [-n]

iptables [-t table] [Option] Command [match] [target/jump]

Command-参数  [链名]

当源地址或目的地址是以名字而不是ip地址形式出现时,

若这些名字可以被解析为多个地址,则这条规则会和所

有可用地址结合

例:iptables -D INPUT --dport 80 -j DROP

例:iptables -D INPUT 1

当源地址或目的地址是以名字而不是ip地址的形式

出现时,若这些名字可以被解析为多个地址,则这条

command会失败

例:iptables -R INPUT 1 -s 192.168.0.1 -j DRIP

如果没有指定链,则显示指定表中的所有链,如果什

么都没有指定,就显示默认所有表中的链

如果没有指定链,则清空指定表中中的所有链,如果

什么都没有指定,就清空默认表中中的所有链

这个链必须没有被引用,如果被引用,在删除之前

必须删除或替换与之有关的规则,如果没有给出参

数,将会删除默认表中所有非内建的链

为链设置默认的策略(target) (DROP,ACCEPT)

所有不符合规则的包都被强制使用这个策略.只有内建

的链才可以使用规则,但内建的链和用户自定义的链都

不能被作为策略使用

原来的名字在钱,新名字在后,这仅仅是改变链的名字,

对整个表的结构、工作没有任何影响

Option: -选项 |--选项

Option (配合command使用)

match: -参数 [内容] | --参数 [内容]

例:-p udp,tcp

例:--protocol ! tcp

例: 192.168.0.1

192.168.0.1/255.255.255.0

192.168.0.1/32

例: 192.168.0.0/24

192.168.0.0/255.255.255.0

例:--source ! 192.168.0.0/24

只能用于 INPUT,FPRWARD,PREROUTING 三个链

例: iptables -A INPUT  -i +

例: iptables -A INPUT  -i eth+

例:-i ! eth0

! -f 表示只能匹配到没有分片或者被分片的包的第一个碎片

必须有 --protocol tcp ( -p tcp ) 作为前提条件

例: --source-port  ! 22

匹配标记:SYN, ACK, FIN, RST, URG, PSH

两个参数列表,列表内部用逗号

分割,参数之间用空格分割

ALL: 指选定的所有标记

NONE: 指未选定任何标记

例: -p tcp --tcp-flags ALL NONE

例: -p tcp --tcp-flags ! SYN,FIN,ACK  SYN

例: -p tcp ! --syn

必须有 --protocol udp ( -p udp ) 作为前提条件

必须有 --protocol icmp ( -p icmp ) 作为前提条件

名字可以用命令 iptables --protocol icmp --help 查看

例: iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

例: iptables -A INPUT -p icmp --icmp-type ! 8 -j ACCEPT

必须用 -m--match 装载

新版本下载地址

必须用 -m limit 明确指定才能使用

例: -m limit ! --limit 5/s

设置 limit match 的峰值,在单位时间内最多可匹配几个包

例: iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 3/minute --limit-burst 5 -j DROP

设置最大平均匹配速率,也就是单位时间内 limit match 可以匹配几个包

例: iptables -A INPUT -m limit --limit 3/hour

必须用 -m mac 装载

只能在 PREROUTINGFORWARDINPUT 链使用

例: iptables -A INPUT -m mac --mac-source 00:03:2D:02:22:0B

mark : 不是包本身的一部分,而是在包穿越计算机的过程中

由内核分配的和它相关联的一个字段。它可能被用来改变包

的传输路径或过滤,mark值只能由内核更改

必须用 -m mark 装载

必须用 -m multiport 装载

源端口多端口匹配,最多可以指定15个端口,以英文逗号分割,注意没有空格

例: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110

必须用 -m owner 装载

只能用在 OUTPUT 链中

例: SID=`ps -eo sid,args | grep httpd | head -n 1 | cut -b 1-5`

iptables -A OUTPUT -p tcp -m owner --sid-owner $SID -j ACCEPT

必须由 -m state 装载

四种状态可用: INVALID, ESTABLISHED, NEW, RELATED

UNTRACKED :2.6 内核新增,配合 -j NOTRACK

iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

例: iptables -A INPUT -m state --state RELATED,ESTABLISHED

必须用 -m ttl 装载

例: iptables -A OUTPUT -m ttl --ttl 60

必须用 -m tos 装载

参数可以是16进制数,也可以十进制数,还可以

是相应名字,这个match常被用来mark包,以便

后用,常和iproute2或高级路由功能一起使用.

用 iptables -m tos -h 查询

例: iptables -A INPUT -p tcp -m tos --tos 0x10

target/jump: --jump [target] | -j [target]

Jump

例: iptables -N tcp_packets

iptables -A INPUT -p tcp -j tcp_packets

从INPUT链跳入tcp_packets链,如果达到了tcp_packets链的结尾

(未被链中任何规则匹配),则会退到INPUT链的下一条规则继续。

如果在子链中被ACCEPT了,那么它不会再经过父链中的其他规则,

但这个包还是能被其他表的链匹配。

一旦包满足了指定的匹配条件,就会被ACCEPT,并且不会再去匹

配当前链中的其他规则或者同一个表内的其他规则(不包括其他表)

例: iptables -t nat -A PREROUTING -p tcp --dst 61.142.253.1 --dport 80 \

-j DNAT --to-destination 192.168.0.1-192.168.0.10

目的网络地址转换(重写包的目的IP地址),如果一个包被匹配了那么

和它属于同一个流的所有包都会被自动转换,然后就可以被路由到正

确的主机或网络

只能用在 nat 表的 PREROUTINGOUTPUT 链中,或者是被这两

条链调用的链,包含DNAT target的链不能被处此之外的其他链调用

iptables -A FORWARD -p tcp -j LOG --log-level debug

iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

iptables -A INPUT -p tcp -j LOG --log-tcp-sequence

iptables -A INPUT -p tcp -j LOG --log-tcp-options

iptables -A INPUT -p tcp -j LOG --log-ip-options

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

设置MARK值,只能在本地的 mangle 表里使用

iptables -t nat -A POSTROUTING -p tcp -j MASQUERADE --to-ports 1024-31000

只能用户 nat 表的 POSTROUTING

为用户空间的程序或应用软件管理包队列,它是和iptables之外的程序或工具协同使用的

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

只能用在 nat 表的 PREROUTINGOUTPUT 链和被它们调用的自定义链里

iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

1. icmp-net-unreachable

2. icmp-host-unreachable

3. icmp-port-unreachable ( 缺省 )

4. icmp-proto-unreachable

5. icmp-net-prohibited

6. icmp-host-prohibited 

7. echo-replay ( icmp ping )

8. tcp-reset ( 用于TCP协议,告诉REJECT返回一个TCP RST包并关闭TCP连接 )

只能用在 INPUT、FORWARD、OUTPUT 链和子链中有效

iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source \

194.236.50.155-194.236.50.160:1024-32000

只能用在 nat 表的 POSTROUTING 链里

iptables -t mangle -A PREROUTING -p TCP --dport 22 -j TOS --set-tos 0x10

值的形式可以是名字或者使相应的数值(十进制或16进制的)。一般情况下,使用名字

而不使用数值形式,因为以后这些数值可能会有所改变,而名字一般是固定的。TOS字

段有8个二进制位,所以可能的值是0-255(十进制)或0x00-0xFF(16进制)

1. Minimize-Delay 16 (0x10) 找一条路径使延时最小,一些标准服务如telnet、SSH

2. Maximize-Throughput 8 (0x08) 找一条路径能使吞吐量最大,标准服务FTP-data能用到这个 

3. Maximize-Reliability 4 (0x04) 找一条路径能使可靠性最高,使用它的有BOOTP和TFTP

4. Minimize-Cost 2 (0x02) 找一条路径能使费用最低,如RTSP(Real Time Stream Control Protocol)

5. Normal-Service 0 (0x00) 一般服务,没有什么特殊要求。这个值也是大部分包的缺省值

只能在 mangle 表内使用

iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64

iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 1

用户总是使用比较近的DNS,那我们就可以对

我们的DNS服务器发出的包进行几个--ttl-dec。

iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1

包每经过一个设备,TTL就要自动减1,但在我们的防火墙里这个1又被补上了,

也就是说,TTL的值没变,那么trace-routes就会认为我们的防火墙是不存在的

只能在 mangle 表内使用

iptables -A INPUT -p tcp --dport 22 -j ULOG --ulog-nlgroup 2

iptables -A INPUT -p tcp --dport 22 -j ULOG --ulog-prefix "SSH connection attempt:"

iptables -A INPUT -p tcp --dport 22 -j ULOG --ulog-cprange 100

iptables -A INPUT -p tcp --dport 22 -j ULOG --ulog-qthreshold 10

iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460

iptables -A mangle POSTROUTING -p tcp --tcp-flags SYN,RST SYN \

-j TCPMSS --clamp-mss-to-pmtu

MSS: 最大分段 ( Maximum Segment Size )