- iptables
- #iptables是与最新的2.6.X版本的linux内核集成在一起的ip信息包过滤系统,比起之前的版本它最大的优点是它可以配置有状态的防火墙,有状态的防火墙能够记住为发送或接收数据包所建立的连接的状态,它可以使用这写状态信息增加其工作效率和速度,本篇博客主要介绍以下几个方面:
- 1、iptables检测数据包的几种状态介绍
- 2、iptables中的表和链以及他们是如何工作的
- 3、介绍iptables的基本语法格式和常用的命令
- 4、实例演示iptables的命令用法
- 5、iptables高级用法-layer7过滤
- 一、iptables识别数据包四种效状态,名称分别为ESTABLISHED,INVALID,NEW和RELATEED,先面分别大概介绍下这几种状态:
- #NEW:当与任何主机通信时发出的第一个数据包的状态即NEW,一般为发起连接方发送的第一个标志为SYN=1的数据包
- #ESTABLISHED:假设与,主机通信时发出的第一个数据包能够通过防火墙,那么后续的你与该主机之间发送和接收到所有数据包状态均为ESTABLISHED
- #RELATED:由一个已经建立的连接所生成的新的连接的状态即为RELATED,例如FTP服务,访问FTP服务器时建立的连接是21端口的发送命令的连接,如果要传输数据则需要按工作模式不同打开其他端口的连接,那么这个连接就是RELATED状态
- #INVALID:非法状态的数据包,也就是不属于以上三种状态的数据包,这类包一般被视为恶心包而被丢弃
- 二、下面介绍iptables的表和链以及他们是如何工作的:
- #iptables的4个表(按生效优先级排序):
- #Raw:优先级最高,该设置一般是为不再让iptables做数据包的链接跟踪处理,提高性能
- #Mangle:这个表主要用来mangle包,来修改包的一些属性如TOS,TTL等
- #Nat:此表仅用于NAT,也就是做包的地址转换用
- #Filter:此表用来过滤数据包,所做的所有根据匹配条件处理数据包都在此表操作
- #iptables的5个链:
- #PREROUTING:在数据包进入网卡之后、路由判断之前对数据包进行修改
- #INPUT:数据包在经过路由后,目标为本地用户空间程序,在进入用户空间前对数据包进行修改
- #OUTPUT:用户空间程序处理之后,由本地发出,再次被路由前修改数据包
- #POSTROUTING:在数据包经过最后的路由,将要通过网卡发送之前,进行对数据包的修改
- #FORWARD:数据包经过第一次路由之后,如果需要转发则进入该链进行修改
- #通过以上的介绍不难发现表是用来定义规则的也就是我们要让iptables干什么的,而链是用来定义这些规则是在什么时候生效的,用下面的图来看iptables是如何工作的:
- #对于链中添加的规则,iptables会按编号从小到大(也就是自上而下)逐条匹配,如果匹配到某条规则,就执行该规则对应的处理动作并结束该链的匹配(某写特殊的处理动作除外,例如LOG),如果没有被拒绝的数据包会进入下一个过程,中间如果经过其他链则继续匹配链中的规则,依次循环处理每一个进出的数据包
- 三、下面介绍iptables的语法格式常用的命令:
- #语法格式:
- iptables [-t TABLE] COMMAND CHAIN [criteria] -j ACTION
- #TABLE(表)已经介绍过了不做熬述,下面说说COMMAND:
- -A:追加,附加,该规则会放在最后
- -I:插入,后跟数字,指定该条规则在链中的位置
- -D:删除,后跟数字或条件
- -R:替换,修改,更新,后跟数字
- -F:清除,清空指定链中的规则
- -N:新建链
- -X:删除链,只能删除自定义的空链且没有被引用
- -E:重命名链
- -P:默认策略,如果链中的所有规则都没匹配到则会匹配默认策略
- -Z:清空计数器,每条规则都有两个计数器:被此规则匹配到的所有数据个数之和;被此规则匹配到的所有数据包的大小之和
- -L:查看,该命令有以下几个子选项:
- -n:纯数字显示,默认会把端口解析为服务
- -v:显示详细信息,-vv,-vvv显示更详细
- -x:显示精确值
- --line-numbers:显示规则行号
- #下面介绍criteria也就是匹配的条件了:
- #基本匹配:
- -s:源IP或NET,!IP/NET表示取反
- -d:目标IP或NET,!取反
- -p:协议{tcp|udp|icmp}
- -i:流入,也就是入站的数据
- -o:流出,出站的数据
- #扩展匹配:
- #隐式扩展:
- -p tcp
- --sport:源端口,后跟单个端口号
- --dport:目标端口,后跟单个端口号
- --tcp-flags:检查标志位,后跟两个参数列表:
- 第一个参数列表:要检查的标志位
- 第二个参数列表:值必须为1的标志位,未列出则必须为0
- -p udp
- --sport:源端口
- --dport:目标端口
- -p icmp
- --icmp-type:检查icmp类型,常用icmp请求为8,回应为0
- #显式扩展:
- -m --state --state {NEW,ESTABLISHED...}:检查数据包状态
- -m multiport:端口池
- --source-ports:源端口,后可跟多个端口
- --destination-ports:目标端口,后可跟多个端口
- --ports:端口,后可跟多个端口
- -m iprange:IP地址池
- --src-range:源IP段,IP-IP,某个IP到某个IP之间的所有有效IP
- --dst-range:目标IP段,IP-IP,同上
- -m connlimit:限定每IP的连接数
- --connlimit-above:连接数,后跟数字
- -m limit:限定速率
- --limit:速率值,例如:3/second,每秒钟3个数据包
- --limit-burst:限定峰值,后跟数字
- -m string:字符串匹配
- --algo bm|kmp --string "XXX":使用bm或者kmp算法,匹配字符串
- -m time:时间限制
- --timestart 8:00 --timestop 18:00 --days {Mon,Tue,Wed..}:定义开始和结束时间以及星期几
- --daysstart --daysstop:定义开始日期和结束日期
- #接下来介绍处理方法:
- -j ACCEPT:允许
- -j DROP:拒绝,丢弃包
- -j REJECT:拒绝,丢弃包并反馈信息
- -j SNAT:源地址转换
- --to-source IP:指定转换为的IP地址
- -j MASQUETADE:地址伪装(同样是源地址转换但适用于外网地址不固定的情况例如ppoe
- -j DNAT:目标地址转换
- --to-destination IP[:port]:指定转换为的IP地址,同时可以跟上端口号
- -j LOG:记录日志(不会中断数据包的匹配)
- --log-prefix “XXXX”:保存的日志文件位置和名称
- 四、实例演示iptables用法
- # iptables作为主机防火墙
- iptables -t filter -A INPU -s 192.168.56.0/24 -j ACCEPT
- //这句的意思是:在filter表INPUT链上添加一条规则,只有数据包源地址是192.168.56.0/24网段的才允许通过INPUT链访问本机用户空间,如果不加-t参数不指定表,则默认为filter表,所以如果在filter表添加修改规则就可以省略-t参数
- iptables -A INPUT -s 192.168.56.0/24 -p tcp --dport 22 -j ACCEPT
- //这个比上上边那条策略更严格也就更安全了,只允许数据包源IP为192.168.56.0/24网段,且协议为tcp,目标端口为22的数据包才允许通过,当然如果你按顺序添加了这两条规则那第2条规则是永远不会生效的,因为第一条规则匹配到后就结束INPUT整个链的匹配了,所以一定要把匹配范围最小的规则放在最上边
- iptables -A INPUT -s 192.168.56.0/24 -p tcp --dport 22 -m state --state NEW -j ACCEPT
- //这条规则比上条更为严格,只有符合上边的规则且数据包状态为NEW的才被允许
- iptables -A INPUT -s 192.168.56.0/24 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW -j ACCEPT
- //这条规则用multiport模块代替了--dport,可以指定同时指定多个端口
- iptables -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- //这个一般和上条规则结合使用,状态为ESTABLISHED的数据包都是回应的数据包也就是已经建立连接后发送和接收的数据包,RELATED是由已建立的连接生成的新连接,均视为安全的数据包允许通过并且最好放在第一条,减少iptables匹配规则的次数
- iptables -L -n -v
- Chain INPUT (policy ACCEPT 4803 packets, 520K bytes)
- pkts bytes target prot opt in out source destination
- 56 3968 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
- 405 31188 ACCEPT all -- * * 192.168.56.0/24 0.0.0.0/0
- 0 0 ACCEPT tcp -- * * 192.168.56.0/24 0.0.0.0/0 tcp dpt:22
- 0 0 ACCEPT tcp -- * * 192.168.56.0/24 0.0.0.0/0 tcp dpt:22 state NEW
- 0 0 ACCEPT tcp -- * * 192.168.56.0/24 0.0.0.0/0 multiport dports 22,80 state NEW
- Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
- pkts bytes target prot opt in out source destination
- Chain OUTPUT (policy ACCEPT 2486 packets, 326K bytes)
- pkts bytes target prot opt in out source destination
- //从执行结果可以看到,该命令是查询已添加的iptables规则的,从中也可以看到,后边条规则匹配到的数据包个数和字节数均为0,也就是说该规则没有生效
- iptables -D INPUT 2
- //这个命令就是删除INPUT链中编号为2的也就是第一条规则
- iptables -P INPUT DROP
- //别忘了设置这个默认策略,默认为DROP,只有被规则匹配到的数据包才被允许,其他全丢弃
- #iptables作为网关防火墙
- iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j SNAT --to-source 3.3.3.3
- //对数据包源IP为192.168.56.0/24网段的,做SNAT源地址转换
- iptables -t nat -A PREROUTING -d 3.3.3.3 -p tcp --dport 80 -j DNAT --to-destination 192.168.56.102
- //对内部的web服务器做DNAT目标地址转换也就是静态映射
- iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
- //检查数据包状态如果syn!=0,但数据包状态为NEW的丢弃,这样的数据包为非正常数据包
- iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j DROP
- iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j DROP
- //符合这两条规则的同样是非正常数据包直接丢弃
- iptables -I INPUT 1 -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT
- iptables -I INPUT 2 -p tcp --dport 22 -m state --state NEW -m recent --set -name SSH
- iptables -I INPUT 3 -p tcp --dprot 22 -m state --state NEW -m recent --update -seconds 300 ! --hitcount 3 --name SSH -j ACCEPT
- //上边的几条规则可以有效防止暴力破解SSH,解释下作用:
- //第一条:限制一个IP最多同时可以建立3个ssh连接
- //第二条:记录访问tcp 22端口的新连接,记录名为SSH
- //第三条:在300秒内没有超过3次连接才被允许
- 五、iptabls高级用法-layer7过滤
- # 通过在应用层过滤,可以过滤像QQ,xunlei这样的协议,过程也不太简单
- 需要软件包:
- netfilter-layer7-v2.22.tar.gz //补丁文件
- linux-2.6.28.10.tar.gz //版本2.6.25-2.6.28的kernel
- iptables-1.4.6.tar.bz2 //iptables源码包
- l7-protocols-2009-05-28.tar.gz //协议文件
- 1、解压补丁包和内核
- tar xf netfilter-layer7-v2.22.tar.gz -C /usr/src/
- tar xf linux-2.6.28.10.tar.gz -C /usr/src/
- 2、给内核打补丁
- ln -s /usr/src/linux-2.6.28.10/ /usr/src/linux
- cd /usr/src/linux
- patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
- 3、配置并编译新内核
- cp /boot/config-2.6.18-308.el5 ./.config //从现有系统中拷贝内核配置文件
- make menuconfig //以菜单方式配置kernel信息
- 进入以下菜单:
- Networking support --> Networking Options --> Network packet filtering framework --> Core Netfilter Configuration,设定如下项:
- <M> Netfilter connection tracking support
- <M> "layer7" match support
- <M> "string" match support
- <M> "time" match support
- <M> "iprange" match support
- <M> "connlimit" match support
- <M> "state" match support
- <M> "conntrack" connection match support
- <M> "mac" address match support
- <M> "multiport" Multiple port match support
- Networking support --> Networking Options --> Network packet filtering framework --> IP: Netfilter Configuration,设定如下项:
- <M> IPv4 connection tracking support (required for NAT)
- <M> Full NAT
- <M> MASQUERADE target support
- <M> NETMAP target support
- <M> REDIRECT target support
- 4、安装新内核并是用新内核启动
- make
- make modules_install
- make install
- 5、备份文件,卸载现有的ipables
- cp /etc/init.d/iptables /tmp //备份启动脚本以后期用
- cp /etc/sysconfig/iptables-config /tmp
- rpm -e --nodeps iptables iptables-ipv6 iptstate
- 6、编译安装iptables并打补丁
- tar xf iptables-1.4.6.tar.bz2 -C /usr/src
- cd /usr/src/iptables-1.4.6/
- cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extensions/
- ./configure --prefix=/usr --with-ksource=/usr/src/linux
- //--with-ksource:指定内核的源码目录
- make && make install
- 7、安装协议包
- tar -xf /root/l7-protocols-2009-05-28.tar.gz -C /usr/src/
- cd ../l7-protocols-2009-05-28/
- make install
- 8、编辑备份的文件,实现sysv风格的iptables
- mv /tmp/iptables-config /etc/sysconfig/
- mv /tmp/iptables /etc/init.d/
- vim /etc/init.d/iptables
- //查找/sbin/$IPTABLES替换为/usr/sbin/$IPTABLES,应该在21和22行
- chkconfig --add iptables //把iptables加入系统服务
- chkconfig iptables on //设置iptables服务自动启动
- 9、使用iptables过滤应用层协议
- 语法格式:
- iptables [-t TABLE] COMMAND chain -m layer7 --l7proto [protocol name] -j [action]
- 尝试过滤QQ协议
- iptables -A FORWARD -m layer7 --l7proto qq -j DROP
- //该规则就可以拒绝转发QQ协议数据包
- 结束,以上均基于本人的自我理解,不足之处大家及时提醒。