iptables 是 Linux 內核集成的防火牆系統, 幾乎全部 Linux 發行版都會內置 iptables。mysql
iptables 對進出的 IP 數據報進行處理和過濾, 過濾規則(rule)存儲在4個表(table)中, 表中的規則又組成了數條完整的規則鏈(chain)。nginx
iptables 能夠追蹤數據包所屬的鏈接(TCP/UCP/ICMP協議)及其狀態,容許根據鏈接狀態進行處理和過濾。sql
iptables 中有四張表, 優先級從高到低是:編程
表中的規則構成了鏈:服務器
在運行中 iptables 可能處理三種場景:網絡
雖然咱們一般將 iptables 視爲單個實體, 但實際上它由兩部分組成: 執行數據包過濾處理的內核模塊 netfilter 和運行於用戶空間的過濾規則配置工具 iptables。併發
iptables 是有狀態的防火牆,使用 ip_conntrack 模塊進行鏈接跟蹤。ip_conntrack 能夠實時追蹤本機的 ICMP/TCP/UDP 流並保存在內存中。app
根據數據包在鏈接中的角色,將數據包分爲四種狀態:tcp
鏈接追蹤容許咱們根據包的鏈接狀態進行過濾。好比咱們只容許本地 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>
)包括:
ICMP port-unreachable
, ICMP echo-reply
, tcp-reset
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with tcp-reset
拒絕22端口的tcp鏈接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
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE --to-ports 2000-3000
iptables -t nat -A PREROUTING -s 192.168.1.10 --sport 80 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
將對本地80端口的數據包重定向到8080保存規則
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.1iptables -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:80iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
將對本地80端口的數據包重定向到8080