1 概述
防火墙的应用在linux操作系统中及其常见,本文省去一些简单的技术介绍,直接进入主题介绍防火墙的一些深度知识。
2 防火墙的基本概念
防火墙的任务简单的描述就是放行合法,或封锁不合法的封包,关于什么是防火墙这里就不做介绍了。
2.1 防火墙的判别依据
各层封装包包头信息:
1 链接层信息:
获取连接层信息不是很难:如:
[root@fc16 /]# ssh 112.64.161.xx root@112.64.161.xx's password:
我们使用tcpdump扑捉信息:
[root@fc16 /]# tcpdump -A host 192.168.0.196 -e tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:50:04.267060 8c:a9:82:3a:88:f8 (oui Unknown) > 00:21:91:6f:dd:be (oui Unknown), ethertype IPv4 (0x0800), length 74: 192.168.0.196.43519 > 112.64.161.xx.ssh: Flags [S], seq 1615294735, win 14600, options [mss 1460,sackOK,TS val 2067145 ecr 0,nop,wscale 7], length 0 E..<..@.@.l.....p@......`Gq.......9.. .........
从所显示的内容,最为重要的莫过于MAC address,我们可以在防火墙的过滤规则中借助Destination MAC来判别封包是有那个主机发过来的。
2 网络层
获取网络层的主要为IP包头,其包头有很多可用信息是可以作为过滤条件的。
[root@fc16 /]# tcpdump -A host 192.168.0.196 -X 13:02:10.150183 IP 192.168.0.196.36576 > 192.168.1.1.domain: 62380+ PTR? 46.161.64.112.in-addr.arpa. (44) 0x0000: 4500 0048 9e44 4000 4011 194b c0a8 00c4 E..H.D@.@..K.... 0x0010: c0a8 0101 8ee0 0035 0034 e059 f3ac 0100 .......5.4.Y.... 0x0020: 0001 0000 0000 0000 0234 3603 3136 3102 .........46.161. 0x0030: 3634 0331 3132 0769 6e2d 6164 6472 0461 64.112.in-addr.a 0x0040: 7270 6100 000c 0001 rpa..... 13:02:10.157083 IP 192.168.1.1.domain > 192.168.0.196.36576: 62380 NXDomain 0/1/0 (106) 0x0000: 4500 0086 0000 4000 4011 b751 c0a8 0101 E.....@.@..Q.... 0x0010: c0a8 00c4 0035 8ee0 0072 050a f3ac 8183 .....5...r...... 0x0020: 0001 0000 0001 0000 0234 3603 3136 3102 .........x6.161. 0x0030: 3634 0331 3132 0769 6e2d 6164 6472 0461 64.112.in-addr.a 0x0040: 7270 6100 000c 0001 c00f 0006 0001 0000 rpa............. 0x0050: 0e10 0032 0764 6e73 2d63 686a 0273 6806 ...2.dns-chj.sh. 0x0060: 636e 636e 6574 036e 6574 0004 726f 6f74 cncnet.net..root 0x0070: c038 0132 68a8 0000 0e10 0000 0708 0001 .8.2h........... 0x0080: 5180 0000 0e10
从上图可以得到一些我们想要的信息:
0x0000 代表IP包头
4500 0048 9e44 4000 4011 194b c0a8 00c4
这段信息分别表示:
4500;4代表ipv4,5代表IP包头长度为5个32bit(32bit也就是4个字节)00代表TOS(000 0000 0)前3个bit的优先权,现已忽略,4bit的TOS分别为最小延时,最大吞吐量,最高可靠性,和最小费用
0048-总长度(数据包总长度:头部 + 数据长度)
9e44;代表唯一标示符
4000;代表不分片,其是标识字段,和片偏移
4011;40代表生存时间TTL,11(上层协议号,11upd,6tcp 255 RAW)
194b;代表校验值。
Coa8 00c4 代表 SRC IP,源IP,可以inet_ntoa转换成点号分隔的IP。
0x0010: c0a8 0101
coa8 代表目标IP。
3 传输层
192.168.0.196.44452 > 112.64.161.xx.ssh: Flags [.], cksum 0xd301 (incorrect -> 0x1c1f), ack 877, win 136, options [nop,nop,TS val 4406110 ecr 446676163], length 0 0x0000: 4500 0034 b095 4000 4006 b753 c0a8 00c4 E..4..@.@..S.... 0x0010: 7040 a12e ada4 0016 041b 8e8b d1fb 61da p@............a. 0x0020: 8010 0088 d301 0000 0101 080a 0043 3b5e .............C;^ 0x0030: 1a9f bcc3
传输层可以获取的信息有很多,如端口号,tcp长度,flags标准为等。
防火墙的分类:
包过滤防火墙,应用层防火墙,
常见的防火墙结构:
单机防火墙,网关式防火墙,通透式防火墙
这里简单的介绍一下通透式防火墙,通透式防火墙就是一个bridge设备,并且在bridge设备上赋予filter的能力,因为bridge是工作于OSI第二层的网络设备,因此不会有任何Routing的问题,并且Bridge上不需要指定任何IP,这样没有“Routing”的问题,防火墙主机本身无须指定IP。因此,通透式防火墙的部署能力也是相当强。
3 防火墙命令结构
Netfilter分为4个Table,分别为Filter,NAT,Mangle,以及RAW。
Table Chain
Filter INPUT,FORWARD,OUTPUT
Nat PREROUTING,POSTROUTING,OUTPUT
Mangle PROROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
RAW PREROUTING,OUTPUT
Filter:Filter是netfilter内最为重要的机制,其任务为执行封包的过滤动作,也就是防火墙的功能;
NAT(Network address Translation)也是防火墙不可或缺的重要机制,其主要功能通俗的说就是IP分享器。
Mangle;Mangle是一个特殊的机制,可以借助Mangle修改行径防火墙内的封包,
RAW :负责加快封包穿越防火墙机制的速度,借此提高防火墙的功能。
在做防火墙策略的时候,要为每个Chain准备一个Default Policy,不管Chain有多少规则,Default Policy永远在每个Chain的低端。
当一个封包进入INPUT china之后,Filter机制即会以这个封包的特征从INPUT china之内的第一条规则逐一的向下匹配,匹配的规则方式为“irst match” 即所谓的“优先执行”。
我们常听说Linux防火墙叫做Iptables,其实这样的称法是不正确的,那么Iptables是什么呢,Netfilter所需要的规则是填写在内存里,但问题是防火墙管理人员如何将规则填写到内存呢,因此管理人源需要一个规则编辑工具,通过这个工具来对内存的规则进行新增,修改和删除,这个编辑工具就是iptables以及ip6tables。
Netfilter的支持的模块越多,防火墙的功能也就会越多,而且我们可以借助升级Kernel的方法达到顺便升级Netfilter的目的,不过防火墙升级不单单是升级kernel就可以解决的,也并非一味增加netfilter模块就可以无限扩充Netfilter的功能,我们知道管理人员借助iptables工具,把规则填写到netfilter的规则数据库中,而这里就需要特定的语法,我们将规则给iptables交给iptables工具时,iptables工具会首先检查语法是否正确。但iptables是怎么获得新模块的语法结构呢。
实时上iptables 也有模块,这些模块放在/lib/iptables目录下。fc16的结构有点变化,为:
[root@fc16 ~]# ls /lib64/xtables/ libip6t_ah.so libipt_unclean.so libxt_NFQUEUE.so libip6t_dst.so libxt_AUDIT.so libxt_NOTRACK.so libip6t_eui64.so libxt_CHECKSUM.so libxt_osf.so libip6t_frag.so libxt_CLASSIFY.so libxt_owner.so libip6t_hbh.so libxt_cluster.so libxt_physdev.so libip6t_hl.so libxt_comment.so libxt_pkttype.so libip6t_HL.so libxt_connbytes.so libxt_policy.so libip6t_icmp6.so libxt_connlimit.so libxt_quota.so libip6t_ipv6header.so libxt_connmark.so libxt_rateest.so
下图为iptables访问的流程图
防火墙的规则不在这里细说了,本文主要涉及的是理论上的基础知识。这里介绍以下对外建立链接时的问题
4 解决无法在防火墙主机上对外建立链接的问题
在常规模式下,客户端必须使用大于1024的端口,如果将大于1024的端口都打开,对于防火墙的限制原则是无法接受的,在netfilter/iptables里使用了“链接追踪”的功能,这个功能有x_state.ko模块所提供。
X_state.ko在iptables叫做state,我们 知道在TCP/TP 规范中,链接状态为12中,这12种分别为:ESTABLISHED、SYS_SENT、SYN_RECV、 FIN_WAIT1、 FIN_WAIT2、 TIME_WAIT、 CLOSED、 CLOSE_WAIT、 LAST_ACK、 LISTEN、 CLOSEING、 UNKNOWN。 这12种状态在TCP的三次握手和四次断开中经常使用,而state模块只有4中状态,分别为ESTABLISHED,NEW,RELATE,INVALID。这4个状态和TCP/IP的12中状态不能混为一谈,因为两者是完全不相关的定义,例如在TCP/IP标准状态描述下,UDP和ICMP封包是没有链接状态的,而在state模块下是有链接状态的。
4.1 ESTABLISHED
我们看到上图有一个这样的例子,第一个链接为TCP封包的关系,第二个为UDP封包的关系,第三个则是ICMP封包的关系,这里简要介绍这三种关系。
TCP封包关系:客户端执行ssh client,对网络上的ssh server发起访问请求,这是送出的第一个封包就是服务器请求的封包,如果这个封包能够成功穿越防火墙,那么接下来的1,2的方向所有封包的状态都是ESTABLISHED。
UDP封包关系,firefox请求访问服务,firefox首先请求DNS解析服务,firefox会想DNS发送一个封包,以请求名称解析,如果能够通过防火墙,则在3,4方向的所有封包的状态都是ESTABLISHED。
ICMP封包关系。客户端提出ping请求,ping发送一个ICMP封包给服务器,如果这个封包能够通过防火墙,则在5,6方向的所有封包状态都是ESTABLISHED。
综上所述,只要封包能够成功穿越防火墙,那么之后所有封包的状态,包括反向所有的封包状态都是ESTABLISHED。
解决这个问题的方法,则是有state模块的ESTABLISHED状态。
如:
itables -A _INPUT -m state –state ESTABLISHED -j ACCEPT.
4.2 NEW
NEW与协议完全无关,其所指的是每一条链接中的第一个封包,他是指一条连接中SYN=1的那个封包,在链接中,第一个封包主要用来做安全处理。
4.3 RELATED
RELATED是指被动产生的响应封包,而且这个封包不属于现有的任何链接的封包。
如
traceroute to 112.64.161.xx (112.64.161.xx), 30 hops max, 60 byte packets 1 192.168.0.1 (192.168.0.1) 1.600 ms 4.060 ms 4.674 ms 2 192.168.1.1 (192.168.1.1) 9.353 ms 10.142 ms 11.623 ms 3 1.60.79.218.broad.xw.sh.dynamic.163data.com.cn (218.79.60.1) 12.200 ms 12.968 ms 14.723 ms 4 124.74.59.149 (124.74.59.149) 14.886 ms 15.028 ms 15.129 ms 5 124.74.210.153 (124.74.210.153) 98.695 ms 99.076 ms 99.503 ms 6 61.152.86.46 (61.152.86.46) 15.050 ms 7.124 ms 7.280 ms 7 202.97.50.138 (202.97.50.138) 8.162 ms 8.551 ms 20.744 ms 8 * * * 9 219.158.21.229 (219.158.21.229) 19.742 ms 19.930 ms 20.256 ms 10 219.158.98.158 (219.158.98.158) 123.986 ms 124.367 ms * 11 112.64.243.74 (112.64.243.74) 30.387 ms 31.709 ms 32.250 ms 12 112.64.250.154 (112.64.250.154) 23.874 ms 20.964 ms 21.737 ms 13 112.64.161.xx (112.64.161.xx) 20.692 ms 19.687 ms 19.178 ms
上图为traceroute的一个实验,当 192.168.0.1收到封包后,将封包的TTL值减1,并发送给主机一个ICMP协议的数据包,将数据包传给下一个主机192.168.1.1,如此类同,而传给服务器的那个ICMP封包的状态是RELATED。
这里需要说明的是,RELATE与协议无关,只要回应来的封包是因为本机先送出去的一个封包导致另一个连接产生,而这一条新链接上的所有封包都属于RELATED状态的封包。
4.4 INVALID
INVALID状态是指状态不明的包,不属于上面三种状态,因此一般视这种状态为恶意软件包,DROP掉。
Iptables -A INPUT -p all -m state –state INVALID -j DROP
5 Netfilter/iptables 高级技巧
iptables的基本规则这里就不多讲了,互联网上这方面资料是很全面的,在写完策略的时候,注意对策略的优化,防火墙的匹配规则从上至下,写策略要把握好一个原则就是:
越热门(匹配命中次数越高者)规则越写在前面,不过有时候我们难衡量那个服务也比较热门,netfilter设计了一个统计功能
[root@fc16 ~]# iptables -L -n -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 14051 10M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Netfiler的2个模块,multiport模块和iprange模块。
multiport模块将分别对应的端口数在一个规则里表示出来,这样每个服务所需要的匹配数都是一样的。
Iptables -A INPUT -p all -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp –syn -m state NEW \-m multiport –dports 22,23,25,80,110 -j ACCEPT
iprange模块是将规则中的一段IP区域开放,使用iprange可以精简为一条规则
IPTABLES -A INPUT -m iprange –src-range \10.2.20.20-10.2.20.100 -j ACCEPT
如果防火墙后门有很多主机,如果我们对一个主机配100个规则,那么就会有300个规则,这样如果有一个封包需要匹配最后一条,这样就会有299条无效的匹配。这时候可以使用User Define Chain方法。User Define Chain方法是指用户可以自己定一个和INPUT,FORWORD,OUTPUT一样的Chain。
可以使用iptables —N NAME 来新增策略。如过对后面3个主机设置策略,按照IP协议来分,就可以分为 10.2.20.160 Chain,10.2.20.161 Chain.以及10.2.20.162Chian.
在优化策略的时候,没有一定的标准,也没有正确的答案,只要能够让整体防火墙的无效匹配次数降到最低,那么这就是我们想要的。
5.1 RAW
本节将说一下RAW表,如果系统加载了ip_conntrack模块,任何穿越防火墙的链接都会记录在/proc/net/ip_conntrack文件内,但有时候,我们不一定需要记录每一条链接信息。如果我们的规则如下
iptables -A FORWORD -i eth1 -o eth2 -m state –-state NEW -j DROP iptables _A FORWORD -i eth2 -o eth1 -m state –-state NEW -j ACCEPT
这时候,ip_conntrack会自动追踪所有链接,那么我们怎么考虑不去追踪某一个链接呢,RAW就派上用场了。
Iptables -t RAW -A PREROUTING -i eth2 -o eth1 -p tcp --dport 25 -jNOTRACK Iptables -t RAW -A PREROUTING -i eth1 -o eth2 -p tcp --dport 25 -jNOTRACK
RAW table 所带来的好处就是加速,以及增加可追踪的链接数量,因为被RAW Table定义的链接是不会被追踪的,因此,也就不会占用任何的链接追踪数量,此外,RAW TABLES 所定义的链接会直接跳过NAT TABLE 及 ip_conntarck模块,因此可以加速进入防火墙封包的速度,但所定义的链接也会跳过NAT TABLE,所以RAW TABLE定义的连接都无法被NAT 机制所处理。
RAW TABLE 拥有2个Chain,分布为PREROUTING ,OUTPUT .
PREROUTING Chain 如果是网关式防火墙,则PREROUTING Chain可以用来处理防火墙两侧网络之间所建立的链接,因为这些封包都会经过PRERROUTIN Chain,另外也可以处理任何主动链接主机的连接。
OUTPUT Chain 类似NAT TABLE 的OUTPUT chain ,但是PREROUTING Chain无法处理任何有防火墙对外建立的链接,RAW 设计了一个OUTPUT chain。
防火墙的高级应用主要为通信协议的处理,简单的协议和复杂的协议,如FTP,PPTP,H.323 SIP等。