netfilter/iptables
(簡稱 iptables
)組成 Linux 平臺下的包過濾防火牆網絡
iptables
組件是一種工具,也稱爲用戶空間,它使插入、修改和除去信息包過濾表中的規則變得容易ssh
netfilter
組件也稱爲內核空間,是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集tcp
安裝 iptables
工具
yum -y install iptables iptables-services
重啓:systemctl restart iptables
保存:service iptables save
rest
iptables + -t 表名 + 規則/鏈管理參數 + 匹配參數 + 動做類型參數日誌
# 選擇表 -t # 對指定表進行操做(必須是 raw、nat、filter、mangle 中的一個。如沒有指定則默認爲 filter表) # 規則管理 -A # 在指定規則鏈的末尾加入新規則 -I # 在指定規則鏈的頭部加入新規則(默認在第一行添加) -D # 刪除指定鏈中的一條規則(可按規則序號和內容刪除) -R # 修改、替換指定鏈中的某一條規則(可按照規則序號和內容替換) # 鏈管理 -P # 設置指定鏈默認策略 -N # 新建一條用戶本身定義的規則鏈 -X # 刪除指定表中用戶自定義的規則鏈 -E # 重命名用戶定義的鏈(不改變鏈自己) -Z # 將全部表的全部鏈的字節和數據包計數器清零 # 規則鏈 INPUT # 處理入站的數據包 OUTPUT # 處理出站的數據包 FORWARD # 處理轉發的數據包 PREROUTING # 處理入站的路由規則 POSTROUTING # 處理出站的路由規則 # 匹配(加感嘆號 「!「表示這個目標除外(加感嘆號後需加空格後在加匹配項)) -s # 匹配來源地址 IP/MASK -d # 匹配目標地址 -i # 網卡名稱(匹配從這塊網卡流入的數據) -o # 網卡名稱(匹配從這塊網卡流出的數據) -m # 使用擴展模塊 -p # 匹配協議(如:tcp、udp、icmp) tcp # 擴展選項:--source-port (擴展選項可用 iptables -p tcp -h 查看) udp # 擴展選項:--source-port (擴展選項可用 iptables -p icmp -h 查看) icmp # 可用擴展: --icmp-type (可用擴展可用 iptables -p icmp -h 查看) --dport 80 # 匹配目標端口 80 --sport 81 # 匹配來源端口 81 # 指定動做類型 -j # 指定動做類型 動做類型: ACCEPT # 容許數據包經過 REJECT # 拒絕數據包經過(必要時會發送響應信息) DROP # 直接丟棄(不給出任何迴應) QUEUE # 中斷過濾程序,將封包放入隊列,交由其它程序處理 RETURN # 中止當前鏈中的後續規則,並返回到調用鏈(the calling chain)中 REDIRECT # 在本機上作端口映射 DNAT # 改變數據包的目的地址 SNAT # 改變數據包的源地址 MASQUERADE # SNAT 的一種特殊形式,適用於動態、臨時會變的 IP 上(只能用戶 nat 表的 POSTROUTING 鏈) LOG # 在 /var/log/messages 文件中記錄日誌信息,而後在將數據包傳遞給下一條規則 # 查看/清空 規則 -L # 列出指定鏈中全部的規則 -n # IP地址和端口會一數字的形式打印 -v # 詳細輸出 -F # 清空規則鏈
使用方法:iptables + -m + 擴展模塊名
可用擴展選項可用:iptables + -m + 擴展名 + -h
查看code
# 每分鐘容許經過 5 個 icmp 包(默認爲 3/小時,秒:/sec 分鐘:/minute 小時:/hour 天:/day) iptables -A INPUT -p icmp -m limit --limit 5/minute -j ACCEPT # 每分鐘容許經過 5 個 icmp 包,最多不超過 10 個 iptables -A INPUT -p icmp -m limit --limit 5/minute --limit-burst 10 -j ACCEPT
# 匹配 22,端口(最多可指定15個端口) iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
# 匹配指定範圍內的地址 iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.0-192.168.1.111 --dport 22 -j ACCEPT
# 當服務端返回數據報文檢查到有關鍵字 「test" 時,則丟棄該報文(可以檢測到報文應用層中的字符串 注:該條規則需添加到 OUTPUT 鏈) iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "test" -j DROP
# 限制同一 IP 最多同時 10 個 http 鏈接 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT # 限制每組 C 類 IP 最多同時 10 個 http 鏈接 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP # 限制指定網段的 IP 最多同時 10 個 http 鏈接 iptables -A INPUT -s 192.168.1.0/24 -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
--name # 設置列表名稱 --resource # 源地址 --redest # 目的地址 --seconds # 指定時間內(單位:秒) --hitcount # 匹配次數 --set # 將地址添加進列表,並更新信息(包含地址加入的時間戳) --rcheck # 匹配列表中的源地址(以第一個匹配計算時間) --update # 相似 rcheck(以最後一個匹配計算時間) --remove # 在列表裏刪除相應地址(後面接列表名稱及地址) # 將訪問的主機記錄到 test 列表,並放行 iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --set -j ACCEPT # 如訪問的主機在 test 列表有記錄則限制 80 端口 60 秒 內每一個 IP 只能發起 20 個新的鏈接,超過則記錄日誌(日誌前綴爲 DDOS:) iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j LOG --log-prefix 'DDOS:' --log-ip-options # 如訪問的主機在 test 列表有記錄則限制 80 端口 60 秒 內每一個 IP 只能發起 20 個新的鏈接,超過則丟包 iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j DROP
NEW:新創建一個會話 ESTABLISHED:已創建的鏈接 RELATED:有關聯關係的鏈接 INVALID:沒法識別的鏈接 # 放行 ssh 的首次鏈接狀態 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT # 放行有關聯的鏈接跟已創建的鏈接 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
規則表提供特定的功能(內置了4個表),相似用戶組,每一個組都有不一樣的功能,而且都有對應的用戶(規則鏈)blog
filter # 負責過濾功能(內核模塊:iptables_filter) nat # 負責網絡地址轉換功能(內核模塊:iptable_nat) mangle # 拆解、修改、封裝報文(內核模塊;iptable_mangle) raw # 決定數據包是否被狀態跟蹤機制處理內核(內核模塊:iptable_raw)
規則表優先順序(從左往右):raw <--- mangle <--- nat <--- filter
隊列
規則表對應的規則鏈:ip
raw 表:PREOUTING、OUTPUT mangle 表:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING nat 表:PREROUTING、INPUT、OUTPUT、POSTROUTING filter 表:INTPUT、FORWARD、OUTPUT
規則鏈是規則的集合。對特定的數據包設置相應的規則(讀取規則鏈時是按照從上往下的順序)
INPUT # 處理入站的數據包 OUTPUT # 處理出站的數據包 FORWARD # 處理轉發的數據包 PREROUTING # 數據包進入路由表前 POSTROUTING # 數據包進入路由表後
入站順序(從左往右):PREROUTING <--- INPUT
出站順序(從左往右):OUTPUT <--- POSTROUTING
轉發順序(從左往右):PREROUTING <--- FORWARD <--- POSTROUTING
iptables -L # 列出全部規則 iptables -L -nv # 查看詳細信息(IP 跟 端口會以數字形式顯示) iptables -t nat -L # 列出 nat 表中的全部規則 iptables -t nat -L -nv # 查看詳細信息(IP 跟 端口會以數字形式顯示) iptables -F # 清除全部規則(如不指定表,則默認表爲 filter) iptables -t nat -D INPUT 1 # 刪除 nat 表 INPUT 鏈下的第一條規則
# 在 nat 表中開放 80 端口 iptables -t nat -A INPUT -p tcp --dport 80 -j ACCEPT
# 容許 192.168.1.0/24 網段的主機訪問 iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 容許 192.168.2.0/24 網段的主機訪問本機的 80 端口 iptables -A INPUT -p all -s 192.168.2.0/24 --dport 80 -j ACCEPT
# 指定 IP 範圍 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE # 指定端口範圍 iptables -t nat -A INPUT -p tcp --dport 90:100 -j ACCEPT
# 當別的主機訪問本地 80 端口時會被重定向到 8080 端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 禁 Ping iptables -A INPUT -p icmp -j DROP # 禁 Ping iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP # 禁止 MAC 地址爲 00:11:22:33:44:55 的主機訪問 iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j DROP # 禁止轉發 MAC 地址爲 00:11:22:33:44:55 的主機的數據 iptables -A FORWARD -m mac --mac-source 00:11:22:33:44:55 -j DROP