前言:
對於一個Linux運維來說,如果不熟悉iptables配置,這時咱們來腦補一下,然後服務器不在你身邊,剛好你設置了 "iptables -P INPUT DROP",然後就悲劇了,SSH連接不上了。這還不是最關鍵的,線上服務器分分鐘上萬,這個鍋你來背。所以說,掌握iptables對我們運維來說,至關重要。
1.基本概念
(1).iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是netfilter,它是Linux內核中實現包過濾的內部結構。
(2). 防火牆是對於進出本主機或本網絡的報文根據事先定義的檢查規則作匹配檢測,對於能夠被規則匹配到的報文作出相應處理的組件。
(3). iptables包含4表5鏈。其中表是按照對數據包的操作區分的,鏈是按照不同的Hook點來區分的,表和鏈實際上是netfilter的兩個維度。
2.關於4表5鏈
2.1 iptables 的鏈
規則鏈的作用在於對數據包進行過濾或處理,根據處理時機的不同,各種規則被組織在不同的“鏈”中,規則鏈是防火牆規則/策略的集合。
內置鏈:對應於hook function,分爲以下5個
PREROUTING 路由前
INPUT 輸入隊列
FORWARD 轉發隊列
OUTPUT 輸出隊列
POSTROUTING 路由後
自定義鏈接:用於內置鏈的擴展和補充,可實現更靈活的規則管理機制;設置的時候需要自己手動添加關聯關係。
2.2 iptables 的表
規則具有某一類相似用途的防火牆規則,按照不同處理時機區分到不同的規則鏈以後,被歸置到不同的“表”中規則表是規則鏈的集合。
默認表:相對應於不同的功能,分爲以下4個
filter: 用於過濾,防火牆主要功能;
nat: 用於網絡地址轉換
mangle: 用於拆解報文,按需修改,並重新封裝起來;
raw: 用於關閉nat表上啓用的連接追蹤機制;
2.3 表和鏈的對應關係
2.4 匹配規則
3. iptables命令
格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:指定表 默認爲filter表,可設置的表:raw/mangle/nat/[filter]
COMMAND:
鏈管理:
-N:new, 自定義一條新的規則鏈
-X: delete,刪除自定義的規則鏈
-E:重命名自定義鏈;引用計數不爲0的自定義鏈不能夠被重命名,也不能被刪除
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
規則管理:
-A:append,追加
-I:insert, 插入,要指明位置,省略時表示第一條
-D:delete,刪除
-R:replace,替換指定鏈上的指定規則
-F:flush,清空指定的規則鏈
-Z:zero,置零;
-S:顯示指定鏈上的所有規則 (主要用於保存規則的)
查看:
-L:list, 列出指定鏈上的所有規則;
-n:numberic,以數字格式顯示地址和端口號;
-v:verbose,詳細信息;
-vv, -vvv 更詳細的信息
-x:exactly,顯示計數器結果的精確值;而非單位換算後的結果
--line-numbers:顯示規則的序號
3.1 基本匹配條件
無需加載任何模塊,由iptables/netfilter自行提供
[!] -s address[/mask][,...]:源IP地址是否符合此處指定的地址或範圍
[!] -d address[/mask][,...]:目標IP地址是否符合此處指定的地址或範圍
[!] -p protocol 限制協議(tcp/udp/icmp)
[!] -i name:數據報文流入的接口;應用於數據報文流入的環節
[!] -o name:數據報文流出的接口;應用於數據報文流出的環節
3.2 隱式擴展
不需要手動加載的擴展模塊,它們是對協議的擴展,但凡使用-p指明瞭協議,就表示已經指明瞭要擴展的模塊;
tcp:隱含了指明“-m tcp”
[!] --sport port[:port]:匹配報文的源端口;也可以是端口範圍;
[!] --dport port[:port]:匹配報文的目標端口;可以是端口範圍;
[!] --tcp-flags mask comp 檢查包文件mask指明的tcp標誌位,而要這些標誌位comp中必須爲1
例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標誌位爲SYN,ACK,FIN,RST四個,其中SYN必須爲1,餘下的必須爲0;
[!] --syn:用於匹配第一次握手,相當於”--tcp-flags SYN,ACK,FIN,RST SYN“;
udp:隱含了指明“-m udp”
[!] --sport port[:port]:匹配報文的源端口;可以是端口範圍;
[!] --dport port[:port]:匹配報文的目標端口;可以是端口範圍;
icmp:隱含了指明“-m icmp”
[!] --icmp-type {type[/code]|typename}
0/0 : echo-reply ping應答
8/0 : echo-request ping請求
4. 顯式擴展
必須顯式地指明使用的擴展模塊進行的擴展。-m 選項指出
4.1 multiport擴展
以離散方式定義多端口匹配;最多指定15個端口;
[!] --sports port[,port|,port:port]...:指定多個源端口;
[!] --dports port[,port|,port:port]...:指定多個目標端口;
[!] --ports port[,port|,port:port]...:指明多個端口;
4.2 iprange擴展
指明連續的(但一般不包含整個網絡)ip地址範圍;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目標IP地址;
4.3 string擴展
對報文中的應用層數據做字符串模式匹配檢測;
--algo {bm|kmp}:字符串匹配檢測算法;
[!] --string pattern:要檢測的字符串模式;
[!] --hex-string pattern:要檢測的字符串模式,16進制格式
4.4 time擴展
根據將報文到達的時間/日期與指定的時間/日期範圍進行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 起始日期時間
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 結束日期時間
--timestart hh:mm[:ss] 每天起始時間
--timestop hh:mm[:ss] 每天結束時間
[!] --monthdays day[,day...] 匹配一個月的哪些天
[!] --weekdays day[,day...] 匹配一週中的哪些天
4.5 connlimit擴展
根據每個客戶端主機做併發連接數數量匹配;
--connlimit-upto n:連接的數量小於等於n時匹配;
--connlimit-above n:連接的數量大於n時匹配;
4.6 limit擴展
基於令牌桶算法對報文的速率做匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number 突發速率
4.7 state擴展
根據連接追蹤機制去檢查連接的狀態;
conntrack(連接追蹤)機制:追蹤本機上的請求和響應之間的關係;狀態有如下幾種:
NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求;
ESTABLISHED:NEW狀態之後,連接追蹤模板中爲其建立的條目失效之前期間內所進行的通信狀態;
RELATED:相關聯的連接;如ftp協議中的數據連接與命令連接之間的關係;
INVALID:無法識別的連接;
UNTRACKED:未進行追蹤的連接;
5. 處理動作
5.1 LOG
用於記錄iptables日誌(記錄於/var/log/massages日誌中)
--log-level level 日誌級別(默認爲4)
emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日誌前綴
5.2 SNAT
源地址轉換,修改IP報文中的源IP地址
用在nat表中, POSTROUTING鏈和INPUT鏈上
--to-source [ipaddr[-ipaddr]][:port[-port]]
5.3 DNAT
目標地址轉換,修改IP報文中的目標IP地址
應用在nat表中,PREROUTING鏈和OUTPUT鏈上
--to-destination [ipaddr[-ipaddr]][:port[-port]]
6. 使用示例
1.設置filter中INPUT和OUTPUT鏈默認策略爲DROP
[root@ch7 ~]# iptables -P INPUT DROP [root@ch7 ~]# iptables -P OUTPUT DROP
2.允許本機訪問外網的web服務器
[root@ch7 ~]# iptables -A INPUT -s 172.18.0.0/16 -p tcp --dport 80 -j ACCEPT [root@ch7 ~]# iptables -A OUTPUT -d 172.18.0.0/16 -p tcp --sport 80 -j ACCEPT
3.允許本機ping別的主機;但不開放別的主機ping本機
假設默認策略全爲DROP [root@ch7 ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT [root@ch7 ~]# iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
4.拒絕TCP標誌位全部爲1及全部爲0的報文訪問本機
[root@ch7 ~]# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP [root@ch7 ~]# iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,ACK,RST -j DROP
5.限制本地主機的web服務器在週一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機
默認策略爲DROP
[root@ch7 ~]# iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays 1 -m limit --limit 100/second -m state --state NEW -j ACCEPT [root@ch7 ~]# iptables -A INPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT [root@ch7 ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm !--string admin -m state --state ESTABLISHED,RELATED -j ACCEPT
6.在工作時間,週一到週五的8:30-18:00,開放本機的ftp服務給172.18.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個
默認策略爲DROP [root@ch7 ~]# iptables -A INPUT -s 172.18.0.0/16 -p tcp --dport 21 -m time --weekdays 1,2,3,4,5 --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-upto 5 -m state --state NEW,ESTABLISHED -j ACCEPT [root@ch7 ~]# iptables -A OUTPUT -d 172.18.0.0/16 -m state --state ESTABLISHED,RELATED -j ACCEPT
7.在防火牆上做SNAT,讓內網客戶機能上外網
[root@ch7 ~]# iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j SNAT --to-source 10.10.0.1
8.在防火牆上做DNAT,讓外網客戶機能訪問內網服務器
[root@ch7 ~]# iptables -t nat -A PREROUTING -d 10.10.0.1 -j DNAT --to-destination 172.18.10.10
後語:
以上只是講解了iptables的一小部分內容,常見的用法的總結。如果你想更深入的瞭解iptables,咱們可以一起探討相關問題。