iptables 指南

iptables 是 Linux 內核集成的防火牆系統, 幾乎全部 Linux 發行版都會內置 iptables。mysql

iptables 對進出的 IP 數據報進行處理和過濾, 過濾規則(rule)存儲在4個表(table)中, 表中的規則又組成了數條完整的規則鏈(chain)。nginx

iptables 能夠追蹤數據包所屬的鏈接(TCP/UCP/ICMP協議)及其狀態,容許根據鏈接狀態進行處理和過濾。sql

表與規則鏈

iptables 中有四張表, 優先級從高到低是:編程

  • raw: 某個鏈上一旦使用了raw表將會跳過 NAT 和鏈接跟蹤處理。
  • mangle: 用於修改數據包的內容
  • nat: 用於網絡地址轉換,能夠修改數據包的源地址或目標地址
  • filter: iptables 的默認表, 能夠拋棄或接受數據包

表中的規則構成了鏈:服務器

  • PREROUTING: 來自網絡接口(網卡)的數據包首先會通過 PREROUTING 鏈,通過 raw, mangle, nat 表中規則的處理而後進行路由判斷。
    • 若數據包的目的地址爲本機則會進入INPUT鏈
    • 若數據包的目的地址爲其它地址則進入FORWARD鏈進行轉發
  • INPUT: 處理目標爲本機的數據包, 通過 mangle,filter 表中規則的處理而後發給 nginx、mysql等上層進程處理 (此處存疑: nat 表中彷佛也包括INPUT鏈, 望大佬指正)
  • FORWARD: 處理轉發的數據包,通過 mangle, filter 表中規則處理後進入POSTROUTING鏈
  • OUTPUT: 處理本地進程發出的數據包, 通過 raw, mangle, nat, filter 表中規則的處理而後進入POSTROUTING鏈
  • POSTROUTING: 處理來自 FORWARD 和 OUTPUT 鏈的數據包併發送給網絡接口發出,可在 raw, mangle, nat 表中配置規則

在運行中 iptables 可能處理三種場景:網絡

  • 入站數據流: 網絡接口 -> PREROUTING -> INPUT -> 本地
  • 轉發數據流: 網絡接口 -> PREROUTING -> FORWARD -> POSTROUTING -> 網絡接口
  • 出站數據流: 本地 -> OUTPUT -> POSTROUTING -> 網絡接口

雖然咱們一般將 iptables 視爲單個實體, 但實際上它由兩部分組成: 執行數據包過濾處理的內核模塊 netfilter 和運行於用戶空間的過濾規則配置工具 iptables。併發

鏈接跟蹤

iptables 是有狀態的防火牆,使用 ip_conntrack 模塊進行鏈接跟蹤。ip_conntrack 能夠實時追蹤本機的 ICMP/TCP/UDP 流並保存在內存中。app

根據數據包在鏈接中的角色,將數據包分爲四種狀態:tcp

  • NEW: 鏈接的第一個包好比TCP的SYN包
  • ESTABLISHED: 只要鏈接被回覆那麼鏈接的狀態就是 ESTABLISHED, 好比TCP中第一個回答 ACK/SYN 包
  • RELATED: 當包和某個 ESTABLISHED 狀態有關係時即處於 RELATED 狀態。 好比 FTP-Data 會被標記爲與 FTP-control 有關。
  • INVALID: 沒法識別包所屬的鏈接或沒有任何狀態,一般會丟棄這些包

鏈接追蹤容許咱們根據包的鏈接狀態進行過濾。好比咱們只容許本地 80 端口的 HTTP 服務器進行響應而不容許經過 80 端口主動向外請求,那麼在本地 80 端口的出方向上只容許 ESTABLISHED 狀態的包不容許 NEW 狀態數據包便可。(一般狀況下 HTTP 服務器進程是能夠主動向外請求的,可是本地地址不會是 80 端口)編程語言

入站數據流和轉發數據流是在 PREROUTING 鏈中進行鏈接追蹤的(即標記所屬鏈接和狀態), 出站數據流在 OUTPUT 鏈中進行狀態追蹤。使用 RAW 表能夠配置數據流繞過狀態追蹤。

配置規則

iptables -h 能夠查看 iptables 自帶的幫助手冊。

咱們將 iptables 命令分解爲幾部分:

iptables -t <table> <cmd> <pattern> <action>

-t <table>--table <table> 選項用來指定要查看或修改的表(raw, mangle, nat, filter)。

經常使用的 iptables 命令選項(上文中的<cmd>部分)包括:

  • -L <chain> / --list <chain>: 列出某條規則鏈中全部規則, 不指定 chain 參數則列出指定表中全部鏈上的規則。iptables 會按照列出的順序依次嘗試匹配規則並執行匹配的動做。規則可用鏈上的序號來描述,第一條規則的序號爲1(不是編程語言常見的0)。
    • -L -V / -L --verbose 會顯示更詳細的內容
  • -A <chain> / --append <chain>: 在規則鏈的末尾添加規則, 規則的內容由後面的匹配選項<pattern>和動做<action>兩部分來描述
  • -I <chain> <index> / --insert <chain> <index>: 在規則鏈的指定位置插入規則。-i INPUT 2會在INPUT鏈第2個位置插入一條規則,原第2條及之後的規則均後移一位
  • - R <chain> <index> / / --replace <chain> <index>: 替換規則鏈指定位置上的規則
  • -D <chain> / --delete <chain>: 刪除鏈上某條規則,可使用序號指定某條規則或者使用匹配和動做完整描述規則進行刪除
  • -F <chain> / --flush <chain>: 刪除鏈上的所有規則
  • -P <chain> <action> / --policy <chain> <action>: 修改某條鏈的默認策略, 示例iptables -P filter ACCEPT

iptables 的規則(<pattern>)包含匹配條件和動做兩部分。能夠根據網絡接口、地址、協議等進行匹配:

  • -i / --in-interface: 進入的網絡接口,如以太網eth, 本地迴環lo。
  • -o / --out-interface: 輸出的網絡接口
  • -s / --source: 輸入IP地址, 格式爲 address[/mask], 如192.168.1.1, 192.168.1.0/24
  • -d / --destination: 目標IP地址
  • -p/ ---proto: 協議類型, 包括TCP/UCP/ICMP等
  • --sport: 源端口號
  • --dport: 目標端口號
  • –-state: 鏈接跟蹤狀態, 須要-m state啓動鏈接跟蹤模塊。示例: --state NEW,ESTABLISHED

ifconfig 命令能夠查看本機可用的網絡接口

iptables 經常使用規則的動做(<action>)包括:

  • ACCEPT: 容許數據包經過,進入下一條規則
  • REJECT: 攔截數據包併發送回執數據包通知發送方,可用的回執有: ICMP port-unreachable, ICMP echo-reply, tcp-reset
    示例: iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with tcp-reset 拒絕22端口的tcp鏈接
  • DROP: 丟棄數據包不返回回執,不繼續執行過濾
  • SNAT: 源地址轉換(Source Network Address Translation), 將包的源地址改寫爲指定地址。完成此動做後將直接跳往下一條規則鏈(如POSTROUTING)
    示例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1-192.168.1.100:2000-3000
    鏈接跟蹤功能會使鏈接後續的應答數據包送達發送者
  • MASQUERADE: 將數據包的源地址改寫爲防火牆的地址但能夠指定端口號, 與SNAT相比更適合防火牆工做在 DHCP 等動態地址網絡環境中的狀況。完成此動做後將直接跳往下一條規則鏈(如POSTROUTING)
    示例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE --to-ports 2000-3000
  • DNAT: 目的地址轉換, 將包目的地址改寫到指定地址,完成此動做後將直接跳往下一條規則鏈。此功能能夠爲其它服務進行反向代理
    示例: iptables -t nat -A PREROUTING -s 192.168.1.10 --sport 80 -j DNAT --to-destination 192.168.1.11:80
  • REDIRECT: 重定向到另外一個端口,能夠爲本地服務提供反向代理
    示例: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 將對本地80端口的數據包重定向到8080
  • MIRROR: 回聲, 將源地址與目的地址對換位置後發送給原發送者

保存規則

iptables 命令修改後規則只存在於內存中, 使用service iptables save保存規則到配置文件。

默認配置文件地址通常爲/etc/sysconfig/iptables

修改/etc/sysconfig/iptables-config中的配置項:
IPTABLES_SAVE_ON_STOP=yes在 iptables 服務中止時存儲規則。

iptables-save

iptables -L 只能逐表查看規則,iptables-save 命令將 netfilter 內核模塊中的規則導出到標準輸出。

咱們可使用 iptables-save 查看全部規則, 或將其備份到文件中。

iptables-save 命令執行讀取操做,不會更改 iptables 配置請放心使用。

iptables-save -t <table> 僅導出指定表的內容。

iptables-save -c 將會導出字節計數器和包計數器的值。

示例

查看規則:

  • iptables -L 列出默認表 filter 全部鏈上的規則。
  • iptables -t nat -L 列出 nat 表中全部鏈上的規則
  • iptables -t nat -L PREROUTING 列出 nat 表中 PREROUTING 鏈上的規則

攔截特定流量:

  • iptables -t filter -A INPUT -s 11.11.11.11 -j DROP 攔截來自特定 IP 地址(11.11.11.11)對本地服務所有流量
  • iptables -t filter -D INPUT -s 11.11.11.11 -j DROP 刪除上一條攔截規則
  • iptables -t filter -A INPUT -p tcp -sport 445 -j DROP 封鎖特定端口(TCP 445)
  • iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j REJECT ---reject-with icmp-host-prohibited 禁止 ICMP (ping)
  • iptables -t filter -A OUTPUT -p tcp --dport 80 -m state --state NEW -j DROP 禁止從80端口發起新的TCP鏈接但容許80端口響應TCP鏈接

做爲網關提供NAT服務:

  • iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1 未來自192.168.2.0/24子網數據包源地址改寫爲192.168.1.1
  • iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE 未來自192.168.2.0/24子網數據包源地址改寫爲防火牆地址
  • iptables -t nat -A PREROUTING -d 192.168.1.1/24 --dport 80 -j DNAT --to-destination 192.168.1.11:80 將對192.168.1.1:80的數據包發送到192.168.1.11:80
  • iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080將對本地80端口的數據包重定向到8080
相關文章
相關標籤/搜索