一、iptables防火墻
概述
- linux系統的防火墻:IP信息包過濾系統,它實際上由兩個組件.NETfilter 和 iptables 組成
- 主要工作在網絡層,針對IP數據包。體現在對包內的IP地址、端口等信息的處理上。
netfilter 和 iptables
netfilter
- netfilter屬于“內核態”(Kernel Space,又稱為內核空間)的防火墻功能體系。
- 是內核的一部分,由一些數據包過濾表組成,這些表包含內核用來控制數據包過濾處理的規則集。
iptables
- iptables屬于“用戶態”(User Space,又稱為用戶空間)的防火墻管理體系。
- 是一種用來管理Linux防火墻的命令程序,它使插入、修改和刪除數據包過濾表中的規則變得容易,通常位于/sbin/iptables目錄下。
netfilter/iptables
- netfilter/iptables后期簡稱為iptables。
- iptables是基于內核的防火墻,其中內置了raw、mangle、nat和 filter 四個規則表。表中所有規則配置后,立即生效,不需要重啟服務。
四表五鏈
- 規則表的作用:容納各種規則鏈
- 規則鏈的作用:容納各種防火墻規則
- 總結:表里有鏈,鏈里有規則
四表
- raw表:確定是否對該數據包進行狀態跟蹤。包含兩個規則鏈,OUTPUT、PREROUTING。
- mangle表:修改數據包內容,用來做流量整形的,給數據包設置標記。包含五個規則鏈,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
- nat表:負責網絡地址轉換,用來修改數據包中的源、目標IP地址或端口。包含三個規則鏈,OUTPUT、PREROUTING、POSTROUTING。
- filter表:負責過濾數據包,確定是否放行該數據包(過濾)。包含三個規則鏈,INPUT、FORWARD、OUTPUT。
- 在 iptables 的四個規則表中,mangle 表和 raw 表的應用相對減少。
五鏈
- INPUT:處理入站數據包,匹配目標IP為本機的數據包。
- OUTPUT:處理出站數據包,一般不在此鏈上做配置。
- FORWARD:處理轉發數據包,匹配流經本機的數據包。
- PREROUTING鏈:在進行路由選擇前處理數據包,用來修改目的地址,用來做DNAT。相當于把內網中的80端口映射到路由器外網端口上。
- POSTROUTING鏈:在進行路由選擇后處理數據包,用來修改源地址,用來做SNAT。相當于內網通過路由器NAT轉換功能實現內網主機通過一個公網IP地址上網。
規則表的匹配順序
raw > mangle > nat > filter
規則鏈之間的匹配順序
- 主機型防火墻
- 入站數據(來自外界的數據包,且目標地址是防火墻本機)
- PREROUTING --> INPUT --> 本機的應用程序
- 出站數據(從防火墻本機向外部地址發送的數據包)
- 本機的應用程序 --> OUTPUT --> POSTROUTING
- 入站數據(來自外界的數據包,且目標地址是防火墻本機)
- 網絡型防火墻
- 轉發數據(需要經過防火墻轉發的數據包)
- PREROUTING --> FORWARD --> POSTROUTING
- 轉發數據(需要經過防火墻轉發的數據包)
- 規則鏈內的匹配順序
- 自上向下按順序依次進行檢查,找到相匹配的規則即停止(LOG策略例外,表示記錄相關日志)
- 若在該鏈內找不到相匹配的規則,則按該鏈的默認策略處理(未修改的狀況下,默認策略為允許)
iptables的安裝
- centos 7默認使用firewalld防火墻,沒有安裝 iptables,若想使用iptables防火墻。必須先關閉firewalld防火墻,再安裝 iptables
#關閉防火墻
systemctl stop firewalld.service
systemctl disable firewalld.service
#安裝并開啟iptables服務
yum -y install iptables iptables-services
systemctl start iptables.service
iptables防火墻的配置方法
命令行配置格式
注意事項
- 不指定表名時,默認指filter表
- 不指定鏈名時,默認指表內的所有鏈
- 除非設置鏈的默認策略,否則必須指定匹配條件
- 選項、鏈名、控制類型使用大寫字母,其余均為小寫
常用的控制類型
控制類型 |
作用 |
ACCEPT |
允許數據包通過。 |
DROP |
直接丟棄數據包,不給出任何回應信息。 |
REJECT |
拒絕數據包通過,會給數據發送端一個響應信息。 |
SNAT |
修改數據包的源地址。 |
DNAT |
修改數據包的目的地址。 |
MASQUERADE |
偽裝成一個非固定公網IP地址。 |
LOG |
在/var/log/messages文件中記錄日志信息,然后將數據包傳遞給下一條規則。 LOG只是一種輔助動作,并沒有真正處理數據包。 |
常用的管理選項
選項 |
說明 |
-A |
在指定鏈的末尾追加(–Append)一條新的規則 |
-I |
在指定鏈的開頭插入(–insert)一條新的規則,未指定序號時默認作為第一條規則 |
-R |
修改、替換(–replace)指定鏈中的某一條規則,可指定規則序號或具體內容 |
-P |
設置指定鏈的默認策略(–policy) |
-D |
刪除(–delete)指定鏈中的某一條規則,可指定規則序號或具體內容 |
-F |
清空(–flush)指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈 |
-L |
列出(–list)指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈 |
-n |
使用數字形式(–numeric)顯示輸出結果,如顯示 IP 地址而不是主機名 |
-v |
顯示詳細信息,包括每條規則的匹配包數量和匹配字節數 |
–line-numbers |
查看規則時,顯示規則的序號 |
匹配條件
匹配條件 |
說明 |
-p |
指定要匹配的數據包的協議類型 |
-s |
指定要匹配的數據包的源IP地址 |
-d |
指定要匹配的數據包的目的IP地址 |
-i |
指定數據包進入本機的網絡接口 |
-o |
指定數據包離開本機做使用的網絡接口 |
–sport |
指定源端口號 |
–dport |
指定目的端口號 |
- 直接使用,不依賴于其他條件或擴展,包括網絡協議、IP地址、網絡接口等條件。
協議匹配:-p 協議名
地址匹配:-s 源地址、-d 目的地址 #可以是IP、網段、域名、空(任何地址)
接口匹配:-i 入站網卡、-o 出站網卡
例:
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
- 以特定的協議匹配作為前提,包括端口、TCP標記、ICMP類型等條件。
- 端口匹配
端口匹配:--sport 源端口、--dport 目的端口
#可以是個別端口、端口范圍
--sport 1000 匹配源端口是1000的數據包
--sport 1000:3000 匹配源端口是1000-3000的數據包
--sport :3000 匹配源端口是3000及以下的數據包
--sport 1000: 匹配源端口是1000及以上的數據包
注意:--sport 和 --dport 必須配合 -p <協議類型> 使用
例:
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP
- TCP標記匹配
TCP標記匹配:--tcp-flags TCP標記
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
#丟棄SYN請求包,放行其他包
- ICMP類型匹配
ICMP類型匹配:--icmp-type ICMP類型
#可以是字符串、數字代碼、、目標不可達
“Echo-Request”(代碼為 8)表示 請求
“Echo-Reply”(代碼為 0)表示 回顯
“Destination-Unreachable”(代碼為 3)表示 目標不可達
關于其它可用的 ICMP 協議類型,可以執行“iptables -p icmp -h”命令,查看幫助信息
- 要求以“-m 擴展模塊”的形式明確指出類型,包括多端口、mac地址、IP范圍、數據包狀態等條件。
- 多端口匹配
多端口匹配:-m multiport --sports 源端口列表
-m multiport --dports 目的端口列表
例:
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
- IP范圍匹配
IP范圍匹配:-m iprange --src-range IP范圍
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
#禁止轉發源地址位于192.168.80.100-192.168.80.200的udp數據包
- 狀態匹配
狀態匹配:-m state --state 連接狀態
常見的連接狀態:
NEW :與任何連接無關的,還沒開始連接
ESTABLISHED :響應請求或者已建立連接的,連接態
RELATED :與已有連接有相關性的(如FTP 主被動模式的數據連接),衍生態,一般與ESTABLISHED 配合使用
INVALID :不能被識別屬于哪個連接或沒有任何狀態
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
#禁止轉發與正常 TCP 連接無關的非--syn 請求數據包(如偽造的網絡攻擊數據包)
SNAT原理與應用
SNAT應用環境
- 局域網主機共享單個公網IP地址接入Internet(私有IP不能在Internet中正常路由)
SNAT原理
- 修改數據包的源地址。
SNAT轉換前提條件
- 局域網各主機已正確設置IP地址、子網掩碼、默認網關地址
- Linux網關開啟IP路由轉發
路由轉發開啟方式
臨時打開:
echo 1 > /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward=1
永久打開:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #將此行寫入配置文件
sysctl -p #讀取修改后的配置
SNAT轉換
SNAT轉換1:固定的公網IP地址:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to 12.0.0.1
或
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 12.0.0.1-12.0.0.10
內網IP 出站 外網網卡 外網IP或地址池
SNAT轉換2:非固定的公網IP地址(共享動態IP地址):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j MASQUERADE
知識擴展
- 一個IP地址做SNAT轉換,一般可以讓內網 100到200 臺主機實現上網。
DNAT原理與應用
DNAT 應用環境
在Internet中發布位于局域網內的服務器
DNAT原理
修改數據包的目的地址。
DNAT轉換前提條件
- 局域網的服務器能夠訪問Internet
- 網關的外網地址有正確的DNS解析記錄
- Linux網關開啟IP路由轉發
DNAT轉換
1、發布內網的Web服務
#把從ens33進來的要訪問web服務的數據包目的地址轉換為 192.168.80.11
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11
或
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11
入站 外網網卡 外網IP 內網服務器IP
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.80.11-192.168.80.20
-------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------
2、發布時修改目標端口
#發布局域網內部的OpenSSH服務器,外網主機需使用250端口進行連接
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22
#在外網環境中使用SSH測試
ssh -p 250 root@12.0.0.1
yum -y install net-tools #若沒有 ifconfig 命令可提前使用 yum 進行安裝
ifconfig ens33
知識擴展
- 主機型防火墻:主要使用 INPUT、OUTPUT 鏈,設置規則時一般要詳細的指定到端口
- 網絡型防火墻:主要使用 FORWARD 鏈,設置規則時很少去指定到端口,一般指定到IP地址或者到網段即可
防火墻規則的備份和還原
導出(備份)所有表的規則
iptables-save > /opt/ipt.txt
導入(還原)規則
iptables-restore < /opt/ipt.txt
將iptables規則文件保存在 /etc/sysconfig/iptables 中,iptables服務啟動時會自動還原規則
iptables-save > /etc/sysconfig/iptables
systemctl stop iptables #停止iptables服務會清空掉所有表的規則
systemctl start iptables #啟動iptables服務會自動還原/etc/sysconfig/iptables 中的規則