本文将以实例分析的方式简单介绍iptables实现防火墙,源/目的地址转换,iptables拓展模块,以及通过重新编译内核凭借l7-filter模块过滤QQ、迅雷等应用程序通信等内容。
iptables是linux中的一款强大的防火墙工具,它通过设置定义规则来实现控制网页通信的作用。由其访问控制的实现,主要是依靠filter表、nat表和mangle表配合五条netfilter链的协同作用,下面简单介绍一下他们作用以及对应关系:
filter用于一般的ip数据包过滤,包含input链、output链和forward链;
nat表的作用转发ip数据包,包含prerouting链、postrouting链和output链。
forward:通过防火墙转发数据;
input:外部访问本机应用程序;
output:本机应用程序向外部发起的访问;
prerouting:定义数据包在进入防火墙且在控制规则生效之前;
postrouting:定义数据包进入防火墙在向外转发之前。
由于iptables本身带有强大的说明文档,命令的具体使用细节这几就不在赘述,只对几个常用的命令进行介绍:
- iptables -t {filter|nat} -L -n
- #查看当前{filter|nat}表
- iptables -t {filter|nat}t -L -n
- #查看当前{filter|nat}表;若后跟--line-number可以查看行号
- iptables -t {filter|nat} -F
- #清空所有{filter|nat}表规则
- iptables -t {filter|nat} -D num
- #删除{filter|nat}表中的第num条规则
- iptables -P {INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUING} {DROP|REJECT|ACCEPT}
- #设置5种链的的3中策略
- service iptables save
- #保存当前iptables,保存路径为/etc/sysconfig/iptables
一、访问控制简单实例分析
首先开启防火墙的路由功能
方法1:
- echo 1 > /pro/sys/net/ipv4/ip_forward
- #此法重启后失效
方法2:
- vim /etc/sysctl
- net.ipv4.ip_forward = 1
- #将此项值设置成1
- service network restart
- #此法永久生效
实例1:允许192.168.0.0/24访问防火墙的SSH服务
- iptables -t filter -A INPUT -s 192.168.0.0/24 -d 192.168.0.71 -p tcp --dport 22 -j ACCEPT
- #filter表,INPUT链,从192.168.0.0/24网段,到192.168.0.71主机,基于tcp协议,目标端口22,采取动作ACCEPT
- iptables -t filter -A OUTPUT -s 192.168.0.71 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
- #filter表,OUTPUT链,从192.168.0.70主机,到192.168.0.0/24网段,基于tcp协议,源端口22,采取动作ACCEPT
- iptables -P INPUT DROP
- #设置INPUT策略:DROP
- iptables -P OUTPUT DROP
- #设置OUTPUT策略:DROP
实例2:允许状态是new和established的访问web服务
- iptables -R INPUT 2 -s 192.168.0.0/24 -d 192.168.0.70 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
- #此时改写链使用-R(replace)设置状态为established的响应请求全部放行
- intables -R OUTPUT 1 -p tcp -m state --state ESTABLISHED -j ACCEPT
- #响应状态 -s源地址 -d目的地址 不做限定(即只要是established状态的包output一律放行)
实例3:拒绝所有192.168.0.0/16网段client来访问DNS解析服务的用户
- iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dprot 53 -j DROP
- #filter表,INPUT链,来自172.160.0.0/16网段,使用UDP协议,目标端口号53,采取动作 DROP
实例4:让内网用户可以相互发邮件
- iptables -A PREROUTING –p tcp --dport 110 –j ACCEPT
- iptebles -A PREROUTING –p tcp --dport 25 –j ACCEPT
- iptables -A FORWARD –p tcp --dport 110 –j ACCEPT
- iptables -A FORWARD –p tcp --sport 110 –j ACCEPT
- iptables -A FORWARD –p tcp --dport 25 –j ACCEPT
- iptables -A FORWARD –p tcp --sport 25 –j ACCEPT
- #邮件接收使用TCP110接口;邮件发送使用TCP25,放行数据转发。
二、iptables实现源地址转换以及目的地址转换
源地址转换:
作用:实现多个内网主机共同使用一个公网IP地址与公网通信。
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 123.1.1.123
- #将192.168.0.0/24网段的地址作为源地址转换成123.1.1.123
地址伪装源地址转换:
作用:使用ADSL拨号上网用户的IP都是由ISP随即分配,所以上述固定外网IP的情况就不在适用了,使用地址伪装能够自动匹配外网ip并实现源地址转换。
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
- #将192.168.0.0/24 网段的所有地址作为源地址转换成公网地址
目的地址转换:
作用:实现公网用户通过公网地址,访问内网服务器。
- iptables -t nat -A PREROUTING -d 123.1.1.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.72
- #将外网的web访问请求(80端口)通过DNAT转发至内网web服务器192.168.0.72
- iptables -t nat -A PREROUTING -d 123.1.1.123 -p tcp --dport 22 -j DNAT --to-destination 192.168.0.73
- #将外网的ssh访问请求(22端口)通过DNAT转发至内网ssh服务器192.168.0.73
- iptables -t nat -A PREROUTING -d 123.1.1.123 -p udp --dport 53 -j DNAT --to-destination 192.168.0.74
- #将外网的DNS解析请求(53端口)通过DNAT转发至内网DNS服务器192.168.0.74
- iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
- #转发所有状态为ESTABLISHED的数据包
三、常用模块扩展
iprange:地址范围匹配
- iptables -A FORWARD -m iprange --src-range 162.168.0.1-192.168.0.100 --dst-range 172.16.0.1-172.16.0.100 -j ACCEPT
- #限制源地址与目的地址的区间
multipoint:多端口匹配
- iptables -A FORWARD -p tcp -m multipoint --destination-ports 22,25,80,110 -m state --state NEW,ESTABLISHED -j ACCEPT
- #凡是目的端口匹配,状态匹配的就允许传输
string:传输内容中字符串匹配
- iptableis -A FORWARD -m string --string "xxxx.com" --algo bm -j REJECT
- #屏蔽含有xxxx.com的内容
传输日志功能启用:日志的向磁盘的写入会大大消耗系统资源,建议生产环境中关闭此功能。
- iptables -A INPUT -d 192.168.0.1 -p tcp --dport 22 -j LOG --log-prefix "SSH LOG:"
- #开启日志功能,并在每条日志前加上关机字符串
- iptables -A INPUT -d 192.168.0.1 -p tcp --dport 22 -m limit 6/minute -j LOG --log-prefix "SSH LOG:"
- #限制写入日志的频率每分钟6个
四、使用l7-filter模块控制特定的应用程序访问网络
下面的内容旨在通过编译内核加入l7-filter模块,从而使iptables按照应用程序的特征来实现控制功能。
1.解压内核并创建软连接
- tar xvf linux-2.6.28.10.tar.gz -C /usr/src
- cd /usr/src
- ln -vs linux-2.6.28.10 linux
- cd linux
2.给内核打入netfilter补丁
- tar xvf netfilter-layer7-v2.22.tar.gz -C /usr/src
- cd /usr/src/linux
- patch -p1 < /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
3.配置内核编译选项
若您不清楚内核的基本配置选择策略,建议复制当前系统配置文件,并以此为蓝本完成本次内核编译。
- cp /boot/config-您当前内核版本 /usr/src/linux/.config
【Networking support】 → 【Networking Options】 → 【Network packet filtering framework】 →【Code 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
上述模块配置完成后保存退出配置界面
- make
- make modules_install
- make install
编译安装完成后,重启在grub界面会出现新内核Title,选择并进入新内核系统。
4.备份iptables的配置文件和服务脚本
- cp /etc/init.d/iptables ~/
- cp /etc/sysconfig/iptables-config ~/
- #全部备份到root目录方便查找
5.卸载原有的iptables软件包
- rpm -e --nodeps iptables-ipv6 iptables iptstate
- #忽略关联形式卸载原iptables
6.安装新的iptables
- tar xvf iptables-1.4.6.tar.gz -C /usr/src
- #解压iptables文件到指定目录
- cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/* /usr/src/iptables-1.4.6/extensions/
- #将之前解压的netfilter中的两个文件复制到对应iptables的目录中去
- cd /usr/src/iptables-1.4.6
- ./configure --prefix=/usr --with-ksource=/usr/src/linux
- #编译iptables
- make
- make install
7.安装l7-protocol
它用于定义iptables可以识别哪些应用程序的特征
- tar xvf l7-protocols.tar.gz
- cd l7-protocols
- make install
- #解压并安装
/etc/l7-protocols/protocols定义了所有能够限制的应用程序
8.将备份的服务控制脚本复制回去
- cp /root/iptables /etc/init.d/
- vim /etc/init.d/iptables
- :%s@/sbin/$IPTABLES@/usr/sbin/$IPTABLES@g
- #全局正则表达式查找替换将原路径换成新路径
9.复制iptables的配置文件
- cp /root/iptables-config /etc/sysconfig/
重启服务
- service iptables restart
添加控制
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto qq -j REJECT
- #禁止内网用户使用qq通信
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto edonkey -j REJECT
- #禁止内网用户使用电驴
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto bittorrent -j REJECT
- #禁止内网用户使用bt
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto xunlei -j REJECT
- #禁止内网用户使用迅雷
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto msnmessenger -j REJECT
- #禁止内网用户使用MSN
- iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto pplive -j REJECT
- #禁止内网用户使用pplive
保存iptables
关于iptables的配置和使用就先写到这里,以上内容在您实现过程中出现的任何问题,欢迎在此交流; 并请各位高手前辈大神达人予以批评指正,谢谢!
service iptables save