摘要:本文介紹了如何使用“iptables -A”命令添加 iptables 防火牆規則。
本文分享自華為雲社區《Linux IPTables:如何添加防火牆規則(使用允許 SSH 示例)》,作者:Tiamo_T 。
本文介紹了如何使用“iptables -A”命令添加 iptables 防火牆規則。
“-A”用於追加。如果它讓你更容易記住“-A”作為添加規則(而不是附加規則),那就沒問題了。但是,請記住,“-A”在鏈的末尾添加了規則。
同樣,記住 -A 在末尾添加規則非常重要。
通常,最后一條規則是丟棄所有數據包。如果您已經有一個丟棄所有數據包的規則,並且如果您嘗試在命令行中使用“-A”來創建新規則,您最終會在當前的“丟棄所有數據包”規則之后添加新規則,這將使您的新規則幾乎毫無用處。
一旦您掌握了 iptables,並且當您在生產中實現它時,您應該使用 shell 腳本,您可以在其中使用 -A 命令添加所有規則。在那個 shell 腳本中,你的最后一行應該總是“丟棄所有數據包”規則。當您想要添加任何新規則時,請修改該 shell 腳本並將您的新規則添加到“丟棄所有數據包”規則之上。
句法:
iptables -A chain firewall-rule
- -A 鏈 - 指定應附加規則的鏈。例如,對傳入數據包使用 INPUT 鏈,對傳出數據包使用 OUTPUT。
- firewall-rule – 各種參數構成防火牆規則。
如果您不知道鏈是什么意思,最好先閱讀iptables 基礎知識。
防火牆規則參數
以下參數可用於所有類型的防火牆規則。
-p 用於協議
- 指示規則的協議。
- 可能的值為 tcp、udp、icmp
- 使用“all”允許所有協議。當您不指定 -p 時,默認情況下將使用“所有”協議。使用“all”並始終指定協議並不是一個好習慣。
- 使用名稱(例如:tcp)或編號(例如:6 表示 tcp)作為協議。
- /etc/protocols 文件包含所有允許的協議名稱和編號。
- 你也可以使用--protocol
-s 是源
- 指示數據包的來源。
- 這可以是 IP 地址、網絡地址或主機名
- 例如:-s 192.168.1.101 表示具體的ip地址
- 對於網絡掩碼,使用 /mask。例如:“-s 192.168.1.0/24”表示該網絡的網絡掩碼為 255.255.255.0。這匹配 192.168.1.x 網絡。
- 當您不指定來源時,它將匹配所有來源。
- 您還可以使用 –src 或 –source
-d 是目的地
- 指示數據包的目的地。
- 這與“-s”相同(除了它代表目標主機、IP 地址或網絡)
- 您還可以使用 –dst 或 –destination
-j 是目標
- j 代表“跳轉到目標”
- 這指定了匹配此防火牆規則的數據包需要發生什么。
- 可能的值為 ACCEPT、DROP、QUEUE、RETURN
- 您還可以指定其他用戶定義的鏈作為目標值。
-i 用於接口
- i 代表“輸入接口”
- 您可能會忽略這一點並假設“-i”用於接口。請注意 -i 和 -o 都用於接口。但是,-i 用於輸入接口,-o 用於輸出接口。
- 指示傳入數據包通過 INPUT、FORWARD 和 PREROUTING 鏈進入的接口。
- 例如:-i eth0 表示此規則應考慮通過接口 eth0 傳入的數據包。
- 如果您不指定 -i 選項,則系統上所有可用的接口都將被考慮用於輸入數據包。
- 您也可以使用 –in-interface
-o 用於輸出接口
- o 代表“輸出接口”
- 指示通過 INPUT、FORWARD 和 PREROUTING 鏈發送傳出數據包的接口。
- 如果您不指定 -o 選項,則系統上所有可用的接口都將被視為輸出數據包。
- 你也可以使用--out-interface
防火牆參數的附加選項
上面的一些防火牆參數依次具有可以與它們一起傳遞的自己的選項。以下是一些最常見的選項。
要使用這些參數選項,您應該在防火牆規則中指定相應的參數。例如,要使用“–sport”選項,您應該在防火牆規則中指定“-p tcp”(或“-p udp”)參數。
注意:所有這些選項前面都有兩個破折號。例如,sport 前面有兩個連字符。
–sport 用於源端口(用於 -p tcp 或 -p udp)
- 默認情況下,所有源端口都匹配。
- 您可以指定端口號或名稱。例如,要在防火牆規則中使用 SSH 端口,請使用“–sport 22”或“–sport ssh”。
- /etc/services 文件包含所有允許的端口名稱和編號。
- 在規則中使用端口號比使用端口名更好(為了性能)。
- 要匹配端口范圍,請使用冒號。例如,22:100 匹配從 22 到 100 的端口號。
- 您也可以使用 –source-port
–dport 用於目標端口(用於 -p tcp 或 -p udp)
- 一切都與 –sport 相同,除了這是針對目標端口。
- 您也可以使用 –destination-port
–tcp-flags 用於 TCP 標志(用於 -p tcp)
- 這可以包含以逗號分隔的多個值。
- 可能的值有:SYN、ACK、FIN、RST、URG、PSH。您也可以使用 ALL 或 NONE
–icmp-type 用於 ICMP 類型(用於 -p icmp)
- 當您使用icmp協議“-p icmp”時,您還可以使用“-icmp-type”參數指定ICMP類型。
- 例如:“-icmp-type 0”用於“Echo Reply”,“-icmp-type 8”用於“Echo”。
允許傳入 SSH 連接的示例防火牆規則
現在您了解了防火牆規則的各種參數(及其選項),讓我們構建一個示例防火牆規則。
在這個例子中,讓我們只允許傳入的 SSH 連接到服務器。所有其他連接都將被阻止(包括 ping)。
警告:使用防火牆規則可能會導致您的系統無法訪問。如果您不知道自己在做什么,您可能會將自己(和其他所有人)鎖定在系統之外。因此,僅在沒有人使用的測試系統上進行所有學習,並且如果您被鎖定,您可以訪問控制台以重新啟動 iptables。
1. 刪除現有規則
如果您已經有一些 iptables 規則,請在刪除現有規則之前進行備份。
刪除所有現有規則並允許防火牆接受所有內容。使用我們之前討論過的iptables flush清理所有現有規則並從頭開始。
測試以確保您能夠從外部 ssh 和 ping 此服務器。
完成此示例后,您將只能通過 SSH 連接到此服務器。您將無法從外部 ping 此服務器。
2. 只允許 SSH
僅允許與此服務器的傳入 SSH 連接。您可以從任何地方通過 ssh 連接到此服務器。
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
上面的 iptables 命令有以下 4 個組件。
- “-A INPUT”——這表明我們正在向 INPUT 鏈追加(或添加)一條新規則。因此,此規則適用於傳入流量。
- “-i eth0” – 將根據此規則檢查通過接口 eth0 的傳入數據包。
- “-p tcp –dport 22” – 此規則適用於 TCP 數據包。這有一個名為“-dport 22”的 tcp 選項,它表示服務器上此規則的目標端口是 22(即 ssh)。
- “-j ACCEPT”——跳轉到接受,它只是接受數據包。
簡單來說,上述規則可以表述為:所有通過 eth0 for ssh 傳入的數據包都將被接受。
3.丟棄所有其他數據包
一旦您指定了接受數據包的自定義規則,您還應該有一個默認規則來丟棄任何其他數據包。
這應該是您在 INPUT 鏈中的最后一條規則。
要丟棄所有傳入的數據包,請執行以下操作。
iptables -A INPUT -j DROP
4.查看SSH規則和測試
要查看當前的 iptables 防火牆規則,請使用“iptables -L”命令。
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere
從上面的輸出中可以看出,它依次具有以下兩條規則。
- 接受所有傳入的 ssh 連接
- 丟棄所有其他數據包。
與其從命令行添加防火牆規則,不如創建一個包含規則的 shell 腳本,如下所示。
# vi iptables.sh iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -j DROP # sh -x iptables.sh + iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT + iptables -A INPUT -j DROP # iptables -L INPUT Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere
與 iptables append/add 命令類似,iptables 可用的其他命令很少。