iptables 介紹
阿新 • • 發佈:2020-11-28
iptables basics
Introduction
iptables 是一個配置 Linux 防火牆的工具,是 netfilter 專案的一部分。
在 Linux Kernel 3.13 及以上版本中, nftables 將作為後繼者取代 iptables 以成為更強大易用的防火牆工具
Basic Concepts
工作方式
-
iptables 作為防火牆, 一般是有 疏 和 堵 兩種策略, 可以通過配置規則來決定是拒絕請求、轉發請求或者改寫請求資料。
-
iptables 包含 table, chain, rule, target 等概念
iptables 的有機組預定義好的 table
每個 rule 包含多個匹配條件,條件匹配後有個 target 作為最終的目標(action)-
幾組預定義的 table,
- filter: 用於存放與防火牆相關配置的表,也是預設表
- nat: 用於 NAT 操作
- mangle: 用於對特定 packet 的資料修改
- raw: 用來配置規則,消除對特定 packet 的資訊記錄
- security: 用於 強制訪問配置 的,如 SELinux 使用的規則
最常用的是 nat 和 filter 這兩個 table
-
預定義的 chain
- INPUT: 處理輸入資料包
- FORWARD: 處理轉發資料包
- OUTPUT: 處理輸出資料包
- PREROUTING: 用於目標地址轉換 (DNAT)
- POSTROUTING: 用於源地址轉換 (SNAT)
-
預定義的 target:
- ACCEPT: 接收資料包
- DROP: 丟棄資料包
- REDIRECT: 重定向、對映、透明代理
- SNAT: 源地址轉換
- DNAT: 目標地址轉換
- MASQUERADE: IP 偽裝(NAT)
- LOG: 日誌記錄
-
每個 rule 包含 predicate 條件和匹配該條件的 target (可以認為是 action),
匹配對應的 predicate
如果匹配到 chain 的結尾,則返回到 跳轉到跳轉前的 chain -
filter 表包含的 chain 為: INPUT, FORWARD, OUTPUT
-
nat 包含的 chain 為: PREROUTING, FORWARD, POSTROUTING
-
mangle 包含的 chain 為: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
-
Examples
各種常用場景的使用: 封 ip、協議、埠,限制連線數、請求數、併發數等,轉發埠、ip、協議控制,改寫資料包內容
-
日常操作命令
# iptables -L -n -v # 展示 filter 表中的所有 chain 的規則, -n 以精確的 ip、數字替代名字, -v 展示詳細資訊 # iptables -t nat -L # 展示 nat 表中的所有 chain 的規則 # iptables -F # 清空 filter 中所有 chain 的 rules # iptables -t nat -F # 清空 nat 表中所有 chain 的 rules # iptables -t nat -F FORWARD # 清空 nat 表中的 FORWARD chain 中所有 rules # iptables -S [chain] # 列出 filter 表中的指明的 chain 中的所有 rules,如果 [chain] 不填,則列出對應 table 下所有 chain 的 rules # iptables -z [chain [rulenum]] # 清空 filter 表中 [chain] 中的某個 rule [rulenum], 如果 [chain] 或者 [rulenum] 不指定 # iptables -A chain rule-specification # 將 rule-specification 插入到 filter 表中的 chain 中
-
禁止訪問本地 loop 地址, 如禁止訪問本地 127.0.0.1 地址:
# iptables -A INPUT -i lo -d 127.0.0.1 -j DROP
-
禁止訪問某個 ip 、某個網段、某個網址:
# iptables -A OUTPUT -d 192.168.1.1 -j DROP # 禁止訪問 192.168.1.1 這個 ip # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # 禁止訪問 192.168.1.0/24 這個網段
-
禁止訪問某個 ip 的某種協議:
# iptables -A OUTPUT -i eth0 -d 54.222.178.154 -p tcp -j DROP # 禁止我們的 internal 伺服器
-
開放本機埠:
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啟本機 tcp 80 埠 # iptables -A INPUT -p icmp --icmp-type 8 -J ACCEPT # 允許被 ping 通 # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經建立的連線能讓資料進來
-
配置 ip 白名單:
# iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允許 192.168.1.0/24 網段的機器訪問當前機器 # iptables -A INPUT -p tcp -s 192.168.2.1 --dport 3306 # 允許 ip 為 192.168.2.1 的機器訪問本機 3306 埠 (mysql 標準埠)
-
啟動 nat 轉發:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 54.222.178.154 # 讓 192.168.1.0/24 網段機器可以通過 54.222.178.154 訪問網路
-
埠對映:
# iptables -t nat -A PREROUTING -d 127.0.0.1 -p tcp --dport 2222 -j DNAT --to-dest 54.222.178.154:22 # 訪問本地 2222 埠會被轉發到 internal 機器的 22 埠 (ssh 轉發)
-
防止 tcp syn flooding attack:
# iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
-
字串匹配
# iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset # tcp 包中一旦出現 "test" 資料,則 重置該 tcp 連線