本文将以实例分析的方式简单介绍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 + l7-filter配置及使用_第1张图片

由于iptables本身带有强大的说明文档,命令的具体使用细节这几就不在赘述,只对几个常用的命令进行介绍:

   
   
   
   
  1. iptables -t {filter|nat} -L -n 
  2. #查看当前{filter|nat}表 
  3. iptables -t {filter|nat}t -L  -n 
  4. #查看当前{filter|nat}表;若后跟--line-number可以查看行号 
  5. iptables -t {filter|nat} -F 
  6. #清空所有{filter|nat}表规则 
  7. iptables -t {filter|nat} -D num 
  8. #删除{filter|nat}表中的第num条规则 
  9.  
  10. iptables -P {INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUING}  {DROP|REJECT|ACCEPT} 
  11. #设置5种链的的3中策略 
  12.  
  13. service iptables save 
  14. #保存当前iptables,保存路径为/etc/sysconfig/iptables 

一、访问控制简单实例分析

首先开启防火墙的路由功能

方法1

   
   
   
   
  1. echo 1 > /pro/sys/net/ipv4/ip_forward 
  2. #此法重启后失效 

方法2

   
   
   
   
  1. vim /etc/sysctl 
  2. net.ipv4.ip_forward = 1 
  3. #将此项值设置成1 
  4. service network restart 
  5. #此法永久生效 

实例1:允许192.168.0.0/24访问防火墙的SSH服务

   
   
   
   
  1. iptables -t filter -A INPUT    -s 192.168.0.0/24 -d 192.168.0.71 -p tcp --dport 22 -j ACCEPT  
  2. #filter表,INPUT链,从192.168.0.0/24网段,到192.168.0.71主机,基于tcp协议,目标端口22,采取动作ACCEPT   
  3. iptables -t filter -A OUTPUT -s 192.168.0.71 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT 
  4. #filter表,OUTPUT链,从192.168.0.70主机,到192.168.0.0/24网段,基于tcp协议,源端口22,采取动作ACCEPT 
  5. iptables -P INPUT DROP   
  6. #设置INPUT策略:DROP 
  7. iptables -P OUTPUT DROP 
  8. #设置OUTPUT策略:DROP 

实例2:允许状态是new和established的访问web服务

   
   
   
   
  1. 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 
  2. #此时改写链使用-R(replace)设置状态为established的响应请求全部放行  
  3. intables -R OUTPUT 1 -p tcp -m state --state ESTABLISHED -j ACCEPT 
  4. #响应状态 -s源地址 -d目的地址 不做限定(即只要是established状态的包output一律放行) 

实例3:拒绝所有192.168.0.0/16网段client来访问DNS解析服务的用户

   
   
   
   
  1. iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dprot 53 -j DROP           
  2. #filter表,INPUT链,来自172.160.0.0/16网段,使用UDP协议,目标端口号53,采取动作 DROP 

实例4:让内网用户可以相互发邮件

   
   
   
   
  1. iptables -A  PREROUTING –p tcp --dport 110 –j ACCEPT 
  2. iptebles -A  PREROUTING –p tcp --dport 25 –j ACCEPT 
  3. iptables -A  FORWARD –p tcp --dport 110 –j ACCEPT 
  4. iptables -A  FORWARD –p tcp --sport 110 –j ACCEPT 
  5. iptables -A  FORWARD –p tcp --dport 25 –j ACCEPT 
  6. iptables -A  FORWARD –p tcp --sport 25 –j ACCEPT 
  7. #邮件接收使用TCP110接口;邮件发送使用TCP25,放行数据转发。 

二、iptables实现源地址转换以及目的地址转换

源地址转换:

作用:实现多个内网主机共同使用一个公网IP地址与公网通信。

   
   
   
   
  1. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 123.1.1.123 
  2. #将192.168.0.0/24网段的地址作为源地址转换成123.1.1.123 

地址伪装源地址转换:

作用:使用ADSL拨号上网用户的IP都是由ISP随即分配,所以上述固定外网IP的情况就不在适用了,使用地址伪装能够自动匹配外网ip并实现源地址转换

   
   
   
   
  1. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE 
  2. #将192.168.0.0/24 网段的所有地址作为源地址转换成公网地址 

目的地址转换:

作用:实现公网用户通过公网地址,访问内网服务器。

   
   
   
   
  1. iptables -t nat -A PREROUTING -d 123.1.1.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.72     
  2. #将外网的web访问请求(80端口)通过DNAT转发至内网web服务器192.168.0.72 
  3. iptables -t nat -A PREROUTING -d 123.1.1.123 -p tcp --dport 22 -j DNAT --to-destination 192.168.0.73     
  4. #将外网的ssh访问请求(22端口)通过DNAT转发至内网ssh服务器192.168.0.73  
  5. iptables -t nat -A PREROUTING -d 123.1.1.123 -p udp --dport 53 -j DNAT --to-destination 192.168.0.74     
  6. #将外网的DNS解析请求(53端口)通过DNAT转发至内网DNS服务器192.168.0.74 
  7. iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT 
  8. #转发所有状态为ESTABLISHED的数据包 

三、常用模块扩展

iprange:地址范围匹配

   
   
   
   
  1. 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 
  2. #限制源地址与目的地址的区间 

multipoint:多端口匹配

   
   
   
   
  1. iptables -A FORWARD -p tcp -m multipoint --destination-ports 22,25,80,110 -m state --state NEW,ESTABLISHED -j ACCEPT 
  2. #凡是目的端口匹配,状态匹配的就允许传输 

string:传输内容中字符串匹配

   
   
   
   
  1. iptableis -A FORWARD -m string --string "xxxx.com" --algo bm -j REJECT 
  2. #屏蔽含有xxxx.com的内容 

传输日志功能启用:日志的向磁盘的写入会大大消耗系统资源,建议生产环境中关闭此功能。

   
   
   
   
  1. iptables -A INPUT -d 192.168.0.1 -p tcp --dport 22 -j LOG --log-prefix "SSH LOG:" 
  2. #开启日志功能,并在每条日志前加上关机字符串 
  3. iptables -A INPUT -d 192.168.0.1 -p tcp --dport 22 -m limit 6/minute -j LOG --log-prefix "SSH LOG:" 
  4. #限制写入日志的频率每分钟6个 

四、使用l7-filter模块控制特定的应用程序访问网络

下面的内容旨在通过编译内核加入l7-filter模块,从而使iptables按照应用程序的特征来实现控制功能。

1.解压内核并创建软连接

    
    
    
    
  1. tar xvf linux-2.6.28.10.tar.gz -C /usr/src 
  2. cd /usr/src 
  3. ln -vs linux-2.6.28.10 linux 
  4. cd linux 

2.给内核打入netfilter补丁

   
   
   
   
  1. tar xvf netfilter-layer7-v2.22.tar.gz  -C /usr/src 
  2. cd /usr/src/linux 
  3. patch -p1 < /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch  

3.配置内核编译选项

若您不清楚内核的基本配置选择策略,建议复制当前系统配置文件,并以此为蓝本完成本次内核编译。

   
   
   
   
  1. cp /boot/config-您当前内核版本  /usr/src/linux/.config 
  1. make menuconfig 
  2. #打开配置界面 

实例简释iptables + l7-filter配置及使用_第2张图片

【Networking support】 → 【Networking Options】 → 【Network packet filtering framework】 →【Code Netfilter Configuration】

 Netfilter connection tracking support 

 “layer7” match support

 “string” match support

 “time”  match support

 “iprange”  match support

 “connlimit”  match support

 “state”  match support

 “conntrack”  connection  match support

 “mac”  address  match support

  "multiport" Multiple port match support

【Networking support】 → 【Networking Options】 →【Network packet filtering framework】 → 【IP: Netfilter Configuration】

IPv4 connection tracking support (required for NAT)

Full NAT

MASQUERADE target support                                                       

NETMAP target support                                                         

REDIRECT target support 

上述模块配置完成后保存退出配置界面

   
   
   
   
  1. make 
  2. make modules_install 
  3. make install 

编译安装完成后,重启在grub界面会出现新内核Title,选择并进入新内核系统。

4.备份iptables的配置文件和服务脚本

   
   
   
   
  1. cp /etc/init.d/iptables ~/ 
  2. cp /etc/sysconfig/iptables-config ~/ 
  3. #全部备份到root目录方便查找 

5.卸载原有的iptables软件包

   
   
   
   
  1. rpm -e --nodeps iptables-ipv6 iptables iptstate  
  2. #忽略关联形式卸载原iptables 

6.安装新的iptables

   
   
   
   
  1. tar xvf iptables-1.4.6.tar.gz -C /usr/src 
  2. #解压iptables文件到指定目录 
  3. cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/* /usr/src/iptables-1.4.6/extensions/ 
  4. #将之前解压的netfilter中的两个文件复制到对应iptables的目录中去 
  5. cd /usr/src/iptables-1.4.6 
  6. ./configure --prefix=/usr --with-ksource=/usr/src/linux 
  7. #编译iptables 
  8. make  
  9. make install 

7.安装l7-protocol

它用于定义iptables可以识别哪些应用程序的特征

   
   
   
   
  1. tar xvf l7-protocols.tar.gz  
  2. cd l7-protocols 
  3. make install  
  4. #解压并安装 

/etc/l7-protocols/protocols定义了所有能够限制的应用程序

实例简释iptables + l7-filter配置及使用_第3张图片

8.将备份的服务控制脚本复制回去

   
   
   
   
  1. cp /root/iptables /etc/init.d/ 
  2. vim /etc/init.d/iptables 
  3. :%s@/sbin/$IPTABLES@/usr/sbin/$IPTABLES@g 
  4. #全局正则表达式查找替换将原路径换成新路径 

9.复制iptables的配置文件

   
   
   
   
  1. cp /root/iptables-config /etc/sysconfig/ 

重启服务

   
   
   
   
  1. service iptables restart 

添加控制

   
   
   
   
  1. iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto qq -j REJECT 
  2. #禁止内网用户使用qq通信 
  3. iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto edonkey -j REJECT 
  4. #禁止内网用户使用电驴 
  5. iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto bittorrent -j REJECT 
  6. #禁止内网用户使用bt 
  7. iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto xunlei -j REJECT 
  8. #禁止内网用户使用迅雷 
  9. iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto msnmessenger -j REJECT 
  10. #禁止内网用户使用MSN 
  11. iptables -A FORWARD -s 192.168.10.0/24 -m layerl7 --l7proto pplive -j REJECT 
  12. #禁止内网用户使用pplive 

保存iptables

   
   
   
   
  1. service iptables save 

关于iptables的配置和使用就先写到这里,以上内容在您实现过程中出现的任何问题,欢迎在此交流; 并请各位高手前辈大神达人予以批评指正,谢谢!