歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux的防火牆功能IPtables詳解之一

linux的防火牆功能IPtables詳解之一

日期:2017/3/1 13:35:57   编辑:關於Linux
一、iptables簡介
Linux的2.4版內核引入了一種全新的包過濾引擎,稱為Netfilter。
控制Netfilter的工具iptables是Linux 2.2版內核中比較老的命令ipchains的兄弟。
iptables把有次序的規則"鏈(chains)"應用到網絡包上。
鏈的集合就構成了"表(tables)",用於處理特殊類型的流量。

例如,默認的iptables表名叫"filter(過濾器)"。網絡數據包都使用這個表裡的規則鏈來過濾。
過濾器表包含3個默認鏈。
對於每個包來說,內核都會選擇三個鏈中適合的一個進行處理:
. FORWARD鏈規則, 用於從一個網絡接口輸入,再轉發到另一個網絡接口輸出的包;
. INPUT鏈規則, 用於以本機為目的地的包;
. OUTPUT鏈規則, 用於從本地主機發出的包;

這3個標准鏈通常能夠滿足兩個網絡接口之間防火牆的全部需要。
如果必要,您還可以定義一個定制的配置,支持更復雜的記賬或者路由場合。

除了filter表之外,iptables還包含"NAT"和"mangle"表。
. NAT表包含的規則鏈控制著NAT(Network Address Translation,網絡地址轉換,這裡的“nat”就是iptables表名,
"NAT"是一般地址轉換機制的叫法)。
12.4.6節討論了NAT,本節給出一個正在起作用的nat表的例子。
在本節後面的內容裡,我們會使用nat表的PREROUTING鏈來做反IP欺騙的包過濾。
. mangle表包含了鏈可以修改或者改變在NAT和包過濾之外的網絡包的內容。
雖然mangle表對於做包的特殊處理很方便,比如重新設定IP包的ttl值,但是在大多數工作環境中一般不會用到它。
我們在這一節裡只討論filter和nat表,而把mangle表留給讀者自己去探索。

圖1比較完整地展示了一個數據包是如何經過防火牆的,考慮到節省空間,該圖實際上包了三種情況:
. 來自外部,以防火牆(本機)為目的地的包,走圖1中 "自上至下左邊" 路徑;
. 由防火牆(本機)生成並輸出的包, 走圖1中從"本地進程"開始,自上至下左邊的路徑;
. 來自外部,目的地是其它主機的包, 走圖1中"自上至下走右邊"的路徑;
圖1:
vc/J2dPDtcRtYW5nbGUgse21xM28yr4svs3T0M28Msv5z9TKvrXEuPzOqsflzvq1xMK3vrbNvC48YnI+Cs28Mjo8YnI+CjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20140219/2014021909250011.jpg" width="700" height="855.339805825" alt=""http://zz.2cto.com/seo/" target="_blank" class="keylink">seopJnF1b3Q719O+5KOsy/y+9raowcvI57rOtKbA7calxeS1xLD8oaM8YnI+CtK7tanEs7j2sPzGpcXkwcvSu7j2uebU8qOsxMfDtMv8tcS94b7Wvs3It7aowcujrLK71NnTw8bky/u55tTywLS87LLpy/yhozxicj4Ky+TIu2lwdGFibGVzxNqyv7ao0uXBy9DttuB0YXJnZXSjrLWryse7ub/J0tTWuLaowe3Su8z1wbTX986quebU8rXEdGFyZ2V0oaM8YnI+Cjxicj4KPGJyPgrU2mZpbHRlcrHt1tC1xLnm1PK/ydLUyrnTw7XEdGFyZ2V019O+5NPQPGJyPgogIEFDQ0VQVKGiRFJPUKGiUkVKRUNUoaJMT0ehok1JUlJPUqGiUVVFVUWholJFRElSRUNUoaJSRVRVUk66zVVMT0ehozxicj4KLiC1sdK7zPW55tTywuTU2sHLQUNDRVBUyc+1xMqxuvKjrMalxeTV4sz1uebU8rXEsPy+zb/J0tS8zND4zai5/aGjPGJyPgouIERST1C6zVJFSkVDVLa8u+Gw0cv8w8e1xLD8tqrG+qGjRFJPUMrHxKzErLXYtqrG+qOstvhSRUpFQ1S74be1u9jSu9TySUNNULTtzvPP+8+ioaM8YnI+Ci4gTE9HzOG5qbj619mw/MalxeS55tTyx+m/9rXEvPK1pbDst6ijrFVMT0fM4bmpwcu3ts6nuPy547XEyNXWvrzHwrzQxc+ioaM8YnI+Ci4gUkVESVJFQ1Sw0bD8t9bB97W90ru49rT6wO2jrLb4srvKx9axvdPIw8v8w8fNqLn9oaM8YnI+CiAgxPq/ycTcu+HTw9XiuPa5psTcwLTGyMq51b6148nPtcTL+dPQV2ViwffBv7a8zai5/dK7uPZXZWK438vZu7q05qOsscjI51NxdWlkoaM8YnI+Ci4gUkVUVVJO1tW94dPDu6e2qNLltcTBtKOswOAmIzIwMjg0O9Pa19PA/bPMtffTw9bQtcRyZXR1cm7T777koaM8YnI+Ci4gTUlSUk9SxL+x6tTat6LLzbD81q7HsL27u7tJUNS0us3Ev7XEtdjWt6GjPGJyPgouIFFVRVVFzai5/dK7uPbE2rrLxKO/6bDRsPy9u7j4sb612NPDu6ezzNDyoaM8YnI+Cjxicj4KTGludXi3wLvwx73NqLOjysfTyXJjxvS2r73Fsb7W0LXE0rvPtcHQaXB0YWJsZXPD/MHuwLTKtc/WtcShozxicj4KuPe49mlwdGFibGVzw/zB7s2os6Oyycihz8LB0NDOyr3WrtK7o7o8YnI+CiBpcHRhYmxlcyAtRiBjaGFpbi1uYW1lPGJyPgogaXB0YWJsZXMgLVAgY2hhaW4tbmFtZSB0YXJnZXQ8YnI+CiBpcHRhYmxlcyAtQSBjaGFpbi1uYW1lIC1pIGludGVyZmFjZSAtaiB0YXJnZXQ8YnI+Ci4gtdrSu9bW0M7KvaOoLUajqbDR1q7HsMv509C1xLnm1PK2vLTTwbTW0Mfls/219KGjPGJyPgouILXatv7W1tDOyr2jqC1Qo6m4+MG0yejWw9K7zPXErMjPst/C1KOo0rK+zcrHdGFyZ2V0o6mho87Sw8e9qNLpxPrKudPDRFJPUNf3zqrBtMSsyM+1xMS/seqjqHRhcmdldKOpoaM8YnI+Ci4gtdrI/dbW0M7KvaOoLUGjqbDRtbHHsLXEy7XD99e3vNO1vcG0yc+hozxicj4KICCz/bfHyrnTwy10ss7K/da4tqjBy7Hto6h0YWJsZaOpw/ujrLfx1PLD/MHusbvErMjP06bTw7W9ZmlsdGVyse3Jz6GjPGJyPgogIC1pss7K/b2ruebU8tOm08O1vdPQw/vX1rXEvdO/2snPo6wtatTyserKtrP2xL+x6qOodGFyZ2V0o6mhozxicj4KPGJyPgppcHRhYmxlc7u5vdPK3NDttuCx8LXE19O+5KOsse0xuPiz9sHLxuTW0LXE0ruyv7fWoaM8YnI+CrHtMTxicj4KPGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140219/2014021909250012.jpg" width="600" height="355" alt=""http://www.2cto.com/os/" target="_blank" class="keylink">系統被駭的損失。
可惜這個功能無法匹配出來自其它主機的封包。

參數: -m owner --gid-owner
范例: iptables -A OUTPUT -m owner --gid-owner 0
說明: 用來匹配來自本機的封包,是否為某特定使用者群組所產生的,使用時機同上。

參數: -m owner --pid-owner
范例: iptables -A OUTPUT -m owner --pid-owner 78
說明: 用來匹配來自本機的封包,是否為某特定進程所產生的,使用時機同上。

參數: -m owner --sid-owner
范例: iptables -A OUTPUT -m owner --sid-owner 100
說明: 用來匹配來自本機的封包,是否為某特定連接(Session ID)的響應封包,使用時機同上。

參數: -m state --state
范例: iptables -A INPUT -m state --state RELATED,ESTABLISHED
說明: 用來匹配連接狀態,
連接狀態共有四種:
INVALID、ESTABLISHED、NEW 和RELATED。
INVALID 表示該封包的連接編號(Session ID)無法辨識或編號不正確。
ESTABLISHED 表示該封包屬於某個已經建立的連接。
NEW 表示該封包想要起始一個連接(重設連接或將連接重導向)。
RELATED 表示該封包是屬於某個已經建立的連接,所建立的新連接。
例如:FTP-DATA 連接必定是源自某個FTP 連接。

4. [-j target/jump] 常用的處理動作
-j 參數用來指定要進行的處理動作,常用的處理動作包括:
ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,

分別說明如下:
動作: ACCEPT
說明: 將封包放行,
進行完此處理動作後,將不再匹配其它規則,直接跳往下一個規則鏈(natostrouting)。

動作: REJECT
說明: 攔阻該封包,並傳送封包通知對方,
可以傳送的封包有幾個選擇:
ICMP port-unreachable、
ICMP echo-reply 或是
tcp-reset(這個封包會要求對方關閉連接),
進行完此處理動作後,將不再匹配其它規則,直接中斷過濾程序。
范例: iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

動作: DROP
說明: 丟棄封包不予處理,進行完此處理動作後,將不再匹配其它規則,直接中斷過濾程序。

動作: REDIRECT
說明: 將封包重新導向到另一個端口(PNAT),進行完此處理動作後,將會繼續匹配其它規則。
這個功能可以用來實現透明代理或用來保護web 服務器。
范例: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

動作: MASQUERADE
說明: 改寫封包來源IP 為防火牆NIC IP,可以指定port 對應的范圍,
進行完此處理動作後,直接跳往下一個規則鏈(manglepostrouting)。
這個功能與SNAT 略有不同,當進行IP 偽裝時,不需指定要偽裝成哪個IP,IP 會從網卡直接讀取,
當使用撥號接連時,IP通常是由ISP 公司的DHCP 服務器指派的,這個時候MASQUERADE 特別有用。
范例: iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

動作: LOG
說明: 將封包相關訊息紀錄在/var/log 中,詳細位置請查閱/etc/syslog.conf 配置文件,
進行完此處理動作後,將會繼續匹配其規則。
范例: iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

動作: SNAT
說明: 改寫封包來源IP 為某特定IP 或IP 范圍,可以指定port 對應的范圍,
進行完此處理動作後,將直接跳往下一個規則(mangleostrouting)。
范例: iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000

動作: DNAT
說明: 改寫封包目的地IP 為某特定IP 或IP 范圍,可以指定port 對應的范圍,
進行完此處理動作後,將會直接跳往下一個規則鏈(filter:input 或filter:forward)。
范例: iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

動作: MIRROR
說明: 鏡射封包,也就是將來源IP 與目的地IP 對調後,將封包送回,
進行完此處理動作後,將會中斷過濾程序。

動作: QUEUE
說明: 中斷過濾程序,將封包放入隊列,交給其它程序處理。
通過自行開發的處理程序,可以進行其它應用,例如:計算連接費用等。

動作: RETURN
說明: 結束在目前規則鏈中的過濾程序,返回主規則鏈繼續過濾,
如果把自定義規則鏈看成是一個子程序,那麼這個動作,就相當於提前結束子程序並返回到主程序中。

動作: MARK
說明: 將封包標上某個代號,以便提供作為後續過濾的條件判斷依據,
進行完此處理動作後,將會繼續匹配其它規則。
范例: iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
Copyright © Linux教程網 All Rights Reserved