netfilter/iptables是集成在Linux2.4.X版本內核中的包過濾防火牆系統
netfilter/iptables框架可以實現數據包過濾、網絡地址轉換以及數據包管理功能
Linux中防火牆系統包括兩部分:netfilter和iptables;netfilter位於內核空間,iptables是用戶工具
iptables默認維護着四個表和五個鏈
默認的iptables規則表有:fileter表(過濾規則表)、nat表(地址轉換規則表)、mangle(修改數據標記位規則表)、raw(跟蹤數據表規則表)
每個規則表中包含多個數據鏈:INPUT(入站數據過濾)、OUTPUT(出站數據過濾)、FORWARD(轉發數據過濾)、PREROUTING(路由前過濾)、POSTROUTING(路由後過濾)
iptables防火牆語法格式:
命令描述:netfilter防火牆規則管理工具
用法:iptables [-t 表名]{-A|-D|-I|-D|-F|-L|-Z|-P} 鏈名 rule-specification
選項:-t 指定需要維護的防火牆規則表,不使用-t時,默認操作對象爲filter表
-A 追加防火牆規則
-D 刪除防火牆規則
-I 插入防火牆規則
-F 清空防火牆規則
-L 列出防火牆規則
-R 替換防火牆規則
-Z 清空防火牆數據表統計信息
-P 設置鏈默認規則
匹配參數:[!]-p 匹配協議,!代表取反
[!]-s 匹配源地址
[!]-d 匹配目標地址
[!]-i 匹配入站網卡接口
[!]-o 匹配出站網卡接口
[!]--sport 匹配源端口
[!]--dport 匹配目標端口
[!]--src-range 匹配源地址範圍
[!]--dst-range 匹配目標地址範圍
[!]--limit 匹配數據錶速率
[!]--mac-source 匹配源MAC地址
[!]--sports 匹配源端口
[!]--dports 匹配目標端口
[!]--state 匹配狀態(INVALID、ESTABLISHED、NEW、RELATED)
[!]--string 匹配應用層字串
觸發動作:ACCEPT 允許數據包通過
DROP 丟棄數據包
REJECT 拒絕數據包通過
LOG 將數據包信息記錄syslog日誌
DNAT 目標地址轉換
SNAT 源地址轉換
MASQUERADE 地址欺騙
REDIRECT 重定向
-A選項添加防火牆規則會將該規則追加到整個鏈的最後,而使用-I選項添加的規則默認會插入到鏈中作爲第一條規則
例子:
[root@liu /]# iptables -nL //查看filter表的所有規則
[root@liu /]# iptables -t nat -nL //查看nat表的所有規則
[root@liu /]# iptables -F //清空filter表中的所有規則
[root@liu /]# iptables -A INPUT -s 192.168.0.1 -j DROP //往filter表添加一條新的入站規則,丟棄192.168.0.1主機發送給防火牆本身的所有數據包
[root@liu /]# iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT //往filter表插入一條新的入站規則,拒絕192.168.0.22 ping防火牆本機
[root@liu /]# iptables -nL --line-number //查看filter表中防火牆規則並顯示規則編號
[root@liu /]# iptables -D INPUT 1 //刪除filter表中INPUT鏈的第一條規則
[root@liu /]# iptables -R INPUT 2 ! -s 192.168.0.254 -j REJECT //替換filter表中INPUT鏈的第二條規則,拒絕192.168.0.254之外的任何主機連接防火牆本機
[root@liu /]# iptsbles -t filter -P INPUT ACCEPT //修改filter表中INPUT鏈的默認規則爲接受數據包
[root@liu /]# iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG //將192.168.0.10主機發送給防火牆本機22端口的所有數據包信息記錄到messages日誌
[root@liu /]# iptables -I INPUT -i eth0 --p tcp --dport 80 -j ACCEPT //允許任何主機從eth0網絡接口訪問防火牆本機的80端口
iptables防火牆應用案例
案例1:允許任意客戶端訪問服務器主機提供的日常服務(HTTP、HTTPS、DNS、NTP、SMTP、POP3、SSH),在Linux系統中,/etc/services文件可以幫助我們找到各種服務所對應的標準端口信息。
[root@liu /]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@liu /]# iptables -A INPUT -p udp --dport 25 -j ACCEPT
[root@liu /]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
[root@liu /]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[root@liu /]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@liu /]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@liu /]# iptables -A INPUT -p tcp --dport 143 -j ACCEPT
[root@liu /]# iptables -A INPUT -p tcp --dport 123 -j ACCEPT
[root@liu /]# iptables -P INPUT DROP
[root@liu /]# iptables -P OUTPUT ACCEPT
案例2:公司擁有一個公有IP,使用防火牆實現局域網中所有的主機通過SNAT共享上網,使用CentOS作爲公司軟路由,公司內部所有192.168.0.0/24網段內的主機連接外網時,防火牆自動將所有數據包的源地址修改爲路由器上的公有IP,最後互聯網將信息返回路由後,由路由再轉交給真正的後端主機。防火牆源地址轉換(SNAT)規則需要被寫入到NAT表的POSTROUTING鏈。
[root@liu /]# vim /etc/sysctl.conf
net.ipv4.ip_forward =1 //開啓路由轉發,實現基於Linux的軟路由功能
[root@liu /]# sysctl -p //重新加載內核參數配置文件/etc/sysctl.conf
[root@liu /]# iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84
案例3:公司對外有一個公有IP,內部有HTTP、MAIL兩臺核心服務器,通過防火牆實現客戶可以從互聯網的任意位置訪問位於公司內部的兩臺服務器資源
[root@liu /]# vim /etc/sysctl.conf
net.ipv4.ip_forward =1 //開啓路由轉發,實現基於Linux的軟路由功能
[root@liu /]# sysctl -p //重新加載內核參數配置文件/etc/sysctl.conf
[root@liu /]# iptables -t nat -I PREROUTING -d 124.126.198.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
[root@liu /]# iptables -t nat -I PREROUTING -d 124.129.198.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
[root@liu /]# iptables -t nat -I PREROUTING -d 124.126.198.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101
案例4:數據包因爲太大無法一次完成數據的傳輸,此時數據包將被分割爲數據片段再發送出去,接收端接收完數據後,將把這些數據片段重新組合成完整的數據包。但問題在於當數據被分割後,只有前面的初始數據片段包含全部的數據頭部信息(IP、TCP、UDP、ICMP等),後續的數據片段僅包含數據包頭部信息的一部分。這時再去檢查後續數據片段的頭部信息是不可能的。當然,如果你想匹配第二個及後面被分片的數據,可以使用“-f”選項
丟棄發送至192.168.1.1的所有數據以及分片數據
[root@liu /]# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
案例5:目前網絡上的***手法層出不窮,很多***會採用發送大量無效的數據包給服務器,造成服務器無法響應正常的請求包,iptables提供了一個limit擴展功能,可以限制單位時間內數據包的個數。下面的規則是當每秒鐘數據包個數爲500時接受入站連接,否則拒絕連接
[root@liu /]# iptables -I INPUT -m limit --limit 500/sec -j ACCEPT
[root@liu /]# iptables -P INPUT DROP
案例6:企業環境中,服務器會面臨各種各樣的***,iptables本身屬於三層包過濾防火牆,但也提供了string擴展功能,通過--string也可以根據關鍵詞限制網絡連接。將下面兩條記錄寫入基於Linux的軟路由服務器規則中,實現拒絕轉發包含有關鍵詞/etc/passad 以及qq的數據包,也就是防止將密碼文件複製出局域網,並防止內部員工訪問QQ網站
[root@liu /]# iptables -I FORWARD -m string --algo bm --string "/etc/passwd" -j REJECT
[root@liu /]# iptables -I FORWARD -m string --algo bm --string "qq" -j REJECT
案例7:根據數據連接狀態設置防火牆規則,放行所有的出站數據包,拒絕入站的新連接請求與無效連接,放行入站的迴應請求
[root@liu /]# iptables -F
[root@liu /]# iptables -A INPUT -m state --state NEW -j DROP
[root@liu /]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@liu /]# iptables -P OUTPUT ACCEPT
案例8:公司採用基於Linux的軟路由設備,要求在路由設備上設置防火牆規則,記錄192.168.0.1至192.168.0.22地址段內所有的主機發送給路由要求轉發的數據包,並允許轉發這些數據包
[root@liu /]# iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j LOG
[root@liu /]# iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j ACCEPT