iptables 總結與應用心得
iptables我一直在用,我有點iptables的心得和小小的總匯,拿出來供大家分享!
Linux 內核中有一個功能強大的聯網子系統 netfilter。netfilter 子系統提供了有狀態的或無狀態的分組過濾,還提供了 NAT 和 IP 偽裝服務。netfilter 還具備為高級選路和連接狀態管理而變形(mangle)IP 頭信息的能力。netfilter 是通過 IPTables 工具來控制的。
IPTables 總覽
netfilter 的強大功能和靈活性是通過 IPTables 界面來實現的。這個命令行工具和它的前身 IPChains 的語法很相似;不過,IPTables 使用 netfilter 子系統來增進網絡連接、檢驗、和處理方面的能力;IPChains 使用錯綜復雜的規則集合來過濾源地和目的地路線以及兩者的連接端口。IPTables 只在一個命令行界面中就包括了更先進的記錄方式;選路前和選路后的行動;網絡地址轉換;以及端口轉發。
7.2. 使用 IPTables
使用 IPTables 的第一步是啟動 IPTables 服務。這可以使用以下命令進行:
service iptables start
警告
你應該使用以下命令關閉 IP6Tables 服務才能使用 IPTables 服務:
service ip6tables stop
chkconfig ip6tables off
要使 IPTables 在系統引導時默認啟動,你必須使用 chkconfig 來改變服務的運行級別狀態。
chkconfig --level 345 iptables on
IPTables 的語法被分成幾個層次。主要層次為“鏈”(chain)。“鏈”指定處理分組的狀態。其用法為:
iptables -A chain -j target
-A 在現存的規則集合內后補一條規則。chain 是規則所在“鏈”的名稱。IPTables 中有三個內建的鏈(即影響每一個在網絡中經過的分組的鏈):INPUT、OUTPUT、和 FORWARD。這些鏈是永久性的,不能被刪除。
重要
在創建 IPTables 規則集合時,記住規則的順序是至關重要的。例如:如果某個鏈指定了來自本地子網 192.168.100.0/24 的任何分組都應放棄,然后一個允許來自 192.168.100.13(在前面要放棄分組的子網范圍內)的分組的鏈被補在這個規則后面(-A),那么這個后補的規則就會被忽略。你必須首先設置允許 192.168.100.13 的規則,然后再設置放棄規則。
要在現存規則鏈的任意處插入一條規則,使用 -I,隨后是你想插入規則的鏈的名稱,然后是你想放置規則的位置號碼(1,2,3,...,n)。例如:
iptables -I INPUT 1 -i lo -p all -j ACCEPT
這條規則被插入為 INPUT 鏈的第一條規則,它允許本地環回設備上的交通。
7.2.1. 基本防火墻策略
在一開始就建立的某些基本策略為建構更詳細的用戶定義的規則奠定了基礎。IPTables 使用策略(policy, -P)來創建默認規則。對安全敏感的管理員通常想采取放棄所有分組、只逐一允許指定分組的策略。以下規則阻塞網絡上所有的出入分組。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
此外,還推薦你拒絕所有轉發分組(forwarded packets) — 要從防火墻被選路發送到它的目標節點的網絡交通 — 以便限制內部客戶對互聯網的無心暴露。要達到這個目的,使用以下規則:
iptables -P FORWARD DROP
注記
在處理添加的規則時,REJECT(拒絕)目標和 DROP(放棄)目標這兩種行動有所不同。REJECT 會拒絕目標分組的進入,并給企圖連接服務的用戶返回一個 connection refused 的錯誤消息。DROP 會放棄分組,而對 telnet 用戶不發出任何警告;不過,為了避免導致用戶由于迷惑不解而不停試圖連接的情況的發生,推薦你使用 REJECT 目標。
設置了策略鏈后,為你的特定網絡和安全需要創建新規則。以下各節概述了一些你在建構 IPTables 防火墻時可能要實現的規則。
7.2.2. 保存和恢復 IPTables 規則
防火墻規則只在計算機處于開啟狀態時才有效。如果系統被重新引導,這些規則就會自動被清除并重設。要保存規則以便今后載入,請使用以下命令:
/sbin/service iptables save
保存在 /etc/sysconfig/iptables 文件中的規則會在服務啟動或重新啟動時(包括機器被重新引導時)被應用。
常用 iptables 過濾
把遠程攻擊者拒之“LAN”外是網絡保安的一個重要方面。LAN 的完好性應該通過使用嚴格的防火墻規則來抵御蓄意不良的遠程用戶而被保護。但是,如果默認策略被設置為阻塞所有進入、輸出、和轉發的分組,防火墻/網關和內部 LAN 用戶之間的通信就無法進行。要允許用戶執行和網絡相關的功能以及使用聯網應用程序,管理員必須打開某些端口進行通信。
例如:要允許到防火墻上的端口80的通信,添加以下規則:
iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
這會允許用戶瀏覽通過端口80通信的網站。要允許到安全網站(如 https://www.example.com/)的訪問,你還必須打開端口443。
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
有時候,你可能會需要從 LAN 之外遠程地進入 LAN。SSH 和 CIPE 之類的安全服務可以用于到 LAN 服務的加密遠程連接。對于擁有基于 PPP 資源(如調制解調器池或批量 ISP 帳號)的管理員來說,撥號進入可以被用來安全地避開防火墻,因為調制解調器連接是直接連接,通常位于防火墻/網關之后。 然而,對于有寬帶連接的遠程用戶來說,你就需要制定些特殊規定。你可以配置 IPTables 接受來自遠程 SSH 和 CIPE 客戶的連接。例如,要允許遠程 SSH 訪問,你可以使用以下規則:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT
來自外部的 CIPE 連接請求可以使用以下命令來接受(把 x 替換成你的設備號碼):
iptables -A INPUT -p udp -i cipcbx -j ACCEPT
7.4. FORWARD 和 NAT 規則
多數機構從它們的 ISP 處得到數量有限的可公開選路的 IP 地址。鑒于這種限額,管理員必須創建性地積極尋求分享互聯網服務的方法,而又不必把稀有的 IP 地址分配給 LAN 上的每一臺機器。使用專用 IP 地址是允許 LAN 上的所有機器正確使用內部和外部網絡服務的常用方法。邊緣路由器(如防火墻)可以接收來自互聯網的進入交通,并把這些分組選路發送它們意圖發送的 LAN 節點上;同時,防火墻/網關還可以把來自 LAN 節點的輸出請求選路發送到遠程互聯網服務中。這種轉發網絡交通行為有時會很危險,特別是隨著能夠假冒內部 IP 地址、使遠程攻擊者的機器成為你的 LAN 上的一個節點的現代攻擊工具的出現。為防止此類事件的發生,iptables 提供了選路發送和轉發策略,你可以實施它們來防止對網絡資源的變相利用。
FORWARD 策略允許管理員控制分組可以被選路發送到 LAN 內的哪些地方。例如:要允許整個 LAN 的轉發(假定防火墻/網關在 eth1 上有一個內部 IP 地址),你可以設置以下規則:
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
注記
按照默認設置,紅帽企業 Linux 內核中的 IPv4 策略禁用了對 IP 轉發的支持,這會防止運行紅帽企業 Linux 的機器成為專用邊緣路由器。要啟用 IP 轉發,請運行以下命令:
sysctl -w net.ipv4.ip_forward=1
如果該命令是通過 shell 提示運行的,那么其設置在重新引導后就不會被保存。你可以通過編輯 /etc/sysctl.conf 文件來永久性地設置轉發。尋找并編輯以下行,把 0 改成 1:
net.ipv4.ip_forward = 0
執行以下命令來啟用 sysctl.conf 文件中的改變:
sysctl -p /etc/sysctl.conf
這會允許 LAN 節點彼此通信;不過,它們沒有被允許和外界(如互聯網)通信。要允許帶有專用 IP 地址的 LAN 節點和外部的公共網絡通信,配置防火墻的 IP 偽裝(IP masquerading),這會把來自 LAN 節點的請求都偽裝成防火墻的外部設備(在這個例子中是 eth0)的 IP 地址。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
7.5. DMZ 和 iptables
你還可以設置一些把交通選路發送到某些機器(如專用 HTTP 或 FTP 服務器)的規則,這些機器最好是位于停火區域(de-militarized zone,DMZ)的和內部網絡分開的機器。要設置一條把所有進入的 HTTP 請求都選路發送到 IP 地址為 10.0.4.2、端口為80(LAN 192.168.1.0/24 范圍之外)的專用 HTTP 服務器的規則,網絡地址轉換(NAT)會調用 PREROUTING 表來把這些分組轉發到恰當的目的地:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
--to-destination 10.0.4.2:80
使用這項命令,所有來自 LAN 以外的到端口80的 HTTP 連接都會被選路發送到和內部網絡分離的另一個網絡上的 HTTP 服務器上。這種網絡分段會比允許到內部網絡中的機器上的 HTTP 連接更安全。如果 HTTP 服務器被配置接受安全連接,那么端口443也必須被轉發。
病毒和假冒 IP 地址
你可以更精心設計一些規則來控制到 LAN 內指定子網的訪問,甚至到指定機器的訪問。你還可以限制某些類似特洛伊木馬、蠕蟲、以及其它客戶/服務器病毒的可疑服務聯系它們的服務器。例如:有些特洛伊木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務。既然合法服務都不使用這些非標準端口來通信,阻塞這些端口能夠有效地減少你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通信的機會。
iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
你還可以阻塞試圖假冒你所在 LAN 的專用 IP 地址混入的連接。例如:如果你的 LAN 使用 192.168.1.0/24 范圍,面向互聯網的網絡設備(如 eth0)上就可以設置一條規則來放棄到那個設備的使用你所在 LAN 的 IP 范圍的分組。因為默認策略是拒絕轉發分組,所有到面向外界的設備(eth0)的假冒 IP 地址都會被自動拒絕。
iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -j DROP
IP6Tables
下一代互聯網協議 IPv6 的出現突破了 IPv4(或 IP)的32位地址限制。IPv6 支持128位地址,因此識別 IPv6 的載體網絡就能夠制定比 IPv4 更多的可選路地址。
紅帽企業 Linux 支持使用 Netfilter 6 子系統和 IP6Tables 命令的 IPv6 防火墻規則。使用 IP6Tables 的第一步是啟動 IP6Tables 服務。它可以使用以下命令進行:
service ip6tables start
警告
你必須關閉 IPTables 服務才能專門使用 IP6Tables 服務:
service iptables stop
chkconfig iptables off
要使 IP6Tables 在系統引導時默認啟動,使用 chkconfig 來改變服務的運行級別狀態。
chkconfig --level 345 ip6tables on
其語法在各方面都和 IPTables 相同,只不過 IPTables 支持128位的地址。例如:在識別 IPv6 的網絡服務器器上的 SSH 連接可以使用以下規則來啟用:
ip6tables -A INPUT -i eth0 -p tcp -s 3ffe:ffff:100::1/128 --dport 22 -j ACCEPT
關于 IPv6 聯網的詳情,請參閱 IPv6 的信息頁:http://www.ipv6.org/。
iptables -A OUTPUT -p udp -o cipcbx -j ACCEPT
CIPE 使用它自己的傳輸數據報(UDP)分組的虛擬設備,因此這條規則允許 cipcb 接口上的進入連接,而不是規定源地端口或目標端口(雖然它們可以被用來代替設備選項)。關于使用 CIPE 的信息,請參閱第6章 。
你可能還想為其它服務定義規則。關于 IPTables 及其各類選項的完整信息,請參閱《紅帽企業 Linux 參考指南》。
這些規則允許到防火墻上的常規及安全服務的訪問;然而,它們并不允許防火墻之后的機器使用這些服務。要允許 LAN 使用這些服務,你可以使用帶有 IPTables 過濾規則的 NAT。
通過文章,想必大家知道了一些我寫的iptables的總結心得,希望大家喜歡!
【編輯推薦】
- iptables防火墻配置工具ShoreWall的安裝和使用實例
- iptables防火墻配置工具ShoreWall進階實用介紹
- 如何利用netfilter/iptables構建防火墻
- Iptables 命令和命令說明
- squid+iptables網關防火墻的實現
- Iptables 實例分析
- Iptables 配置指南
- Iptables 詳細介紹