一、 Iptables概述
Iptables 是一個用戶空間程序,可以用于設置和管理 Linux 操作系統的內核級防火墻。它通過表、鏈和 規則組成,可以靈活地根據不同的需求進行配置。
iptables 具有以下特點:
Iptables 作為內核級別的防火墻,具有高效、穩定、安全等優點。
Iptables 的表、鏈、規則結構非常靈活,可適應各種不同的網絡環境和應用場景。
Iptables 相對于其他防火墻工具而言比較容易學習和掌握,并且拓展性非常強。
二、 Iptables 組成
Iptables 的核心是由表(table)、鏈(chain)和規則(rule)三部分組成的。
表(Table)
在 iptables 中,表是一個規則的集合,每個表都包含若干個鏈和一些相關的規則。常用的五種 table 如 下:
- raw表:確定是否對該數據包進行狀態跟蹤。包含兩個規則鏈,OUTPUT、PREROUTING。
- mangle表:修改數據包內容,用來做流量整形的,給數據包設置標記。包含五個規則鏈,INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING。
- nat表:負責網絡地址轉換,用來修改數據包中的源、目標IP地址或端口。包含三個規則鏈, OUTPUT、PREROUTING、POSTROUTING。
- filter表:負責過濾數據包,確定是否放行該數據包(過濾)。包含三個規則鏈,INPUT、 FORWARD、OUTPUT。
表之間的優先級
數據包到達防火墻時,規則表之間的優先順序 raw > mangle > nat > filter
鏈(Chain)
在 iptables 中,鏈是一個規則的集合,每個鏈都包含一些相關聯的規則。
- INPUT鏈: 當接收到防火墻本機地址的數據包(入站)時,應用此鏈中的規則。
- OUTPUT鏈: 當防火墻本機向外發送數據包(出站)時,應用此鏈中的規則。
- FORWARD鏈: 當接收到需要通過防火墻發送給其他地址的數據包(轉發)時,應用此鏈中的規 則。
- PREROUTING鏈: 在對數據包作路由選擇之前,應用此鏈中的規則,用來修改目的地址,如 DNAT。
- POSTROUTING鏈: 在對數據包作路由選擇之后,應用此鏈中的規則,用來修改源地址,如 SNAT。
鏈表對應關系
數據包過濾的匹配流程
- 入站
入站數據包從A網絡發到B網絡,首先發到防火墻,先后順序經過有PREROUTING鏈的三個表(raw、 mangle、nat),如果都是放通狀態的會經過路由選擇,然后根據目的地址一層一層往上送,經過有 INPUT的兩個表(mangle、filter),一直送到應用程序。
- 轉發
目的地不是本機,數據包先從A網絡過濾,經過PREROUTING鏈,看是否是自己的目的地址,如果是外網 到內網需要用nat轉換成內網IP,找到內網用戶,經過FORWARD鏈進行過濾,允許放通的到達 POSTROUING鏈,再把內網地址轉換成公網,這樣數據包才能回去;如果是內網往外網發順序就是反過 來。
- 出站
從本機的應用程序發出來, 經過路由選擇,讓路由知道從哪里發,先后順序經過有OUTPUT鏈的四個表 (raw、mangle、nat、filter),都放通后到達POSTROUING鏈的兩個表(mangle、nat),如果沒有 什么轉換地址,就出站。
- 總結
當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送 出去。
如果數據包是進入本機的,數據包就會沿著圖向上移動,到達INPUT鏈。數據包到達INPUT鏈后, 任何 進程都會收到它。本機上運行的程序可以發送數據包,這些數據包經過OUTPUT鏈,然后發送出去。
如果數據包是要轉發出去的,且內核允許轉發,數據包就會向右移動,經過FORWARD鏈,然后到達 POSTROUTING鏈輸出。
規則匹配策略
自上而下進行順序匹配,匹配到即停止,不會再去查看下面的規則,然后根據允許或者丟棄或者拒絕等 規則進行數據包的處理!!!
三、 Iptables防火墻配置
iptables命令
語法 iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制類型]
注意:鏈名必須大寫;控制類型必須大寫
選項 | 作用 |
-t | 指定表名(raw、mangle、nat、filter) |
-j | 指定控制類型 |
常用管理選項
常用控制類型
匹配條件
命令操作
添加新的規則
##-A 在filter表的INPUT鏈末行添加拒絕icmp的規則
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
##-I 不指定行,是在指定鏈首行插入規則(允許tcp 22端口)
[root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
##-I 指定行,是在指定鏈的指定行上插入規則
[root@localhost ~]# iptables -t filter -I INPUT 2 -p tcp --dport 22 -j ACCEPT
查看規則
##查看指定表的規則(不加鏈名顯示所有鏈的所有規則)
[root@localhost ~]# iptables -t filter -L
##-nL 以數字形式顯示
[root@localhost ~]# iptables -t filter -nL
##-nvL 以數字形式顯示,并顯示詳細信息
[root@localhost ~]# iptables -t filter -nvL##--line-numbers 顯示規則序號(指定鏈名,就顯示指定鏈的規則)
[root@localhost ~]# iptables -t filter -nvL INPUT --line-numbers
編號 包數量 大小 規則 協議 選項 入站網卡 出站網卡 源地址 目的地址
條件
num ? pkts bytes target ? ? prot opt in ? ? out ? ? source ? ? ? ? ? ? ?
destination ? 1 ? ? ? ?2 ? 168 ACCEPT ? ? icmp -- * ? ? * ? ? ? 192.168.1.250 ? ? ? 0.0.0.0/0 ? ? ? ? ?
2 ? ? ? ?9 ? 844 REJECT ? ? icmp -- * ? ? * ? ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? reject-with icmp-port-unreachable
3 ? ? ? ?9 ?2041 ACCEPT ? ? tcp ?-- * ? ? * ? ? ? 192.168.1.250 ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp dpt:22
4 ? ? ?346 24461 ACCEPT ? ? tcp ?-- * ? ? * ? ? ? 192.168.1.252 ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp dpt:22
5 ? ? ? 31 ?2548 REJECT ? ? tcp ?-- * ? ? * ? ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp dpt:22 reject-with icmp-port-unreachable
刪除規則
注意
若規則列表中期多條相同的規則時,按內容匹配只刪除的序號最小的一條
按號碼匹配刪除時,確保規則號碼小于等于已有規則數,否則報錯 按內容匹配刪數時,確保規則存在, 否則報錯
##根據規則序號刪
[root@localhost ~]# iptables -D INPUT 3
##根據規則內容刪(相當于操作一遍創建指定規則的步驟加上-D選項刪除)
[root@localhost ~]#iptables -D INPUT -p icmp -j REJECT
##有相同的規則會刪除第一個
[root@localhost ~]#iptables -nL
[root@localhost ~]#iptables -D INPUT -p tcp --dport 22 -j ACCEPT
清空規則
注意?
-F僅僅是清空鏈中的規則,并不影響-Р設置的默認規則,默認規則需要手動進行修改?
-P設置了默認規則為DROP后,使用-F一定要小心,因為iptables的修改是立刻生效的! 防止把允許遠程連
接的相關規則清除后導致無法遠程連接主機,此情況如果沒有保存規則可重啟主機解決
如果不寫表名和鏈名,默認清空filter表中所有鏈里的所有規則
##清空指定鏈中所有規則
[root@localhost ~]# iptables -F OUTPUT
##不指定鏈名默認清空所有規則
[root@localhost ~]# iptables -F
修改規則
##-R 修改已有的規則
[root@localhost ~]# iptables -t filter -R INPUT 1 -p icmp -j ACCEPT
##-P 修改默認策略(修改為丟棄轉發數據包)
[root@localhost ~]# iptables -P FORWARD DROP
四、 規則的匹配
1、通用匹配
可直接使用,不依賴其他條件或擴展包括網絡協議、IP地址、網絡接口等條件。
##(使用!取反)不是icmp協議的其他數據包全部接受
##雖然不是icmp包都接受,但是沒有指定icmp包的規則,所以icmp包默認還是接受的
[root@localhost ~]# iptables -A INPUT ! -p icmp -j ACCEPT
##將指定主機192.168.116.20的數據包丟棄
[root@localhost ~]# iptables -A INPUT -s 192.168.116.20 -j DROP
##拒絕指定網段的數據包從ens33網卡進入
[root@localhost ~]# iptables -I INPUT -i ens33 -s 192.168.110.0/24 -j REJECT
2、隱含匹配
某些條件,如端口、TCP標記、ICMP類型,隱含要求以特定的協議匹配作為前提。
- 協議端口匹配
--sport 和 --dsport 必須配合 -p 指定協議使用!!!
詳細用法
##允許tcp的20和21端口通過(即允許ftp數據包)
[root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
##丟棄192.168.11.0網段轉發的tcp 24000到24500 端口的數據包
[root@localhost ~]# iptables -I FORWARD -d 192.168.11.0/24 -p tcp --dport
24000:24500 -j DROP
tcp標記匹配 [了解]
--tcp-flags 配合 -p tcp 使用,指定tcp標記(SYN、ACK、RST、URG、PSH、FIN)
##丟棄SYN請求包,允許其他指定的數據包
[root@localhost ~]# iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK SYN -j
ACCEPT
##SYN,RST,ACK SYN 前面指定包范圍,空格后再指定
##表明前面指定的里面,除了這空格后面的SYN,其他都放行
##tcp三次握手第一次接受SYN,拒絕其他,第二次發送SYN和ACK
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 --tcp-flags
SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
[root@localhost ~]# iptables -I OUTPUT -p tcp --dport 22 --tcp-flags
SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
ICMP類型匹配
--icmp-type 配合 -p icmp 使用,指定icmp類型(字符串或數字代碼)
icmp類型可用iptables -p icmp -h 查看幫助信息
##丟棄icmp請求包(使別人不能ping通本機,但本機默認情況可以ping通別人)
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
##丟棄icmp回顯包(本機發送ping請求,但是別人回顯的包被本機丟棄,默認情況下本機不能ping通別
人)
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j DROP
##當ping不通時,允許顯示目標不可達
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
3、顯式匹配
要求以 -m (擴展模塊)的形式明確指出類型,包括多端口、MAC地址、IP范圍、數據包狀態等條件。
多端口匹配
-m multiport --sport 源端口列表
?-m multiport --dport 目的端口列表
##允許tcp的20,21,22,53端口
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,22,53
-j ACCEPT
Chain INPUT (policy ACCEPT)
target ? ? prot opt source ? ? ? ? ? ? ? destination ? ? ? ?
ACCEPT ? ? tcp ?-- ?0.0.0.0/0 ? ? ? ? ? ?0.0.0.0/0 ? ? ? ? ? multiport dports
20,21,22,53
##允許udp的53,67,68端口
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 53,67,68 -j
ACCEPT
ip范圍匹配
-m iprange --src-range 源IP范圍
-m iprange --dst-range 目的IP范圍
##禁止轉發源ip范圍是192.168.10.100-192.168.10.200的udp數據包
[root@localhost ~]# iptables -A FORWARD -p udp -m iprange --src-range
192.168.10.100-192.168.10.200 -j DROP
Chain FORWARD (policy ACCEPT)
target ? ? prot opt source ? ? ? ? ? ? ? destination ? ? ? ?
DROP ? ? ? udp ?-- ?0.0.0.0/0 ? ? ? ? ? ?0.0.0.0/0 ? ? ? ? ? ?source IP range
192.168.1.1-192.168.1.10
##禁止發送目的ip范圍是192.168.10.100-192.168.10.200的udp數據包
[root@localhost ~]# iptables -A INPUT -p udp -m iprange --dst-range
192.168.10.100-192.168.10.200 -j DROP
mac地址匹配【了解】
-m mac --mac-source 源MAC地址
狀態匹配【了解】
-m state --state 連接狀態
常見的連接狀態
##第一個包我只看22端口的包(-p tcp是隱含匹配,可以省略-m tcp)
[root@localhost ~]# iptables -I INPUT -m state --state NEW -m tcp -p tcp --
dport 22 -j ACCEPT
##允許放通tcp和udp的這些端口號
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport
443,80,22,21,20,53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 53 -j
ACCEPT
##使已建立連接的包以及該鏈接相關的包允許通過
[root@localhost ~]# iptables -A INPUT -p tcp -m state --state
ESTABLISHED,RELATED -j ACCEPT
##默認策略設為drop,以上所有配置就成了一個tcp相關包的白名單,通過第一步的檢測后允許相關包
通過
[root@localhost ~]# iptables -P INPUT DROP
五、Iptables配置NAT地址轉換
1、 配置SNAT
應用場景
局域網主機共享轉換的公網ip接入internet公網(內 --> 外)
模擬實驗環境
私網客戶端一臺、網關服務器一臺(設置iptables防火墻)、外網web服務端(有httpd服務) 三臺都需要關閉默認防火墻firewalld和selinux 準備私網客戶端:設置網卡網段為192.168.1.0/24;ip設為192.168.1.1;網關設為 192.168.1.254。 準備網關服務器:一個網卡設為192.168.1.0/24網段,并設置ip為192.168.1.254;另一個網卡設為 10.0.0.0/8網段,并設置ip為10.0.0.100;添加路由轉發功能;下載 iptables-services 并開始 iptables之后做防護墻策略。 準備外網web服務端:設置網卡網段為10.0.0.0/8;ip設為10.0.0.1;下載并開啟httpd服務。
轉換為固定公網ip
iptables -t nat -A POSTROUTING -s 源網段 -o 出站網卡 -j SNAT --to 轉換的公網地址
iptables -t nat -A POSTROUTING -s 源網段 -o 出站網卡 -j SNAT --to-source 轉換的公
網地址范圍(如10.0.0.1-10.0.0.10)
注:每一個做轉換的公網ip,一般可以支持內網100~200臺主機。
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33
-j SNAT --to 10.0.0.100
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33
-j SNAT --to-source 10.0.0.1 10.0.0.10
轉換為非固定的公網ip(動態)
iptables -t nat -A POSTROUTING -s 源網段 -o 出站網卡 -j MASQUERADE
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j
MASQUERADE
2、配置DNAT
應用場景
在internet公網中發布位于企業局域網的服務器(外 --> 內)
模擬實驗環境
網客戶端一臺(有httpd服務)、網關服務器一臺(設置iptables防火墻)、外網web服務端 三臺都需要關閉默認防火墻firewalld和selinux 可參考上個模擬場景,再為私網主機增設httpd服務使之成為私網web服務端,將原來的外網主機當做客戶 端。 為私網主機添加httpd服務并啟用
轉換為私網ip
iptables -t nat -A PREROUTING -i 連接外部網絡的接口名稱 -d 外部接口IP地址 -p tcp - -dport 發布的端口號 -j DNAT --to-destination 服務器內部網絡地址:服務實際端口號
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens33 -d 10.0.0.100 -p
tcp --dport 80 -j DNAT --to-destination 192.168.1.2
六、iptables防火墻策略的備份和恢復
iptables的配置存放在/etc/sysconfig/iptables 文件中,我們對iptables所做的策略修改,雖然會立刻生 效,但是并沒有保存下來,當我們重啟iptables防火墻時,會讀取配置文件中設置的策略,我們之前修改 過的策略便失效了。所以需要對修改的iptables策略進行備份和恢復。
iptables-save > 備份文件 將修改的iptables策略導入到備份文件中
iptables-restore < /opt/iptables.bak 將備份文件中的策略還原到配置文件中
systemctl restart iptables.service 重啟服務生效
##查看配置文件中的默認策略
[root@localhost opt]#cat /etc/sysconfig/iptables-config
##使用iptables -nL查看修改過的策略
[root@localhost opt]#iptables -nL
##對自定義的iptables策略做備份(將命令導入一個備份文件iptables.bak)
[root@localhost opt]# iptables-save > /opt/iptables.bak
[root@localhost opt]# cd /opt
[root@localhost opt]# cat iptables.bak
##重啟服務(用作模擬未保留修改的策略),再查看發現策略又恢復成了配置文件中的默認策略
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL
##將備份文件中的策略恢復到配置文件中,再重啟服務就還原成功了
[root@localhost opt]# iptables-restore < /opt/iptables.bak
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL