Linux杂记 Iptables介绍
-
Iptables
:网络防火墙系统,用于生成防火墙规则,并且将规则附加在netfilter
上面的一个工具; -
netfilter
:是内核中一个使iptables
生效的Frame
,使规则生效的一个框架,是用来实现报文过滤功能的 - 总结一下,也就是说
Iptables
是用来定义规则的,规则只有在netfiter
上面才能够生效的; -
IP报文的知识
-
IP
报文首部:-
IP Version
:4 bit
表示IP
协议的版本; -
Header Length
:4 bit *4
可以得到得到首部长度; -
Type Of Service
:8 bit
表示服务类型; -
Total Length
:16 bit
表示报文的总长度; -
Identified (Fragment ID)
:16 bit
段标识符,主要用于报文大小不匹配时,进行报文分片,用于表示那些片是被分开的,并且是用于将这些分卡的片进行重组时的依据; -
Fragment Offset
:13 bits
表示片偏移量,通常是前面的报文长度+1
表示后面报文长度的开始; -
R
: -
DF
:Do not Fragment
:表示不进行分片操作,如果报文过大,而且启用了这个选项,那么可能返回错误信息; -
MF
:more Fragment
:表示这个报文不完整,后面还包含分段的片; -
TimeToLive
:8 bit
:在多个路由器进行转发时,如果出现循环路由,用于防止幽灵软件包的出现; -
Protocol
:8 bits
用来定义上层使用的协议,例如TCP
,UDP
,ICMP(Internet Control Messages Protocol 互联网控制消息协议)
:是一种用于网络控制的协议; -
Header CHeckSum
:16 bit
:首部校验和,存放首部的校验码,用于校验首部是否出错; -
Source IP Address
:32 bit
表示源IP
地址; -
Destination IP Address
:32 bit
:表示目的地址IP
; -
Options
:表示可选的数据段; -
Data
:表示实际传输的数据协议;
-
-
TCP首部
-
Source Port Number
:16 bit
:表示源端口地址,也就是报文发送方的端口号码 -
Destination Port Number
:16 bit
:表示目的端口地址,报文接收端的端口号码; -
Sequence Number
:32 bit
:报文***,第一次随机,而后加1
; -
Ackonwledgement Number
:32 bit
:表示确认号;三次握手,将对方的***+1
,然后回送给发送方,报文的实际发送是按照滑动窗口的概念一批一批进行发送的,并且Client
也是按照这个过程一批一批进行确认的; -
Header Length
:4 bit
: 表示 首部长度; -
Reversed
:6 bit
,表示保留位;-
URG
:Urgent Pointer
,用于标识紧急指针位是否有效; -
ACK
用于说明确认号是否有效; -
PSH
:PUSH
,如果为真,表示不能够在缓冲中停留,应该立即送给内核; -
RST
:表示重置连接,但是不断开三次握手的过程,也就是不执行四次挥手; -
SYN
:用于建立同步请求,再发送第一个报文时,必须建立同步请求; -
FIN
:表示断开连接的请求; -
TCP Checksum
:16 bit
,TCP
校验和; -
Urgent Pointer
:16 bit
,表示紧急指针位; -
Options
:表示可选选项; -
Data
:表示实际的数据段信息;
-
-
防火墙:
- 工作在主机或者网络的边缘,对于进出的数据报文,进行检查,监控,并且能够根据事先定义好的规则,并且按照规则进行处理,用于建立安全网络的一种机制;上述的工作机制也就说明了实际存在的缺点:对于网络内部的攻击行为是无法进行防御;
- 防火墙是存在默认的规则的,存在白名单,或者黑名单机制,通常防火墙的定义规则按照拒绝所有未知,放行已知的规则是比较安全的;
- 防火墙的几种匹配标准:
- 通常来说防火墙的匹配标准,就是在抽取数据包文的特征,将这些特征进行分类处理,也就是防火墙的数据报文匹配标准;
-
IP 首部
:可以按照Source IP
,Destination IP
来进行指定标准; -
TCP首部
:- 按照
Source IP Destination IP
来制定报文匹配标准; - 按照报文的状态来执行匹配的标准,三次握手的过程,四次断开的过程:
* 是否允许发起三次握手请求的第一次报文通过SYN=1,FIN=0,RST=0,ACK=0
;限定三次握手的第二次通过SYN=1,ACK=1,FIN=0,RST=0
,或者是第三次握手的报文请求SYN=0 RST=0 FIN=0(Established)
;
- 按照
-
ICMP首部
:通常来根据报文的类别来进行定义匹配标准;
- 防火墙软件的架构:
- 对于
Linux
来说,网络功能是内核提供的功能,用户无法直接管理内核空间,所以通过在内核空间提供管理框架,并且这个管理框架通过向用户空间的某个确定的应用程序来提供管理功能,按照这种框架设计的应用程序包括LVS Linux Virtual Server
,Iptable + netfilter
; -
Iptables
j就是用户空间生成规则并且通过netfilter
提供的接口将规则在netfilter
上面进行生效,所以说防火墙其实是netfilter+规则
,而不是生成规则的应用程序iptables
; -
Linux 2.0
是ipfw + firewall
-
Linux 2.2
是IpChain + firewall
-
Linux 2.4
是IpChain + netfilter
- 对于
- 网络接收的报文进入主机的流程:
- 1.在硬件网卡上面首先拆封的是
MAC
帧首部,之后交给TCP/IP
协议栈; - 2.然后
TCP/IP
协议栈检查IP
首部,查看是否是交给本机的数据包文;- 如果不是,那么检查
/proc/sys/net/ipv4/ip_forward
这个选项,是否允许进行网卡间转发,如果允许交给合适的网卡进行转发出去,如果不允许就会丢弃,这种报文是不会交给本机的用户用空间的应用程序的; - 如果是,那么就由内核交给对应的应用程序,对应的应用程序进程处理;
- 如果不是,那么检查
- 1.在硬件网卡上面首先拆封的是
- 对于数据报文在由网卡接收之后,交给
TCP/IP
协议栈之后,首先应该进行的就是路由决策,也就是决定这个网卡是交给接收域进行处理还是交给转发域进行转发; -
Netfilter
上面的五个hook
函数:-
A
:表示PREROUTING
:表示在进行路由决策之前,对于报文进行检查,因为可能需要对于目的IP
就是本机的数据报文进行转发,使这些报文进入forward zone
,而不是交给本机进行处理; -
B
:表示INPUT
,也就是在TCP/IP
协议栈的路由表进行路由决策之后,这些数据报文是交给本地主机的某个应用程序的,INPUT
链就是用来检查这些数据包文的; -
C
:表示OUTPUT
,在User Space
的某个用户程序在处理某些数据包文,然后进行响应时,数据包文流出的位置检查数据报文; -
D
:表示FORWARD
,在路由决策之后,这些数据报文是需要进行转发的,这些报文首先交割forward
进行检查; -
E
:表示POSTROUTING
:在经过forward Zone
之后,当报文在网卡的发送缓冲,即将离开网卡时,对报文进行检查和修改;
-
其中
PREROUTING POSTROUTING
两个连主要不是用来放行或者拒绝某个用户请求的,而是修改用户报文的某些数据,用于实现特殊的网络功能,例如NAT
服务器[以后介绍];-
iptables
的四个表包括:-
filter
:实现过滤功能主要是通过三个规则链来实现的INPUT OUTPUT FORWARD
; -
mangle
:用于将报文进行修改,然后在整合,例如修改TTL
,修改服务器类型,通常在PREROUTING INPUT FORWARD OUTPUT POSTROUTING
几个链上面来实现; -
NAT
:通过在PREROUTING OUTPUT POSTROUTING
可以用于实现SNAT
或者DNAT
; -
RAW
:在PREROUTING OUTPUT
链上面,表示不对报文内容进行任何修改;
-
- 每一个链是上面都是可以实现不同的功能的,这些不同的功能之间是存在优先顺序的;
-
PREROUTING
:优先顺序raw > mangle > nat
; -
INPUT
:优先顺序mangle > filter
; -
FORWARD
:优先顺序mangle > filter
; -
OUTPUT
:优先顺序raw > mangle > nat > filter
; -
POSTROUTING
:优先顺序mangle > nat
;
-
-
iptables
是支持自定义链的,但是只有在被默认链调用之后才能生效,对于自定义链必须能够被调用,并且具有返回机制,并且不允许删除非空的自定义链; - 默认链是不能够被删除的;
每一个条规则都存在两个默认的计数器,分别用来记录被匹配到的报文个数,以及匹配到的报文体积之和;
匹配标准
-
iptables
:iptables [ -t TABLES ] COMMAND CHAIN [num] 匹配标准 -j 处理办法;
一般的使用格式; - 通用匹配标准:
-
iptables
通过netfilter
模块本身就能够完成匹配过程; -
-s --src
:指定源地址(网络); -
-d --dst
:指定目的地址; -
-p {tcp|udp|icmp}
:用于指定协议; -
-i {ehtx | pppx}
:用于指定数据报文流入的接口,通常用于PREROUTING | INPUT | FORWARD
; -
-o {ethx | ppox}
:用于指定数举报文流出的接口,通常用于OUTPING POSTROUTING FORWARD
-
-j
:表示对于匹配到的数据报文执行怎样的操作;-
ACCEP
:表示接收; -
DROP
:表示偷偷丢弃,并且不进行任何响应; -
REJECT
:表示拒绝,测试目的使用reject
,实际中建议使用DROP
,也就是不返回任何的有用信息; - 例如:
iptables -f filter -A INPUT -s 172.25.23.0/24 -d 172.25.23.2 -j DROP
; -
SNAT
:表示进行源地址转换; -
DNAT
:表示进行目的地址转换; -
REDIRCT
:表示进行端口重定向; -
MASQUERADE
:用于进行地址伪装的,用于实现源地址转换; -
log
:表示用于记录日志; -
mark
:表示进行标记; -
NOTRACK
:表示禁止追踪某一个报文的; - 通过
man
手册可以查看到更加详细的信息;
-
-
- 扩展匹配标准 :
-
iptables
通过netfilter
的扩展模块来完成规则的匹配过程这些模块通常安装在/lib64/xtables/
里面,支持众多的扩展属性; - 隐含扩展:不需要特别指明需要使用那个模块进行扩展,因为此时需要使用
-p {tcp | udp | icmp}
来指定进行扩展;-
-p tcp
:-
--sport PORT[-PORT]
:源端口是连续的端口,这里不支持离散的端口,需要使用特殊的扩展; -
--dport
:目标端口也必须是连续端口; -
--tcp-flags mask comp
:表示TCP
的标志位,只检查,分割的标志位列表,comp
示必须为1
; -
--tcp-flags SYN,FIN,ACK,RST SYN,ACK
, 表示检查前面的标志位; -
--tcp-flags SYN,FIN,ACK,RST SYN
:表示用于检查三次握手的第一次,通过隐含扩展--syn
可以实现和前面一样的结果;
-
-
-p icmp
:-
--icmp-type ping
请求报文为8 echo-replay
,收到的响应报文为0 echo-request
;
-
-
-p udp
:-
--sport
:用于指定源端口; -
--dport
:用于执行目的端口;
-
-
- 显示扩展:必须指明是由那个模块进行的扩展,在
iptables
里面需要使用-m
选项来指定这个功能;-
-m EXTESION --special
:表示扩展-
state
:表示执行状态扩展,可以结合ip_conntrack
用于追踪会话的状态;-
NEW
:表示新连接请求; -
ESTABLISHED
:表示已经建立的链接; -
INVALID
:表示非法的链接请求,例如:SYN=1 FIN=1
; -
RELATED
:表示追踪相互关联的链接; - 例如:
-m state --state NEW,ESTABISHED -j ACCEPT
-
-
multiport
:表示用于李三的多端口匹配-
--source-ports
:表示源端口,可以是不连续的端口; -
--destination--ports
:表示目的端口匹配,同样可以是不连续的端口; -
--ports
:表示源端口和目的端口都进行匹配,支持离散端口; - 例如
-m multiport --destination-ports 21,22,80 -j ACCEPT
-
-
-
-
- 管理命令
- 管理规则:
-
-A
:表示添加一条规则,默认添加在链的尾部; -
-I CHAIN [NUM]
:表示添加链上面的规则,并且指定位置,如果省略NUM
,默认添加为第一条; -
-D CHAIN [NUM]
:表示删除指定链中第num
条规则; -
-R CHAIN [num]
:表示用于替换指定的规则;
-
- 管理链
-
-F [CHAIN] flush
:表示用于清空规则链,如果省略CHAIN
,用于删除对应表中的所有链,很危险; -
-P CHAIN {ACCEPT|DROP}
:用于设定某些链的默认的策略; -
-N
:用于自定义一条新的空链; -
-X
:用于删除自定义的空链; -
-Z
:用于置0
指定链中所有规则的计数器; -
-E
:用于重命名一条自定义的链;
-
- 查看类的命令:
-
-L
:用于显示指定表中的所有规则,但是会尝试反解主机名以及端口对应的服务名称面的反解,使用-n
选项按照数值的方式进行显示; -
-t {filter | nat | mangle }
:用于指定表的类型,默认是filter
; -
-v
:表示显示详细信息; -
-x
:查看流量统计的精确值; -
--line-numbers
:用于显示规则号码;
-
- 管理规则:
- 准确来说
iptables
是内核中的模块,启用就是加载这些模块,停止就是移除这些模块,所以iptables
并不是服务;