實例簡釋iptables + l7-filter配置及使用

 本文將以實例分析的方式簡單介紹iptables實現防火牆,源/目的地址轉換,iptables拓展模塊,以及經過從新編譯內核憑藉l7-filter模塊過濾QQ、迅雷等應用程序通訊等內容。node

iptables是linux中的一款強大的防火牆工具,它經過設置定義規則來實現控制網頁通訊的做用。由其訪問控制的實現,主要是依靠filter表、nat表和mangle表配合五條netfilter鏈的協同做用,下面簡單介紹一下他們做用以及對應關係:linux

filter用於通常的ip數據包過濾,包含input鏈、output鏈和forward鏈;web

nat表的做用轉發ip數據包,包含prerouting鏈、postrouting鏈和output鏈。正則表達式

forward:經過防火牆轉發數據;vim

input:外部訪問本機應用程序;服務器

output:本機應用程序向外部發起的訪問;網絡

prerouting:定義數據包在進入防火牆且在控制規則生效以前;ssh

postrouting:定義數據包進入防火牆在向外轉發以前。tcp

因爲iptables自己帶有強大的說明文檔,命令的具體使用細節這幾就不在贅述,只對幾個經常使用的命令進行介紹:ide

  
  
  
  
  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

  
  
  
  
  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,放行數據轉發。 

2、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的數據包 

3、經常使用模塊擴展

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個 

4、使用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的配置和使用就先寫到這裏,以上內容在您實現過程當中出現的任何問題,歡迎在此交流; 並請各位高手前輩大神達人予以批評指正,謝謝!
相關文章
相關標籤/搜索