天天看點

深入了解linux下iptables

   網際網路的公開,我們面臨很多便利,同時也面臨許多安全問題,資料加密,安全通路控制,等等,我們最常見的就是在網絡的進出口進行通路的控制,這時防火牆就出現了,常見的防火牆分為硬體防火牆和軟體防火牆,硬體防火牆在進行資料處理上會較快,控制比較嚴格,但價格都不菲,現在很多中小型企業都會采用軟體防火牆。下面我們就深入介紹linux下iptables的設定。

原理簡介:防火牆工作在網絡邊緣或者主機邊緣,防火牆為了實作通路控制,會包括很多政策(policy),數條規則(rules)就組成了政策,常見的防火牆根據工作的層次不同可以分為工作在三層的網絡層防火牆和七層的代理伺服器(應用型網關),網絡層防火牆根據資料包首部的ip位址或端口進行規則比對,七層防火牆根據資料包的應用協定進行規則比對和處理,安全性更高但效率較低,為了防止防火牆成為瓶頸,我們常會采用分布式防火牆,負載均衡的防火牆,或防火牆關聯系統。

linux下的防火牆:iptables,早期叫ipfirewall,能夠實作對資料包進行檢查并進行過濾的軟體,而tcp/ip協定棧是放在核心(kernel)中,是以要想規則生效,就必須把這些規則放進核心中;當兩個網絡進行通信時,由于網卡的驅動程式都放在核心中,主機會檢查路由表,直接将資料包進行轉發,而我們的防火牆規則則是在使用者空間中,無法對資料進行控制,這是早期ipfirewall遇到的問題。當發展到2.0版本時就變成ipchains,發展到現在就演變成iptables,他們都是工作在使用者空間定義的規則。工作在核心空間的結合iptables的規則叫做netfilter。

1)防火牆的三表五鍊:三表分别是filter,nat,mangle,五鍊分别PREROUTING,INPUT,FORWRAD,OUTPUT,POSTROUTING。     

  1. filter:允許/不允許 
  2.   INPUT,FORWARD,OUTPUT 
  3.  nat:位址修改 
  4.   PREROUTING,OUTPUT,POSTROUTING 
  5.  mangle:修改封包資料 
  6.   PREROUTING,INPUT,FORWRAD,OUTPUT,POSTROUTING
防火牆政策:通則全通,堵則單堵,自上而下比對規則

2)iptables的規則:

   iptables [-t  table] COMMAND chain  CRETIRIA  -j  ACTION

   COMMAND

   鍊管理指令:

  1. -P  設定預設政策(門是否開) 
  2.   # iptables  -P INPUT {DROP|ACCECT} 立即生效 
  3. -F  清空規則鍊 
  4.   # iptables  -t  nat -F PREROUTING(表類型必須指定,鍊類型也要指定) 
  5. -N  使用者自定義的新鍊  必須和系統鍊關聯才能生效 
  6.   # iptables  -N  inbound_tcp_web 
  7. -X  删除鍊,之前必須清空鍊 
  8. -E  給自定義的name改名 
  9. -Z  清空鍊預設規則及其他規則的計數器    
  規則管理指令:
  1. -A  在鍊的最後追加 
  2. -I  num 3 插傳入連結中第幾條 
  3. -R  修改(替換)規則 
  4.  # iptables -R  -s  172.16.0.0/16  -p udp  --dport 
  5.  # iptables  -R 3  替換第幾行 
  6. -D  num  删除第幾行  
   檢視指令:
  1. -L  
  2.   -n  以數字方式顯示 
  3.   -v  顯示詳細資訊 -vv更詳細的 -vvv更詳細的 
  4.   -x  檢視計數器的精确值(預設當增加時會換算機關) 
  5.   --line-numbers  顯示行号
   比對标準:      通用比對:
  1. -s,--src,--source  源位址比對(必須指定ip/netmask) 
  2.    IP,NETWORK/NETMASK,0.0.0.0/0.0.0.0 
  3. -d 目标位址 
  4. -p 協定比對(tcp|udp|icmp) 
  5. -i 資料的流入接口 
  6.   -i  eth0 
  7. -o  資料流出接口 
  8.   -o  eth0 
  9.  用在OUTPUT,POSTROUTING,使用的範圍不同
     擴充比對:        隐含擴充(指定某種特定端口,協定的擴充)
  1. -p tcp 
  2.   --dport 不能指定間隔端口,隻能21-23 
  3.   --sport 
  4.   --tcp-flags 參數兩個:檢查的标志位,必須為1的标志位 
  5.       SYN,ACK,FIN,PSH,RST,URG  tcp的标志位 
  6.       例:--tcp-flags SYN,ACK,FIN,RST  syn 相當于--syn   第一次連接配接的資料包 
  7.     (比對syn為1,其他為零的資料包) 
  8. -p  udp 
  9.     --dport 不能指定間隔端口,隻能21-23 
  10.     --sport 
  11. -p   icmp 
  12.     --icmp-type 
  13.       echo-request  8 請求回顯 
  14.       echo-reply    0 響應  
       顯式擴充         -m 指定子產品           -p tcp -m  multiport --dports 21,23,80  比對多個端口    
  1. l7-filter  (應用層子產品) 
  2.           connlimit   限制某個服務對于每個ip每次最多發起的最大連接配接數 
  3.            --connlimit-above 5   大于5個   拒絕 
  4.            !--connlimit-above  5  小于5的 接受 
  5.        例: #iptables  -p tcp --syn --dport 23 -m !--connlimit-above 2 -j ACCEPT 

          iprange     

  1. --src-range 
  2. --dst-range 
  3.        例:#iptables -A FORWARD -m  iprange  --src-range  172.16.0.1-172.16.0.100  -dst-range 172.16.0.1-172.16.0.2 -p tcp --dport 80 -j  ACCEPT 
  1. --limit rate 3/minutes    限制比對資料包的頻率 
  2. --limit-burst number      限制峰值
           mac             
  1. --mac-source  比對mac的源位址,和防火牆在同一網段的主機的mac位址 
  1. --source-ports       源端口 
  2. --destination-ports  目标端口 最多一次指定15個端口 
  3. --ports 
  1. --algo   字元串比對算法 bm|kmp 
  2. --from offset 
  3. --to 
  4. --string 
  5. 例: 
  6. #iptables  -A  FORWARD  -m  string --string "qq" --algo bm -j REJECT 
          time 
           
      
  1.  --timestart   HH:MM 
  2.  --timestop    HH:MM 
  3.  --days        周幾 
  4. --datestart    YYYY:MM:DD:hh:mm 
  5. --datestop 
      
          LOG
            
      
  1. --log-prefix 
  2.  例: 
  3. #iptables  -A INPUT  -d  172.16.100.1 -p  tcp --dport 22  -j  LOG  --log-prefix  "IPTABLES  ..." 
    
 ACTION:
   -j 
   
      
  1. DROP           默默的拒絕 
  2.  REJECT         悄悄丢棄 
  3.  ACCEPT         接受 
  4.  custom_chain   轉向自定義的鍊 
  5.  SNAT          源位址轉換 
  6.  DNAT          目标位址轉換 
  7.  MASQUERADE    源位址僞裝 
  8.  REDIRECT      端口重定向 
  9.  MARK(mangle)标記 
  10.  RETURN        傳回重新比對 
  11.  LOG           顯示日志 
 狀态檢測:防止其他木馬的僞裝(基于tcp)
   
      
  1. NEW          第一次連接配接(SYN為1,其他位為0) 
  2. ESTABLISHED  已經建立的連接配接(ACK為1,其他位為0) 
  3. INVALID      不合法的連接配接(ACK和RST均為1) 
  4. RELATED      相關聯的連接配接(一般是用于ftp) 
  1.  例:#iptables -A INPUT  -s 192.168.0.0/24 -d 192.168.0.100 -p tcp --dport 22 -m state --state NEW,ESTABLSHED  -j ACCEPT 
  2.     放行所有的已建立連接配接的服務出去 
  3. #iptables -A OUTPUT -s 192.168.0.100  -m state --state ESTABLSHED -j ACCEPT 
3)iptables的相關配置檔案:
  規則的配置檔案:/etc/sysconfig/iptables  
    
      
  1. #service iptables  save 
  2. #iptables-save > /etc/sysconfig/iptables.2    儲存檔案 
  3. #iptables-restore < /etc/sysconfig/iptables.2 手動生效 
4)iptables相關規則的書寫:
 允許ssh連入,
  
      
  1. #iptables -t filter -A  INOUT  -s  192.168.0.0/24 -d  192.168.0.100 -p tcp --dport 22 -j ACCECT 
  2.  #iptables -t filter -A  INOUT  -s  192.168.0.100 -d  192.168.0.0/24 -p tcp --sport 22 -j ACCECT 
 允許192.168.0.0/24網段ping本主機及本主機ping本主機
 
      
  1. #ipables  -R  INPUT 2 -s 192.168.0.0/24 -d 192.168.0.100  -p  tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
  2.  #iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT 
  3.  #iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT 
  
   允許172.16.0.0/16網段連接配接192.168.0.100的httpd,samba,sshd服務,但拒絕172.16.0.100:
   
      
  1. #iptables -A INPUT -s 172.16.0.100 -d 192.168.0.100 -m multiport --destination-ports 22,80,139,445,137,139  -j  DROP 
  2. #iptables -A INPUT -s 172.16.0.0/16 -d 192.168.0.100 -p tcp -m multiport --destination-ports  22,80,139,445 -m state --state NEW,ESTABLSHED -j ACCEPT 
  3. #iptables -A INPUT -s 172.16.0.0/16 -d 192.168.0.100 -p udp -m multiport --destination-ports  137,138 -m state --state NEW -j ACCEPT 
  4. #iptables -A OUTPUT -m state --state ESTABLSHED -j ACCEPT 
  5. #iptables -P INPUT DROP 
  6. #iptables -P OUTPUT DROP 
  
  允許外網172.16.0.100通路内網192.168.10.0/24
   
      
  1. #iptables  -A FORWARD -s 172.16.0.0/16 -p icmp --icmp-type 8 ACCEPT 
  2. #iptables  -A FORWARD -d 172.16.0.0/16 -p icmp --icmp-type 0 ACCEPT 
  限制dns:
  #iptables  -t filter -A  INPUT -s 172.16.0.0/16  -p  udp  --dport  53  -j DROP
  
  源位址轉換:SNAT
   
      
  1. #iptables -t nat -A POSTROUTING  -s 192.168.0.0/24 -j SNAT --to-source 172.16.100.1 
 
 目标位址轉換:DNAT 
   
      
  1. #iptables -t nat -A PREROUTING  -d 192.168.0.15 -j DNAT --to-destination 172.16.0.50 
  2. 位址僞裝 :MASQUERADE(當通路的外網位址是動态時使用位址僞裝) 
  3. #iptables -t nat -A POSTROUTING  -s 192.168.0.0/24 -j MASQUERADE 
#########################################################################
5)編譯 l7-filter,擴充iptables,現在由clearfoundation組織接收進行開發
   對核心打更新檔
    
      
  1. # tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src 
  2. # tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src 
  3. # ln –s  /usr/src/linux-2.6.28.10/   /usr/src/linux 
  4. # cd /usr/src/linux/ 
  5. # patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch  
  6. # cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config 
  7. # make  menuconfig 
這裡為編譯核心特别注意幾個選項:
   Networking support → Networking Options →Network packet filtering framework    →Core Netfilter Configuration

      
  1. <M>  Netfilter connection tracking support  
  2. <M>  “layer7” match support 
  3. <M>  “string” match support 
  4. <M>  “time”  match support 
  5. <M>  “iprange”  match support 
  6. <M>  “connlimit”  match support 
  7. <M>  “state”  match support 
  8. <M>  “conntrack”  connection  match support 
  9. <M>  “mac”  address  match support 
  10. <M>   "multiport" Multiple port match support 
Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration      
  1. <M> IPv4 connection tracking support (required for NAT) 
  2. <M>   Full NAT 
  3. <M>     MASQUERADE target support                                               
  4. <M>     NETMA target support                                                  
  5.  <M>     REDIRECT target support  
注:這裡的其他選項可以根據自己的需要安裝相應的子產品

開始編譯核心
  
      
  1. #make  
  2. #make modules_install 
  3. #make install 
  4. #reboot《-------這裡必須要重新開機并選用編譯的核心 
配置iptables:
    
      
  1. # cp /etc/init.d/iptables ~/iptables 
  2. # cp /etc/init.d/iptables-config  ~/ 
  3. # rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps《----解除安裝原來的iptables 
  4. # tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src 
  5. # cd /usr/src/iptables-1.4.6 
  6. # cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-    2.6.20forward/libxt_layer7.*   ./extensions/《----拷貝擴充子產品檔案 
  7. #./configure  --prefix=/usr  --with-ksource=/usr/src/linux 
  8. #make  && make install 
編譯l7-filter:
    
      
  1. # tar zxvf l7-protocols-2009-05-28.tar.gz 
  2. # cd l7-protocols-2009-05-28 
  3. # make install 
  4. # vim ~/iptables 
  5.    把文中/sbin/$IPTABLES 都改為/usr/sbin/$IPTABLES 
  6. # mv ~/iptables  /etc/rc.d/init.d/ 
  7. # cp  ~/iptables-config  /etc/sysconfig/ 
  8. # service iptables start 
  9. # hash -r 
    
這裡您就可以使用l7的擴充功能了,可以基于各種應用層協定進行控制。

      
  1. 控制192.168.0.0/24網段的主機不能通路qq: 
  2. #iptables -t filter -A FORWARD -s 192.168.0.0/24 -m layer7 --l7proto qq -j REJECT 

繼續閱讀