Iptables 及常用指令介紹
使用的環境
系統與使用工具 |
---|
Centos 7.6 |
iptables v1.4.21 |
一、iptables 介紹
CentOS 7 的防火牆套件有 iptables 和 firewalld,兩者的核心都是以 netfilter 來實現。
可藉由設定規則來過濾傳入或傳出的封包,然後寫好的規則會被送往 netfilter,告訴核心如何去處理封包。
而此篇筆記要來介紹 iptables。
二、開始使用 iptables
1. 安裝 iptables
yum install iptables -y
2. 啟動 iptables
systemctl start iptables
3. 重新啟動 iptables
systemctl restart iptables
4. 查看 iptables 狀態
systemctl status iptables
5. 停止 iptables
systemctl stop iptables
6. 設定開機自動啟動
systemctl enable iptables
三、iptables 的主要設定檔位置
/etc/sysconfig/iptables
四、iptables 狀態說明
iptables 查看狀態時是 Active: active (exited)
而不是 Active: active (running)
去查看 Loaded 時的讀取檔後,可以發現以下這行
$ vim /usr/lib/systemd/system/iptables.service
ExecStart=/usr/libexec/iptables/iptables.init start
得知當執行 iptables 時是執行 iptables.init start
這個指令
當執行完後就結束了,因此對 systemd 來說是有成功執行 (active)
而只要 ExecStart 執行的指令結束後,就會變成 exited
沒有 daemon 會持續執行,狀態就會是 active (excited)
五、iptables 定義規則的方式 (以下皆可)
1. iptables 設定檔直接編輯修改
$ vim /etc/sysconfig/iptables
若直接修改此檔案,建議修改前先保存目前的防火牆規則
規則會自動保存到 /etc/sysconfig/iptables
# 此命令保存的規則開機會自動生效
$ service iptables save
修改後要重新啟動 iptables
$ systemctl restart iptables
2. 用 iptables-restore 還原先前已保存的規則
3. 使用 iptables 指令
底下有介紹
iptables 指令
六、iptables 結構
iptables 主要分為三個部分:
- Tables (表):就是一份防火牆的規則表,可包含多組 Chain
- Chains (鏈):是 Rules 規則的鏈群組,可包含多個 Rule
- Rules (規則):每一個單獨設立的規則
七、iptables 預設的三個 Tables
內建的 Tables 有三個,分別是 nat
、mangle
和 filter
,當未指定規則表時,則一律視為是 filter
。
另外,還有兩個 Tables (raw
、security
) 暫時先不談。
Tables | 包含的 Chains 與功能 |
---|---|
filter | INPUT、OUTPUT、FORWARD |
最常用的 table,一般的過濾功能 | |
nat | PREROUTING、POSTROUTING |
全名是 Network Address Translation 的縮寫,主要在進行來源與目的之 IP 或 port 的轉換,或是處理 Routing 轉換前/後的封包 | |
與 Linux 本機較無關,主要與 Linux 主機後的區域網路內電腦較有相關 | |
mangle | INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING |
主要是與特殊的封包的路由旗標有關,可以修改封包的 IP 位址及其他值 | |
早期僅有 PREROUTING 及 OUTPUT,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD | |
由於這個表格與特殊旗標相關性較高,所以在單純的環境當中,較少使用 mangle 這個表格 |
八、五種階段的 Chains 介紹
-
INPUT
:經網卡進入的封包 -
OUTPUT
:經網卡出去的封包 -
FORWARD
:經網卡進入 / 出去轉送的封包 (proxy 類型) -
PREROUTING
:改變經網卡進入的封包狀態 (DNAT / REDIRECT) -
POSTROUTING
:改變經網卡出去的封包狀態 (SNAT / MASQUERADE)
FORWARD 處理的封包會繞過 INPUT 和 OUTPUT,因為處理路徑不同
九、iptables 處理流程
-
當封包進入網卡後,會先進入 PREROUTING,然後根據目的地址進行路由決策,如果目的地址是本機,就會走 INPUT,不是本機則走 FORWARD,然後再走 POSTROUTING 轉出去。
-
進入 INPUT 的封包會轉給本機的程式,程式處理後會傳送新的封包,走 OUTPUT,然後經過 POSTROUTING 轉出去。
-
過程中,當封包每經過一個 chain,都要按照 chain 的 rule 順序來走,只要遇到一個 match 的 rule 就要按照這個 rule 進行處理,而後面的 rule 對這個封包資料就不再起作用。
十、iptables 指令
用 iptables 指令新增的規則會立即生效,不用重新啟動服務
1. iptables 備份
$ iptables-save > /your-path/iptables-backup.bak
2. iptables 還原
# 鳥哥建議使用 iptables-save 這個指令來觀察防火牆規則,因為 iptables-save 會列出完整的防火牆規則,只是並沒有規格化輸出而已
$ iptables-restore < /your-path/iptables-backup.bak
3. 列出預設 filter 表格的三個鏈的規則
$ iptables -L -n
# 單獨列出 nat 表格的規則
$ iptables -t nat -L -n
# 參數說明:
# -L :列出目前的 table 的規則
# -n :不進行 IP 與 hostname 的反查,速度較快
# -t :用來指定規則表
輸出的結果解釋:
-
target
:代表進行的動作, ACCEPT (接受)、REJECT (拒絕)以及 DROP (丟棄) -
prot
:代表使用的封包協定,主要有 tcp、udp 以及 icmp 三種封包格式 -
opt
:額外的選項說明 -
source
:代表此規則是針對哪個『來源 IP』進行限制 -
destination
:代表此規則是針對哪個『目標 IP』進行限制
4. 顯示 iptables 版本
$ iptables -V
5. 刪除所有的規則
$ iptables -F
6. 刪除指定的 chain
$ iptables -X
7. 將 iptables 計數器歸零
$ iptables -Z
8. 新增規則 (放在所有規則的最後面)
$ iptables -A
9. 新增規則 (放在指定規則的上一行,沒有指定就放第一行)
$ iptables -I
10. 刪除某條規則 (指定行數)
$ iptables -D INPUT 1
11. 查看指令行數
$ iptables --line-numbers -L INPUT
12. 定義 chain 的預設過濾政策
# 設定預訂政策 INPUT 為丟棄
$ iptables -P INPUT DROP
# 設定預訂政策 OUTPUT 為接受
$ iptables -P OUTPUT ACCEPT
# 設定預訂政策 FORWARD 為接受
$ iptables -P FORWARD ACCEPT
十一、iptables 那些比較長的指令
1. 允許來自 lo 介面的封包
# 不論封包來自何處或去到哪裡,只要是來自 lo (loopback) 這個介面,就予以接受
$ iptables -A INPUT -i lo -j ACCEPT
2. 接受由本機發出的回應封包
$ iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 參數說明:
# -m : iptables 的外掛模組,主要有:state (狀態模組)、mac (網路卡硬體位址)
# --state :一些封包的狀態,主要有:INVALID (無效)、ESTABLISHED (連線成功)、NEW (新建立連線)、RELATED (最常用,主機發送出去的封包)
(3) 讓 icmp 封包變成可接受的封包類型
$ iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
(4) 開啟 22/80/443 port
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 443 -j ACCEPT
(5) 阻擋來自特定 IP 或 port 號的封包
# 阻擋來自 192.168.1.0/24 的 1024:65535 埠口的封包,且想要連線到本機的 ssh port
$ iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport ssh -j DROP
# 參數說明:
# -p 協定:設定此規則適用於哪種封包格式,主要的封包格式有:tcp、udp、icmp 以及 all
# --sport / -s :限制來源 port,port可連續,ex 1024:65535
# --dport / -d :限制目標 port
# -j :後面接動作,主要的動作有ACCEPT、DROP、REJECT及LOG