实例简释iptables + l7-filter配置及使用

 本文将以实例分析的方式简单介绍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本身带有强大的说明文档,命令的具体使用细节这几就不在赘述,只对几个常用的命令进行介绍:

  
  
  
  
  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. #打开配置界面 

【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 

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

  
  
  
  
  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定义了所有能够限制的应用程序

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

你可能感兴趣的:(职场,iptables,休闲,l7-filter)