iptables常見概念
8.1.1 iptables概述
netfilter/iptables:IP信息包過濾系統,它實際上由兩個組件netfilter 和 iptables 組成。
netfilter/iptables 關係:
netfilter 組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
netfilter/iptables 後期簡稱爲:iptables。 iptables是基於內核的防火牆,功能很是強大,iptables內置了filter,nat和mangle三張表。全部規則配置後,當即生效,不須要重啓服務。node
8.1.2 三張表介紹
filter負責過濾數據包,包括的規則鏈有,input,output和forward;
nat則涉及到網絡地址轉換,包括的規則鏈有,prerouting,postrouting和output;
mangle表則主要應用在修改數據包內容上,用來作流量×××的,給數據包打個標識,默認的規則鏈有:INPUT,OUTPUT、 forward,POSTROUTING,PREROUTING;安全
五個鏈
input匹配目標IP是本機的數據包。
output 出口數據包,通常不在此鏈上作配置
forward匹配流經本機的數據包,
prerouting用來修改目的地址,用來作DNAT 。如:把內網中的80端口映射到路由器外網端口上
postrouting用來修改源地址用來作SNAT。 如:內網經過路由器NAT轉換功能實現內網PC機經過一個公網IP地址上網。
總結:iptables三個表,5個連接,結構如圖:服務器
raw 表:用於處理異常,包括的規則鏈有,prerouting,output; 通常使用不到,raw在整個防火牆體系優先級最高,若是啓動用raw表,數據將會跳過conntrack(鏈接跟蹤機制)網絡
[root@node-1 ~]# iptables -t raw -Ltcp
Iptables過濾封包流程,表->鏈->規則ide
總體數據包分兩類:發給防火牆自己的數據包,和須要通過防火牆的數據包。
當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否須要轉送出去。工具
若是數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。
本機上運行的程序能夠發送數據包,這些數據包會通過OUTPUT鏈,而後到達POSTROUTING鏈輸出。
若是數據包是要轉發出去的,且內核容許轉發,數據包就會如圖所示向右移動,通過FORWARD鏈,而後到達POSTROUTING鏈輸出。post
表、鏈、規則處理的順序
表間的優先順序
raw > mangle > nat > filterspa
鏈間的匹配順序
入站數據:PREROUTING、INOUT
出站數據:OUTPUT、POSTROUTING
轉發數據:PREROUTING、FORWARD、POSTROUTING3d
鏈內的匹配順序
自上向下按順序依次進行檢查,找到相匹配的規則即中止
若在該鏈內找不到的相匹配的規則,則按該鏈的默認策略處理(未修改的狀況下,默認策略爲容許)
注意:規則的次序很是關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。
iptables服務器安裝及相關配置文件
Iptables部署
Iptables是邏輯性比較強的服務,因此咱們一個一個的實驗疏通
安裝
關閉firewall:
[root@node-1 ~]# systemctl stop firewalld.service
中止firewalld 開機啓動
[root@node-1 ~]# systemctl disable firewalld.service
安裝iptables
[root@node-1 ~]# yum ×××tall iptables-services
配置文件位置
[root@node-1 ~]# ls /etc/sysconfig/iptables
/etc/sysconfig/iptables
啓動服務
[root@node-1 ~]# systemctl start iptables.service
[root@node-1 ~]# systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
iptables使用方法
iptables命令的語法格式
Iptables [-t 表名] 管理選項 [鏈名] [條件匹配] [-j 目標動做或或跳轉]
注意事項
不指定表名時,默認表示filter表
不指定鏈名時,默認表示該表內全部鏈
除非設置規則鏈的缺省策略,不然須要指定匹配條件
iptables語法總結:
iptables命令使用方法
iptables [-t 要操做的表]
<操做命令>
[要操做的鏈]
[規則號碼]
[匹配條件]
[-j 匹配到之後的動做]
操做命令
-A 添加規則
-I num 插入,把當前規則插入爲第幾條
-D num 刪除,明確指定刪除第幾條規則
-P 設置默認策略的
-F 清空規則鏈的
查看命令
-[vnx]L
-L 列出規則
-n 以數字格式顯示ip和port,須要配合-L選項使用
-v 顯示信息,以詳細信息顯示
-A <鏈名> APPEND,追加一條規則(放到最後)
拒絕全部人訪問
[root@node-1 ~]# iptables -t filter -A INPUT -j DROP
在 filter 表的 INPUT 鏈裏追加一條規則(做爲最後一條規則)
匹配全部訪問本機 IP 的數據包,匹配到的丟棄
-I <鏈名> [規則號碼] INSERT,插入一條規則
[root@node-1 ~]# iptables -I INPUT -j DROP
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 1 條)
iptables -I INPUT 3 -j DROP
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 3 條)
注意:
-t filter 可不寫,不寫則自動默認是 filter 表
-I 鏈名 [規則號碼],若是不寫規則號碼,則默認是 1
確保規則號碼 ≤ (已有規則數 + 1),不然報錯
-R num:Replays替換/修改第幾條規則
格式:iptables –t filter -R INPUT 3 ……… 修改filter的INPUT鏈第三條規則
-D <鏈名> <規則號碼 | 具體規則內容> DELETE,刪除一條規則
例如:
[root@node-1 ~]#iptables -P INPUT DROP
注意:
當數據包沒有被規則列表裏的任何規則匹配到時,按此默認規則處理。動做前面不能加 –j,這也是惟一 一種匹配動做前面不加 –j 的狀況。
-F [鏈名] FLUSH,清空規則
[root@node-1 ~]# iptables -t filter -A INPUT -j DROP
#清除INPUT鏈上的規則
[root@node-1 ~]# iptables -F INPUT
#清除filter表中全部鏈上的規則
[root@node-1 ~]#iptables -F
#清空NAT表中全部鏈上的規則
[root@node-1 ~]# iptables -t nat -F
#清空NAT表中PREROUTING鏈上的規則
[root@node-1 ~]# iptables -t nat -F PREROUTING
注意:
-F 僅僅是清空鏈中規則,並不影響 -P 設置的默認規則。 須要手動改:
[root@node-1 ~]# iptables -P INPUT ACCEPT
-P 設置了 DROP 後,使用 -F 必定要當心!!
#在生產環境中,使用-P DROP 這條規則,必定要當心,設置以前最好配置下面兩個任務計劃,不然容易把本身drop掉,連接不上遠程主機。
配置crontab :
/15 iptables -P INPUT ACCEPT
/15 iptables -F
若是不寫鏈名,默認清空某表裏全部鏈裏的全部規則
-Z 將封包計數器歸零
[root@node-1 ~]# iptables -Z INPUT
-L [鏈名] LIST,列出規則
v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
x:在 v 的基礎上,禁止自動單位換算(K、M)
n:只顯示 IP 地址和端口號碼,不顯示域名和服務名稱
--line-number:能夠查看到規則號
例如:
iptables -L
粗略列出 filter 表全部鏈及全部規則
iptables -t nat -vnL
用詳細方式列出 nat 表全部鏈的全部規則,只顯示 IP 地址和端口號
iptables -t nat -vxnL PREROUTING
用詳細方式列出 nat 表 PREROUTING 鏈的全部規則以及詳細數字,不反解
互動: iptables -L -n 能夠執行成功
iptables -Ln 是否能夠執行成功?
8.3.2 匹配條件
流入、流出接口(-i、-o)
來源、目的地址(-s、-d)
協議類型 (-p)
來源、目的端口(--sport、--dport)
按網絡接口匹配
-i <匹配數據進入的網絡接口> #此參數主要應用於nat表,例如目標地址轉換
例如:
-i ens33
匹配是否從網絡接口 ens33 進來
-i ppp0
匹配是否從網絡接口 ppp0 進來
-o 匹配數據流出的網絡接口
例如:
-o ens33
-o ppp0
按來源目的地址匹配
-s <匹配來源地址>
能夠是 IP、 網段、域名,也可空(任何地址)
例如:
-s 192.168.0.1 匹配來自 192.168.0.1 的數據包
-s 192.168.1.0/24 匹配來自 192.168.1.0/24 網絡的數據包
-s 192.168.0.0/16 匹配來自 192.168.0.0/16 網絡的數據包
-d <匹配目的地址>
能夠是 IP、 網段、域名,也能夠空
例如:
-d 202.106.0.20 匹配去往 202.106.0.20 的數據包
-d 202.106.0.0/16 匹配去往 202.106.0.0/16 網絡的數據包
-d www.abc.com 匹配去往域名 www.abc.com 的數據包
按協議類型匹配
-p <匹配協議類型>
能夠是 TCP、UDP、ICMP 等,也可爲空
例如:
-p tcp
-p udp
-p icmp --icmp-type 類型
ping: type 8 ping: type 0
按來源目的端口匹配
--sport <匹配源端口>
能夠是個別端口,能夠是端口範圍
例如:
--sport 1000 匹配源端口是 1000 的數據包
--sport 1000:3000 匹配源端口是 1000-3000 的數據包(含1000、3000)
--sport :3000 匹配源端口是 3000 如下的數據包(含 3000)
--sport 1000: 匹配源端口是 1000 以上的數據包(含 1000)
--dport <匹配目的端口>
能夠是個別端口,能夠是端口範圍
例如:
--dport 80 匹配目的端口是 80 的數據包
--dport 6000:8000 匹配目的端口是 6000-8000 的數據包(含6000、8000)
--dport :3000 匹配目的端口是 3000 如下的數據包(含 3000)
--dport 1000: 匹配目的端口是 1000 以上的數據包(含 1000)
注意:--sport 和 --dport 必須配合 -p 參數使用
匹配應用舉例
端口匹配
-p udp --dport 53
匹配網絡中目的端口是 53 的 UDP 協議數據包
地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16
匹配來自 10.1.0.0/24 去往 172.17.0.0/16 的全部數據包
端口和地址聯合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80
匹配來自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 協議數據包
注意:
--sport、--dport 必須聯合 -p 使用,必須指明協議類型是什麼
條件寫的越多,匹配越細緻,匹配範圍越小
8.3.3 動做(處理方式)
ACCEPT
DROP
SNAT
DNAT
MASQUERADE
-j ACCEPT
經過,容許數據包經過本鏈而不攔截它
例如:
iptables -A INPUT -j ACCEPT
容許全部訪問本機 IP 的數據包經過
-j DROP
丟棄,阻止數據包經過本鏈而丟棄它
例如:
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止來源地址爲 192.168.80.39 的數據包經過本機
-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 鏈)
源地址轉換,SNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池(一組連續的 IP 地址)
例如:
[root@xuegod63 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
#將內網 192.168.0.0/24 的原地址修改成 1.1.1.1,用於 NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改爲一個地址池裏的 IP
-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 鏈)
目的地址轉換,DNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池
(一組連續的 IP 地址)
例如:
表達方式1:把從 eth0 進來的要訪問 TCP/80 的數據包目的地址改成 192.168.0.1.
[root@xuegod63 ~]# iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.0.1
表達方式2:
[root@xuegod63 ~]# iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 81 -j DNAT --to 192.168.0.1:81
表達方式3:把從 eth0 進來的要訪問 TCP/80 的數據包目的地址改成192.168.0.1-192.169.1.10
[root@xuegod63 ~]# iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10
-j MASQUERADE 假裝
動態源地址轉換(動態 IP 的狀況下使用)
例如:
[root@xuegod63 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens33 -j MASQUERADE
將源地址是 192.168.0.0/24 的數據包進行地址假裝,轉換成ens33上的IP地址。ens33爲路由器外網出口IP地址
8.3.4 附加模塊
按包狀態匹配 (state)
按來源 MAC 匹配(mac)
按包速率匹配 (limit)
多端口匹配 (multiport)
按包狀態匹配(state)
-m state --state 狀態
狀態:NEW、RELATED、ESTABLISHED、INVALID
NEW:有別於 tcp 的 syn #若是咱們發送一個流的初始化包,狀態就會在OUTPUT鏈 裏被設置爲NEW,當咱們收到迴應的包時,狀態就會在PREROUTING鏈裏被設置爲ESTABLISHED。若是第一個包不是本地產生的,那就會在PREROUTING鏈裏被設置爲NEW狀 態。
ESTABLISHED:鏈接態
RELATED:衍生態,與 conntrack 關聯(FTP)
INVALID:不能被識別屬於哪一個鏈接或沒有任何狀態
例如:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
四個狀態詳解:
這些狀態能夠一塊兒使用,以便匹配數據包。這可使咱們的防火牆很是強壯和有效。之前,咱們常常打 開1024以上的全部端口來放行應答的數據。如今,有了狀態機制,就不需再這樣了。由於咱們能夠只開放那些有應答數據的端口,其餘的均可以關閉。這樣就安全多了。
按來源 MAC 匹配(mac)
-m mac --mac-source MAC
匹配某個 MAC 地址
例如:
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
阻斷來自某 MAC 地址的數據包,經過本機
注意:
報文通過路由後,數據包中原有的 mac 信息會被替換,因此在路由後的 iptables 中使用 mac 模塊是沒有意義的
按包速率匹配(limit)
-m limit --limit 匹配速率 [--burst 緩衝數量]
用必定速率去匹配數據包
例如:
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
注意:
limit 英語上看是限制的意思,但實際上只是按必定速率去匹配而已,50/s表示1秒中轉發50個數據包,要想限制的話後面要再跟一條 DROP
多端口匹配(multiport)-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]一次性匹配多個端口,能夠區分源端口,目的端口或不指定端口例如:iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT必須與 -p 參數一塊兒使用[root@node-1 ~]# iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT[root@node-1 ~]# service iptables saveiptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]總結:iptables常見概念iptables服務器安裝及相關配置文件實戰:iptables使用方法