實例簡釋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的配置和使用就先寫到這裏,以上內容在您實現過程中出現的任何問題,歡迎在此交流; 並請各位高手前輩大神達人予以批評指正,謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章