防火墙定义
#Firewall:(防火墙) 工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是二者的结合 #防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成
#防火墙分类:主机防火墙;网络防火墙 。 #主机防火墙:针对单个主机,工作再内核中的TCP/IP栈上,一般为软件防火墙 #网络防火墙:针对多台主机,工作在网络边缘,一般为硬件防火墙 #网络防火墙分类:①网络层防火墙②应用层防火墙即网关
iptables/netfilter
1 定义
#iptables 工作在用户空间,规则编写工具;编写规则并且发送至netfilter。 #netfilter 工作在内核空间,让规则能够生效的网络框架。
2 netfilter表、链结构
四表五链结构
#四表:filter、NAT、mangle、raw fileter:筛选过滤 nat :端口映射,地址映射 mangle:修改特定数据包 raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能 #四表等级由高到低排列:raw --> mangle --> nat --> filter #五链:PREROUTIING、INPUT、FORWARDS、OUTPUT、POSTROUTING PREROUTING:路由前 INPUT:进入用户进程空间 OUTPUT:进入内核空间 FOWARDS:内核空间中转发 POSTROUTING:路由后
表链对应关系
# FORWARD:filter、mangle # INPUT: filter、 mangle # OUTPUT:filter、mangle、nat # PREROUTING:mangle、 nat # POSTROUTING: mangle、nat
3 数据包过滤匹配流程
4 iptables规则
#规则:检查条件、处理机制 通:默认为堵,只对能识别的进行放行 堵:默认为通,只对能识别的进行阻塞
#检查条件: #IP:源IP、目的IP #TCP:源端口、目的端口、flags标识位 #ICMP:ICMP-TYPE #拓展的检查条件: #time:时间 #sting:字符串
#处理机制(即指定策略规则): #DROP:丢弃 #REJECT:直接拒绝 #ACCEPT:接受 #SNAT:静态NAT #DNAT:动态NAT #RETURN:返回调用链 #格式 -j 处理机制 #例如:-j ACCETP
5 条件匹配
通用匹配: #-s :匹配原地址,可以IP,也可以网络地址;可以使用!操作符取反, ! 172.16.0.0/16; #-s 相当于 --src, 或 --source #-d : 匹配目标地址 #-p : 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一; #-i :数据报文流入的接口;通常只用于INPUT、FORWARD和PREROUTING #-o :流出的接口;通常只用于OUTPUT、FORWARD和POSTROUTING
扩展匹配 1、 隐含扩展: 使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展 #-p tcp # --dport m[-n] :匹配的目标端口,可以是连续的多个端口; # --sport:源 # --tcp-flags rst,syn,ack,fin syn (等同于 --syn) # (tcp flags:URG, PSH, RST, SYN, ACK, FIN) #举例①:放行来自于172.16.0.0/16网络的主机对本机ssh服务的请求; #iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT #iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT #-p udp # --dport 目的端口 # --sport 源端口 #举例②:放行本机的tftp服务: #iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 69 -j ACCEPT #iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT #举例③放行本机dns服务:(要注意dns服务,一旦无法给客户端解析 就需要去其他地方迭代查询) dns的udp53端口 #iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 53 -j ACCEPT #iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 53 -j ACCEPT #iptables -A OUTPUT -s 172.16.100.7 -p udp --dport 53 -j ACCEPT #iptables -A INPUT -d 172.16.100.7 -p udp --sport 53 -j ACCEPT dns的tcp53端口 #iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --deport 53 -j ACCEPT #iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 53 -j ACCEPT #iptables -A OUTPUT -s 172.16.100.7 -p tcp --dport 53 -j ACCEPT #iptables -A INPUT -d 172.16.100.7 -p tcp --sport 53 -j ACCEPT #-p icmp # --icmp-type 8 ping 请求 0 ping 应答 #举例④:放行ping其它主机 ping其他主机的规则 #iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT #iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT 还有被其他主机ping的规则 #iptables -A OUTPUT -d 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT #iptables -A INPUT -s 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT
扩展匹配 2、显式扩展:必须要明确指定的扩展模块 -m 扩展模块名称 --专用选项1 --专用选项2 #(1)multiport: 多端口匹配,一次指定多个(15个以内)离散端口 # --sports port[,port|,port:port] # --dports #例子: #iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT #iptables -I OUTPU-s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT #(2)iprange: ip地址范围 # [!] --src-range from[-to] # [!] --dst-range from[-to] #例子: #iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1- 172.16.100.100 -j ACCEPT #iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT #(3)time: 指定时间范围 # --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] # --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] # --timestart hh:mm[:ss] # --timestop hh:mm[:ss] # [!] --weekdays day[,day...] #例子: #iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri -- timestart 08:00:00 -- time-stop 18:00:00 -j ACCEPT #iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT #(4)string: 字符串匹配 # --algo {bm|kmp}:字符匹配查找时使用算法 # --string "STRING": 要查找的字符串 # --hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式 #(5)connlimit: 每IP对指定服务的最大并发连接数; # [!] --connlimit-above [n] 如:15 #(6)limit: 报文速率控制 # --limit #[/second|/minute|/hour|/day] # --limit-burst # 峰值速率 # 黑客工具: hping3: 安装此包,做测试(请用于正规途径) # hping3 -c 1000 -i u1000 172.16.100.7 (u1000 表示1000微秒一个包,可以计算一下 1秒会多少个包?) #(7)state: 状态匹配 # --state # NEW # ESTABLISHED # RELATED # INVALID # 法则: # 1、对于进入的状态为ESTABLISHED都应该放行; # 2、对于出去的状态为ESTABLISHED都应该放行; # 3、严格检查进入的状态为NEW的连接; # 4、所有状态为INVALIED都应该拒绝;
6 iptables命令
6.1
创建删除自定义的规则链 #iptables [-t table] -N chain #创建一条自定义的规则链,-t table指定对应的表名可省略 #例如:iptables -N coming #iptables [-t table] -X chain #删除一条自定义的规则链,-t table指定对应的表名可省略 #例如:iptables -X cming
6.2
修改自定义链名 #iptables [-t table] -E old-chain-name new-chain-name
6.3
为链指定默认规则 #iptables [-t table] -P chain target #例:iptables -t filter -P INPUT ACCEPT 为filter表中的INPUT链指定ACCEPT规则
6.4
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
#-F 清空链中的规则,规则有编号在链中自上而下,从1开始 #-L 列出表中的所有规则 -n数字格式显示IP和端口 -v以详细格式显示 -vv 更详细的格式显示 -x exactly,精确值 不执行单位换算 --line-number 显示各规则的行号 #-Z 清零
如图(1)
如图(2)
6.5 iptables [-t table] {-A|-D} chain rule-specification
-A 附加一条链规则
-D 删除一条链规则
# iptables [-t table] -A chain rule-specification # 附加一个规则链到相应的表中 # 例子:iptables -A OUTPUT -s 192.168.1.111 -d 192.168.0.0/16 -p icmp --icmp-type 0 -j ACCEPT # iptables [-t table] -D chain rulenum # 删除一个规则链 # 例子:iptables -D OUTPUT 1
6.6常用规则命令
#删除规则 #iptables [-t table] -D chain rulenum #插入规则 #iptables [-t table] -I chain [rulenum] rule-specification #替换指定规则 #iptables [-t table] -R chain rulenum rule-specification #只显示指定链上的规则添加命令: #iptables [-t table] -S [chain [rulenum]]start时也会读取此文件中的内容以设置规则;
7 保存规则
(注意:由于添加规则后,一旦重启,规则会消失,所以需要 将规则保存到iptables配置文件中)
# service iptables save 规则会被保存至/etc/sysconfig/iptables文件中; # iptables-save > /etc/myiptables; 将规则文件保存到一个文档中 # iptables -F 清空所有链中的规则; # iptables-restore < /path/to/some_rulefile; 重读该文档中的规则,规则又恢复了!!!
8 附ip报头 tcp报头 tcp三次握手 tcp有限状态机
ip报头 32位
参数详解 #版本(Version):它标识了数据包IP版本号。表形式为:4位字段的值设置为二进制的0100表示IP版本4(IPv4).设置为0110表示IP版本6(IPv6) #Header length(包头长度):字段长度为4位,它表示32位字长的IP报头长度,设计报头长度的原因是数据包可选字段大小会发生变化。IP报头最小20个八位组,最大可以扩展到60个八位组。这个字段也可以描述32位字的组大长度。 #Type service(服务类型):字段长度为8位,它用来指定特殊的数据包处理方式。服务类型字段实际上被划分为2个子字段:优先权和Tos。优先权用来设置数据包的优先级。Tos允许按照吞吐量、时延、可靠性和费用方式选择传输服务。Tos通常不用 所有位都被设置为0.在OSPF路由协议的早期规范中还称为Tos路由选择。 优先级偶尔在服务质量(QoS)应用中使用 #Total length(总长度):主要表示包头和数据的数据包长度。数据包总长度字段的长度为16位,以8位为单位计数。其中包括IP报头。接收者用IP数据包总长度减去IP报头长度,就可以确定数据包有效载荷大小。16位长的二进制数用十进制表示最大可以为65535,所以IP数据包最大长度是65535。 #Identifier(标识符):字段长度为16位,通常与标记字段和分段偏移一起用于数据包的分段。也就是当数据包原始长度超过数据包所要经过的数据链路的最大传输单元(MTU)那么分段必须将数据包分段为更小的数据包。 #Flag (标记字段):长度为3位 其中第1位没有使用。第2位是不分段(DF),当DF位置被置为1时,路由器将不能对数据包进行分段处理。如果数据包因为不能被分段而不能转发,那么路由器将丢弃数据包并向数据发送方发送错误信息。第3位表示更多分段(MF)当路由器对数据包分段时除了最后一个分段的MF职位0 ,其它分段的MF位全设置为1,当接收者收到MF为0的分段停止分段。 #Fragment offset(分段偏移):字段长度为13位,以8个八位组为单位。用于指明分段起始点相对于根头起始点的偏移量。由于分段经过网络肯定会发生错序,所以分段偏移字段可以使接收者按正确的顺序重组数据包。 #Time to live (TTL 生存时间):字段长度为8位,在最初创建数据包时TTL被设定某个特定的值,当数据包逐个经过路由器时,每台路由器都会降低TTL的数值,当TTL值为0时,路由器将会丢弃这个数据包并向数据发送源发送错误信息 这样就可以防止数据包无休止的传下去。TTL实际上是表示跳数。常见的是15和#32 缺省值是64. tracert这样的命令就是利用TTL字段。 #Protocol(协议):字段长度为8位,他给出了主机到主机的层或传输层协议的“地址”或协议号。协议字段指定了数据包中信息的类型。
tcp报头
参数详解 #TCP目的端口(Destination port):16位的目的端口域定义传输的目的。这个端口指明报文接收计算 机上的应用程序地址接口。 #TCP序列号(序列码,Sequence Number):32位 #TCP确认号(Acknowledgment Number):32位的序列号由接收端计算机使用,重组分段的报文成最初形式。,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。 #数据偏移量(HLEN):4位包括TCP头大小,指示何处数据开始。 #保留(Reserved):6位值域,这些位必须是0。为了将来定义新的用途所保留。 #标志(Code Bits):6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。 #1. URG:紧急标志 紧急(The urgent pointer) 标志有效。紧急标志置位, #2. ACK:确认标志 确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。 #3. PSH:推标志 该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。 #4. RST:复位标志 复位标志有效。用于复位相应的TCP连接。 #5. SYN:同步标志 同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。 #6. FIN:结束标志 带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。 #窗口(Window):16位,用来表示想收到的每个TCP数据段的大小。 #校验位(Checksum):16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。 #紧急指针(紧急,Urgent Pointer):16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。 #选项(Option):长度不定,但长度必须以字节。如果 没有 选项就表示这个一字节的域等于0。 #数据(Date):应用程序的数据
tcp三次握手
tcp有限状态机
(1)
(2)
=========================end===============================
总结也许不够全面,技术有限,望大家一起丰富内容