1. 程式人生 > >Linux防火牆--iptables(一)基礎篇

Linux防火牆--iptables(一)基礎篇

一.iptables 簡介

      iptables防火牆是由Netfilter專案開發的,iptables提供了全面的協議狀態跟蹤、資料包的應用層檢查、速率限制、指定策略過濾等。而iptables使用Netfilter框架進行過濾。Netfilter本身不對資料包進行過濾---它只是允許可以過濾資料包的函式掛接到核心的位置。


二.iptables的過濾策略

     iptables策略是由一組有序的規則建立的。其中體現在五表五鏈(其中security表是新加入的)

                   

表:1.filter(主要功能是過濾)

        2.nat(用於網路轉換SNAT和DNAT)

        3.mangle(修改分組資料的特定規則)

        4.raw(獨立於Netfilter連線跟蹤子系統起作用的規則)

鏈:

       每個表都有自己的一組內建鏈,而鏈就在資料包流經的必經之路上,上圖可見。

       1.INPUT鏈:當資料包要由核心流向Linux系統中必將經過INPUT鏈的檢查,當然檢查的規則是各個表上的規則。

       2.OUTPUT鏈:linux 系統自己生成的資料包流出本機。

       3.FORWARD鏈:管理經過Linux系統路由的資料包。

       4.PREROUTING鏈:在進行路由判斷之前要進行的規則(DNAT,REDIRECT)

       5.POSTROUTING鏈:在進行路由判斷之後要進行的規則(SNAT,MASQUERADE)

匹配:

      匹配是指資料包滿足所有的匹配條件時,iptables才能根據處理該資料包。

      一般的匹配如下:

      1. --source (-s)  -----  匹配源IP地址。

      2. --destination (-d) ----- 匹配目的IP地址。

      3. --protocol  (-p) -----  匹配協議。

      4. --in-interface (-i)  ----- 匹配流入介面(如eth0)

      5. --out-interface (-o) ----- 流出介面

      6. --state  ------ 匹配一組連線狀態

      7. --string ------ 匹配應用層資料位元組序列

      8. --comment  ------ 在核心記憶體中為一個規則關聯多達256個位元組的註釋資料

目標:

      這指的是當匹配資料包後觸發的一個動作。

      1.ACCEPT  -----  允許資料包通過

      2.DROP  ------  丟棄資料包,不對該資料包做進一步處理,對接收棧而言,相當於對該資料包從沒有接收過。

      3.LOG   ------  將資料包記錄到syslog

      4.REJECT  ------  丟棄資料包,並且作出適當的迴應包文

      5.RETURN  -----  在呼叫鏈中繼續處理資料包

       iptables的執行時基於模組的,載入模組可以實現更復雜的匹配。如ip_conntrack,iptable_nat,ip_nat_ftp。具體一會講到。其次iptables是基於網路層的,也就是說它只能過濾IP層及其以上的資料包,所以iptables不能過濾ARP報文。

      下圖是核心載入的iptables相關的模組。

      這裡介紹一下ip_conntrack 模組。先看看ip_conntrack 實現的狀態追蹤實現。

# iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-options --log-tcp-options
# iptables -A INPUT -m state --state INVALID -j DROP
# iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

     上面的命令是指 遇到非法的連線(INVALID) 會用日誌記錄起來,再忽律該非法資料包,最後一行是指 NEW,ESTABLISHED,RELATED 狀態的可以通過。

       那什麼屬於INVALID的資料包呢,INVALID資料包指的是一個不能被識別為屬於一個已有連線的資料包---例如,突如其來的一個TCP FIN 資料包(不屬於任何TCP連線)就是一個非法連線。而ESTABLLISHED是指一個已經建立的連線。RELATED狀態指的是再Netfilter連線跟蹤子系統中開啟的一個新的連線,且這個連線和現有的連線是相關的,如當資料包傳送給一個沒有繫結UDP套接字的時候,伺服器將返回一個ICMP埠不可達。而NEW呢,當然是指一個新的連線了。看下面的命令。

# iptables -A OUTPUT -m state --state NEW -j DROP
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

     從本機發起的請求全部被DROP了。也就是不能發起一個新的請求了。那狀態追蹤有什麼意義呢?假設這樣一個場景。一臺處於內網的伺服器是不允許自己向外發出tcp連線的,它只被允許客戶端向它發起連線請求,那麼就需要追蹤狀態了。因為正常情況下伺服器不會主動向外請求,如果這個情況真的突然發生了,那麼只可能是伺服器中病毒了,做這樣的狀態追蹤還可以防止中毒伺服器向外發請求,但是有一個問題,追蹤狀態是十分消耗資源的,當載入了ip_conntrack 模組去追蹤連線的話,這樣會限制當前的連線數量,這個具體要修改核心引數 net.ipv4.ip_conntrack_max ,在sysctl.conf 中。

      當然iptables還可以出色的實現地轉轉換,通過 --to-destination 等引數,可以實現目的地址轉化。MASQUERADE 可以實現地址偽裝,算是SNAT的一種,是一種自動化的SNAT,為了防止ADSL導致的IP地址亂變。 

# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp0s3 -j MASQUERADE