
介紹 Linux 基金會認證計劃
您可能還記得這個 LFCE(Linux 基金會認證工程師)系列的 第 1 部分 – 關於 Iptables 中,我們對防火牆的基本描述:一種管理進出網絡的封包的機制。通過“管理”,我們實際上指的是:
- 允許或阻止某些封包進入或離開我們的網絡。
- 將其他封包從網絡的一個點轉發到另一個點。
基於預定的標準。
在本文中,我們將討論如何實施基本的封包篩選以及如何使用 iptables 配置防火牆,它是 netfilter 的前端,netfilter 是用於防火牆的本機內核模塊。
請注意,防火牆是一個廣泛的主題,本文並不旨在成為了解所有與之相關的知識的全面指南,而是作為深入研究此主題的起點。但是,在這個系列的 第 10 部分 中,當我們探討 Linux 中防火牆的一些特定用例時,我們將重新討論這個主題。
您可以將防火牆想像成一個幾乎 24/7 來來去去的國際機場。根據一些條件,例如一個人的護照有效性,或他/她的原籍國(舉幾個例子),他/她可能被允許或不被允許進入或離開某個國家。
同時,機場人員可以在必要時指示人們從機場的一個地方移動到另一個地方,例如當他們需要通過海關服務時。
在本教程的其餘部分,我們可能會發現機場的比喻很有用。隨著我們的進展,請記住以下關係:
- 人 = 封包
- 防火牆 = 機場
- 國家#1 = 網絡#1
- 國家#2 = 網絡#2
- 機場人員執行的規定 = 防火牆規則
Iptables – 基礎知識
在低層次上,是內核本身根據分組在鏈或句子中指定的規則“決定”對封包採取什麼行動。這些鏈定義了當封包符合它們指定的標準時應採取的行動。
iptables採取的第一個行動將包括決定對封包採取什麼行動:
- 接受它(讓它進入我們的網絡)?
- 拒絕它(防止它訪問我們的網絡)?
- 轉發它(到另一個鏈)?
以防您想知道為什麼這個工具被稱為iptables,這是因為這些鏈是組織在表中的,其中過濾表是最為人熟知的表,也是用於實現封包過濾的表,它具有三個默認鏈:
1. INPUT鏈處理進入網絡的封包,這些封包是駐留在本地程序的。
2. 輸出鏈用於分析源於本地網路並且將被發送到外部的封包。
3. 轉發鏈處理應轉發到另一目的地的封包(如路由器的情況)。
對於這些鏈的每個,都有一個默認策略,該策略規定了當封包不匹配鏈中的任何規則時應採取的默認操作。您可以通過運行以下命令查看為每個鏈創建的規則和默認策略:
# iptables -L
可用的策略如下:
- 接受 → 允許封包通過。未匹配鏈中任何規則的封包被允許進入網絡。
- 丟棄 → 靜默丟棄封包。未匹配鏈中任何規則的封包被阻止進入網絡。
- 拒絕 → 拒絕封包並返回信息。這個特別不適用作為默認策略。相反,它旨在補充封包過濾規則。

在決定要實施哪個策略時,您需要考慮上述每種方法的利弊 – 請注意,沒有一種大小適合所有的解決方案。
添加規則
要向防火牆添加規則,請如下調用iptables命令:
# iptables -A chain_name criteria -j target
其中,
- -A代表追加(將當前規則追加到鏈的末尾)。
- chain_name可以是INPUT、OUTPUT或FORWARD。
- 目標是在這種情況下應用的動作或政策(接受、拒絕或丟棄)。
- 標準是要對其進行檢查的封包的一組條件。它由至少一個(很可能更多)以下標誌組成。方括號內以垂直線分隔的選項是等效的。其餘部分代表可選開關:
[--protocol | -p] protocol: specifies the protocol involved in a rule. [--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated. [--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined. [--source | -s] address[/mask]: represents the source address or network/mask. [--destination | -d] address[/mask]: represents the destination address or network/mask. [--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID. [--in-interface | -i] interface: specifies the input interface of the packet. [--out-interface | -o] interface: the output interface. [--jump | -j] target: what to do when the packet matches the rule.
我們的測試環境
讓我們使用以下測試環境來粘合所有這些,以便進行前兩個經典示例:
Firewall: Debian Wheezy 7.5 Hostname: dev2.gabrielcanepa.com IP Address: 192.168.0.15
Source: CentOS 7 Hostname: dev1.gabrielcanepa.com IP Address: 192.168.0.17
以及最後一個示例
NFSv4 server and firewall: Debian Wheezy 7.5 Hostname: debian IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 Hostname: dev2.gabrielcanepa.com IP Address: 192.168.0.15
範例1:分析DROP和REJECT政策之間的差異
我們將首先為輸入ping到我們的防火牆定義一個DROP政策。也就是說,icmp封包將被靜默丟棄。
# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP

在繼續進行REJECT部分之前,我們將從INPUT鏈中清除所有規則,以確保我們的封包將由此新規則進行測試:
# iptables -F INPUT # iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15

範例2:禁用/重新啟用從dev2到dev1的ssh登錄
我們將處理OUTPUT鏈,因為我們正在處理輸出流量:
# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT

範例3:允許/阻止NFS客戶端(來自192.168.0.0/24)掛載NFS4共享
在NFSv4服務器/防火牆中運行以下命令,以關閉所有類型流量的2049和111端口:
# iptables -F # iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT # iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

現在讓我們打開這些端口,看看會發生什麼。
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT # iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

正如您所看到的,我們在打開流量後能夠掛載NFSv4共享。
插入、附加和刪除規則
在先前的範例中,我們展示了如何將規則附加到INPUT和OUTPUT鏈。如果我們想要在預定位置插入它們,則應該使用-I(大寫i)開關。
您需要記住,規則將一個接一個地被評估,並且當匹配到DROP或ACCEPT策略時,評估將停止(或跳過)。因此,您可能會發現自己需要根據需要將規則在鏈列表中向上或向下移動。
我們將使用一個簡單的例子來演示這一點:

讓我們將以下規則,
# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
放置在INPUT鏈的第2個位置(從而將先前的#2移動為#3)

使用上述設置,流量將首先被檢查是否指向端口80,然後再檢查端口2049。
或者,您可以刪除一個規則並將剩餘規則的目標更改為REJECT(使用-R開關):
# iptables -D INPUT 1 # iptables -nL -v --line-numbers # iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT # iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

最後,但同樣重要的是,您需要記住,為了使防火牆規則持久化,您需要將它們保存到文件中,然後在啟動時自動恢復它們(使用您選擇的或您的分發版可用的方法)。
保存防火牆規則:
# iptables-save > /etc/iptables/rules.v4 [On Ubuntu] # iptables-save > /etc/sysconfig/iptables [On CentOS / OpenSUSE]
恢復規則:
# iptables-restore < /etc/iptables/rules.v4 [On Ubuntu] # iptables-restore < /etc/sysconfig/iptables [On CentOS / OpenSUSE]
在這裡,我們可以看到一個類似的過程(通過手動保存和恢復防火牆規則),使用一個名為iptables.dump的虛擬文件,而不是上面所示的默認文件。
# iptables-save > iptables.dump

為了使這些更改在啟動時持久化:
Ubuntu:安裝iptables-persistent套件,將載入保存在/etc/iptables/rules.v4文件中的規則。
# apt-get install iptables-persistent
CentOS:在/etc/sysconfig/iptables-config文件中添加以下2行。
IPTABLES_SAVE_ON_STOP="yes" IPTABLES_SAVE_ON_RESTART="yes"
OpenSUSE:在/etc/sysconfig/SuSEfirewall2中列出允許的端口、協議、地址等(用逗號分隔)。
有關更多信息,請參考文件本身,該文件有詳細的註釋。
結論
本文提供的示例雖然未涵蓋iptables的所有功能,但旨在說明如何啟用和禁用傳入或傳出流量。
對於那些防火牆愛好者,請記住我們將在本LFCE系列的第10部分中重新討論這個主題。
如果您有任何問題或意見,請隨時告訴我。
Source:
https://www.tecmint.com/configure-iptables-firewall/