本文有参考《Linux网络安全技术与实现(第2版)》,更多内容,可直接参阅原书。
icmp:Internet Control Message Protocol
第一次
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)
Framework:
默认规则:
开放:堵
关闭:通
规则:匹配标准
IP:SIP,DTP
TCP:SPORT,DPORT
UDP:SPORT,DPORT
ICMP:icmp-type
数据报文过滤:
Linux2.0
ipfw/firewall
Linux2.2
ipchain/firewall
Linux2.4
iptables/netfilter
iptables在用户空间写规则,对应的是内核空间的netfilter,所以生效的也是netfilter。
hook function:钩子函数
prerouting
input
output
forward
postrouting
—>filter机制的结构图<—-
数据包传入—>路由表—>FORWARD链—>数据包传出
|–>INPUT链–>本机进程–>路由表–>OUTPUT链–>数据包传出
INPUT/OUTPUT:数据包进入主机时,该数据包即由“数据包传入”所标识的位置进入,接着被送入路由表,然后根据路由表的内容决定数据包传输的路径,假设传给本机的进程,因此,该数据包将会
被送入INPUT链,此时若INPUT链内的规则不允许该数据包进入,那么则会抛弃掉,同理,OUTPUT规定本机是否允许数据的传出,由此可以看到:INPUT/OUTPUT链机制是为了保护本机进程而设计的。
同时,这应该代表的是相同的一个接口。
FORWARD:在网关式防火墙中,防火墙部署在网关位置,当数据包要由另一个接口送出时,就会被送入FORWARD链,由此时FORWARD链内的规则决定是否允许数据包的命运~
规则链:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
filter(过滤):filter是netfilter最重要的机制,其任务是执行数据包的过滤操作,也就是起到防火墙的作用。
INPUT
OUTPUT
FORWARD
nat(地址转换):通俗讲,其功能就是IP分享器。
PREROUTING
POSTROUTING
OUTPUT
mangle(拆开/修改/封装):是一个很特殊的机制,可以通过mangle机制来修改经过防火墙内数据包的内容。
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw():负责加快数据包穿过防火墙机制的速度,由此提高防火墙的性能。
PREROUTING
OUTPUT
iptables:四个表五个链
能否使用自定义链?
可以使用自定义链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制。
用可以删除自定义的空链
默认链无法删除
每个规则都有两个内置的计数器:
一个用来被匹配的报文个数 (9K)
一个被匹配的报文的体积大小之和(9K)
规则:匹配标准,处理动作
iptables -t TABLE COMMAND CHAIN [NUM]- 操作方式 -j 处理办法
-t:filter nat mangle raw,默认是filter表
操作方式:
-L:将所在的表内容列出
-A:在指定的链中添加新规则
-F:将所选择的表内容清除掉
-P:设置某个链的默认策略
匹配标准:
通用匹配
-s/–src :源地址
-d/–dst :目标地址
-p :协议{tcp|udp|icmp}
-i INTERFACE :指定数据报文流入的接口
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE :指定数据报文流出的接口
可用于定义标准的链:OUTPUT,POSTROUTING,FORWARD
扩展匹配
隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p{tcp|udp|icmp}
显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
-j TARGET:
ACCEPT
DROP
REJECT
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP