一、防火墻簡介
1.1 Netfilter
Netfilter是一個Linux內(nèi)核功能,用于在網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)絡(luò)堆棧進入或離開時進行包過濾和操作。
Netfilter內(nèi)稱為防火墻的“內(nèi)核態(tài)”。
1.2 firewalld和iptables
Firewalld和Iptables都不是防火墻,是防火墻管理工具,被稱為防火墻的“用戶態(tài)”。
Centos 7中默認管理防火墻規(guī)則的工具是firewalld。
二、iptables工具簡述
2.1 定義
由軟件包iptables提供的命令行工具。
工作在用戶空間,用來編寫規(guī)則,寫好的規(guī)則被送往netfilter,告訴內(nèi)核如何去處理信息包。
2.2 三種報文流向
- 流入本機:PREROUTING --> INPUT–>用戶空間進程
- 流出本機:用戶空間進程 -->OUTPUT–> POSTROUTING
- 轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING
#查看有沒有安裝
iptables --version
2.3 iptables的表、鏈結(jié)構(gòu)(非常重要)
2.3.1 “四表” ----- 規(guī)則表
規(guī)則表 | 功能 |
---|---|
filter表 | 過濾規(guī)則表,根據(jù)預定義的規(guī)則過濾符合條件的數(shù)據(jù)包,默認表 |
nat表 | 地址轉(zhuǎn)換規(guī)則表 |
mangle表 | 給數(shù)據(jù)包設(shè)置標記 |
raw表 | 關(guān)閉啟用的連接跟蹤機制,加快封包穿越防火墻速度 |
security | 表用于強制訪問控制(MAC)網(wǎng)絡(luò)規(guī)則,由Linux安全模塊(如SELinux)實現(xiàn) |
規(guī)則表間的順序: raw --> mangle–> nat–>filter
規(guī)則表的作用:容納各種規(guī)則鏈。
2.3.2 “五鏈” ----- 規(guī)則鏈
規(guī)則鏈 | 功能 |
---|---|
INPUT鏈 | 處理入站數(shù)據(jù)包 |
OUTPUT鏈 | 處理出站數(shù)據(jù)包 |
FORWARD鏈 | 處理轉(zhuǎn)發(fā)數(shù)據(jù)包 |
PREROUTING鏈 | 在進行路由選擇前處理數(shù)據(jù)包 |
PROROUTING鏈 | 在進行路由選擇后處理數(shù)據(jù)包 |
規(guī)則鏈的作用:容納各種防火墻規(guī)則,對數(shù)據(jù)包進行過濾或處理。
鏈的分類依據(jù):處理數(shù)據(jù)包的不同時機。
三、iptables配置
#前期準備
systemctl stop firewalld
3.1 基本語法
iptables [-t 規(guī)則表] 管理選項 [規(guī)則鏈] [匹配條件] [-j 處理動作]
iptables -t filter -A INPUT -s 192.168.0.1 - DROP
3.1.1 管理選項部分
管理選項 | 用法示例 |
---|---|
-A | 向規(guī)則鏈中添加一條規(guī)則,末尾追加 |
-I | 在規(guī)則鏈的指定位置插入一條規(guī)則,未指定序號默認作為第一條 |
-F | 清除鏈中所有規(guī)則 |
-P | 設(shè)置規(guī)則鏈的默認策略 |
-D | 從規(guī)則鏈中刪除一條規(guī)則 |
-R | 替換規(guī)則鏈中的一條規(guī)則 |
-L | 列出規(guī)則鏈中的所有規(guī)則 |
-n | 所有字段以數(shù)字形式顯示 |
-v | 顯示詳細信息 |
- -line-number | 查看規(guī)則編號 |
-N | 創(chuàng)建一個新的自定義規(guī)則鏈 |
-X | 刪除一個自定義規(guī)則鏈 |
-Z | 清空規(guī)則鏈中所有規(guī)則的數(shù)據(jù)包和字節(jié)數(shù)統(tǒng)計 |
-S | 看鏈的所有規(guī)則或者某個鏈的規(guī)則/某個具體規(guī)則后面跟編號 |
-E | 重新命名規(guī)則鏈 |
#允許來自192.168.1.0/24子網(wǎng)的數(shù)據(jù)包進入INPUT鏈
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
#刪除允許來自192.168.1.0/24子網(wǎng)的數(shù)據(jù)包進入INPUT鏈的規(guī)則
iptables -D INPUT -s 192.168.1.0/24 -j ACCEPT
#在INPUT鏈的第2條規(guī)則之前插入一條允許來自192.168.1.0/24子網(wǎng)的數(shù)據(jù)包進入的規(guī)則
iptables -I INPUT 2 -s 192.168.1.0/24 -j ACCEPT
#將INPUT鏈中的第2條規(guī)則替換為拒絕來自192.168.1.0/24子網(wǎng)的數(shù)據(jù)包的規(guī)則
iptables -R INPUT 2 -s 192.168.1.0/24 -j DROP)
#列出INPUT鏈中的所有規(guī)則
iptables -L INPUT
#清空INPUT鏈中的所有規(guī)則
iptables -F INPUT
#清空INPUT鏈的數(shù)據(jù)包和字節(jié)數(shù)統(tǒng)計
iptables -Z INPUT
#將INPUT鏈的默認策略設(shè)置為DROP,即拒絕所有數(shù)據(jù)包
iptables -P INPUT DROP
#將FORWARD鏈重命名為NFORWARD
iptables -E FORWARD NFORWARD
#創(chuàng)建一個名為MYCHAIN的新規(guī)則鏈
iptables -N MYCHAIN
#刪除名為MYCHAIN的自定義規(guī)則鏈
iptables -X MYCHAIN
3.1.2 匹配條件部分
指定匹配條件的選項 | 功能 |
---|---|
-p | 指定要匹配的 協(xié)議類型,例如TCP、UDP、ICMP等 |
-s | 指定 源IP地址或地址范圍 |
-d | 指定 目標IP地址或地址范圍 |
-i <網(wǎng)絡(luò)接口> | 指定 輸入網(wǎng)絡(luò)接口 |
-o<網(wǎng)絡(luò)接口> | 指定 輸出網(wǎng)絡(luò)接口 |
-m | 指定 擴展模塊,用于進一步定義匹配條件 |
- -icmp-type | 指定ICMP類型 |
- -sport | 指定源端口號或端口范圍 |
- - dport | 指定目標端口號或端口范圍 |
3.1.3 處理動作部分
處理動作 | 功能 |
---|---|
DROP | 直接 丟棄數(shù)據(jù)包,不給出任何回應(yīng)信息 |
REJECT | 拒絕數(shù)據(jù)包通過,會給數(shù)據(jù)發(fā)送端一個響應(yīng)信息 |
ACCEPT | 允許數(shù)據(jù)包通過(默認) |
SNAT | 修改數(shù)據(jù)包的源地址 |
DNAT | 修改數(shù)據(jù)包的目的地址 |
LOG | 在/var/log/messages文件中記錄日志信息,然后將數(shù)據(jù)包傳遞給下一條規(guī)則 |
MASQUERADE | 偽裝成一個非固定公網(wǎng)IP地址 |
3.2 查看規(guī)則
iptables -vnL #查看所有規(guī)則表的規(guī)則
-v 詳細信息
-n 數(shù)字形式顯示
-L 查看規(guī)則列表
iptable -vnL -t [規(guī)則表] #查看規(guī)則表的規(guī)則鏈,默認filter表
3.3 添加規(guī)則
#一般只對INPUT和PREROUTING規(guī)則鏈進行處理
#不處理OUTPUT POSTROUTING FORWARD
#新增規(guī)則,filter表為例
#拒絕來自 192.168.91.101的通信
iptables [-t filter] -A INPUT -s 192.168.2.100 -j DROP/REJECT
#插入規(guī)則
#將IP地址為192.168.2.101的源地址的流量丟棄
iptables -I INPUT 編號 -s 192.168.2.101 -j DROP
3.4 根據(jù)規(guī)則編號刪除 清空 替換規(guī)則
3.4.1 查看規(guī)則編號
iptables -vnL --line-numbers #查看規(guī)則編號
3.4.2 替換
iptables -R <規(guī)則鏈> <規(guī)則編號> <新規(guī)則>
#舉個例子
iptables -R INPUT 3 -p tcp --dport 22 -j ACCEPT
#替換INPUT鏈中第3條規(guī)則,將其內(nèi)容改為允許TCP協(xié)議的SSH流量(端口22)通過
3.4.3 刪除
iptables -D <規(guī)則鏈> <要刪除的規(guī)則>
或者
iptables -D <規(guī)則鏈> n #n為規(guī)則編號
3.4.4 清空
iptables -F #清空除默認策略外的所有規(guī)則
3.5 默認策略
3.5.1 簡介
默認策略是指當沒有明確的匹配規(guī)則時,iptables 對進出系統(tǒng)的網(wǎng)絡(luò)流量采取的默認處理方式。
有3種基本的默認策略:ACCEPT、DROP 和 REJECT。
-
ACCEPT:允許所有的數(shù)據(jù)包通過防火墻。
-
DROP:阻止所有的數(shù)據(jù)包通過防火墻。
-
REJECT:默認策略為 REJECT 與 DROP 類似,阻止所有的數(shù)據(jù)包通過防火墻。但不同的是,當數(shù)據(jù)包被攔截時,會向源主機發(fā)送一個拒絕響應(yīng)消息。
3.5.2 查看與配置
查看
iptables -L #查看當前 iptables 的默認策略
設(shè)置默認策略
iptables -P INPUT <策略>
iptables -P OUTPUT <策略>
iptables -P FORWARD <策略>
INPUT 是針對進入系統(tǒng)的數(shù)據(jù)包,
OUTPUT 是針對離開系統(tǒng)的數(shù)據(jù)包,
FORWARD 是針對通過系統(tǒng)的數(shù)據(jù)包
策略可以是 ACCEPT、DROP 或 REJECT
#舉個例子#
# 允許SSH進入
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允許HTTP和HTTPS流量
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
清空和刪除
無法直接清空或者刪除默認策略,iptables -F也不行。
只能將ACCEPT改成DROP/REJECT,或者反過來,某種意義上,也等同于刪除
3.6 基本匹配條件
基本匹配條件 | 功能 |
---|---|
-s | 源IP地址或者不連續(xù)的IP地址 |
-d | 目標IP地址或者不連續(xù)的IP地址 |
-p | 指定協(xié)議 |
-i | 報文流入的接口;只能應(yīng)用于數(shù)據(jù)報文流入環(huán)節(jié), |
-o | 報文流出的接口;只能應(yīng)用于數(shù)據(jù)報文流出的環(huán)節(jié) |
3.7 擴展匹配條件
3.7.1 隱性
man iptables-extensions
查看擴展幫助
.1 端口匹配
--sport
和--dport
必須配合-p <協(xié)議類型>
使用
只能用于匹配連續(xù)的端口
--sport 源端口
--dport 目的端口
可以匹配單個端口,也可以匹配端口范圍,以源端口匹配為例:
格式 | 含義 |
---|---|
–sport 1000 | 匹配源端口是1000的數(shù)據(jù)包 |
–sport 1000:3000 | 匹配源端口是1000-3000的數(shù)據(jù)包 |
–sport 1000: | 匹配源端口是1000及以上的數(shù)據(jù)包 |
–sport :3000 | 匹配源端口是3000及以下的數(shù)據(jù)包 |
.2 TCP標志匹配
--tcp-flags TCP標志
TCP標志 | 功能 |
---|---|
SYN(同步) | 用于建立連接。 |
ACK(確認) | 用于確認收到的數(shù)據(jù)。 |
FIN(結(jié)束) | 用于關(guān)閉連接。 |
RST(復位) | 用于重置連接。 |
URG(緊急) | 用于指示數(shù)據(jù)中有緊急數(shù)據(jù)部分。 |
PSH(推送) | 用于強制接收方立即處理數(shù)據(jù)。 |
#iptables允許通過來自ens33接口的,具有FIN、RST、ACK和SYN標志的TCP包
#只有SYN標志的TCP包,拒絕建立連接
iptables -I INPUT -i ens33 -p tcp \--tcp-flags FIN,RST,ACK SYN -j ACCEPT
.3 ICMP類型匹配
--icmp -type 0/3/8
代碼 | 含義 |
---|---|
8 | “Echo- Request” 表示請求 |
0 | “Echo- Reply” 表示回復 |
3 | "Dest ination-Unreachable"表示目標不可達 |
舉個例子
#丟棄icmp的包,別人ping不通本機,本機也ping不通別人
iptables -A INPUT -p icmp -j DROP
?
#禁止其他主機ping本機
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
?
#當本機ping不通其它主機時提示目標不可達,此時其它主機需要配置關(guān)于icmp協(xié)議的控制類型為REJECT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
3.7.2 顯示擴展模塊
顯示擴展必須加 -m
選項
.1 multiport擴展 多端口
可用于匹配非連續(xù)的端口,以離散的方式匹配,最多支持15個端口。
iptables -A INPUT -s 192.168.2.101 -p tcp -m \
multiport --dports 22,80,3306 -j REJECT
#拒絕來自源IP地址為192.168.2.101的TCP流量,并且目標端口號為22、80和3306
.2 iprange擴展 IP范圍
iprange擴展功能模塊用于在防火墻規(guī)則中匹配特定的IP地址范圍。
基本格式
-m iprange --src-range IP范圍
iptables -A INPUT -m ip range --src-range 192.168.91.101-192.168.91.103 -j REJECT
# 拒絕來自源IP地址范圍為192.168.91.101到192.168.91.103的所有流量,并且應(yīng)用于INPUT鏈(也就是進入服務(wù)器的流量)
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
#禁止轉(zhuǎn)發(fā)源地址位于192.168.80.100-192.168.80.200的udp數(shù)據(jù)包
.3 mac擴展 MAC地址(一般不用)
mac模塊用于匹配和處理MAC地址相關(guān)的防火墻規(guī)則,可以限制特定MAC地址的訪問或過濾特定MAC地址的流量。
基本格式
-m mac --mac-source XX:XX:XX:XX:XX:XX #根據(jù)源MAC地址匹配
-m mac --mac-destination XX:XX:XX:XX:XX:XX#根據(jù)目標MAC地址匹配
.4 string擴展 字符串
string模塊用于在數(shù)據(jù)包的內(nèi)容中搜索指定的字符串,并根據(jù)匹配結(jié)果執(zhí)行相應(yīng)的操作。
基本格式
-m string --string 字符串 --algo bm/kmp
#bm kmp為字符串檢測算法
iptables -A INPUT -p tcp --dport 80 -m string --string "example" --algo bm -j DROP
#對于目標端口為80的TCP流量,在數(shù)據(jù)包的內(nèi)容中搜索字符串"example"
#如果匹配成功,則使用DROP動作丟棄該數(shù)據(jù)包
.5 time模塊
time模塊用于根據(jù)時間條件匹配數(shù)據(jù)包,可以限制特定時間段內(nèi)進出防火墻的數(shù)據(jù)包。
基本格式
-m time --匹配選項 匹配條件
匹配選項 | 含義 |
---|---|
- -timestart | 指定開始時間 |
- -timestop | 指定結(jié)束時間 |
- -datestart | 指定開始日期 |
- -datestop | 指定結(jié)束日期 |
- -days | Mon-Fri |
iptables -A INPUT -m time --timestart 08:00 --timestop 17:00 \
--datestart 2023-08-01 --datestop 2023-08-31 --days Mon-Fri -j ACCEPT
#在2023年8月1日至2023年8月31日期間的每個工作日的08:00至17:00之間,接受(ACCEPT)輸入的數(shù)據(jù)
#如果不在指定的日期和時間范圍內(nèi)或不是工作日,則不匹配該規(guī)則
.6 connlimit擴展 連接數(shù)量
connlimit擴展模塊用于限制連接數(shù)量,根據(jù)活動連接數(shù)量的條件來控制數(shù)據(jù)包的流動。
基本格式
-m connlimit --connlimit-匹配選項 匹配條件
匹配選項 | 功能 |
---|---|
above n | 指定連接數(shù)量超過n個時觸發(fā)匹配 |
upto n | 指定連接數(shù)量小于n個時觸發(fā)匹配 |
equal n | 指定連接數(shù)量等于n個時觸發(fā)匹配 |
maks | 指定連接數(shù)量的掩碼來匹配連接數(shù)量 |
舉個例子
iptables -A INPUT -p tcp --syn --dport 80 \
-m connlimit --connlimit-above 10 -j REJECT
#對于TCP協(xié)議、目標端口為80的數(shù)據(jù)包,如果活動連接的數(shù)量超過10個,則拒絕該連接
iptables -A INPUT -p tcp --syn --dport 22 \
-m connlimit --connlimit-above 5 --connlimit-mask 16 -j REJECT
#對于TCP協(xié)議、目標端口為22(SSH)的數(shù)據(jù)包
#如果同一子網(wǎng)的連接數(shù)量超過5個,拒絕連接
.7 state 連接狀態(tài)(重要)
state模塊用于匹配連接的狀態(tài),根據(jù)連接的狀態(tài)來過濾數(shù)據(jù)包。
基本格式
--state state 連接狀態(tài)
常見連接狀態(tài) | 含義 |
---|---|
NEW | 與任何連接無關(guān)的,還沒開始連接 |
ESTABLISHED | 響應(yīng)請求或者已建立連接的,連接態(tài) |
RELATED | 與已有連接有相關(guān)性的(如FTP主被動模式的數(shù)據(jù)連接),衍生態(tài),一般與ESTABLISHED 配合使用 |
INVALID | 不能被識別屬于哪個連接或沒有任何狀態(tài) |
UNTRACKED | 未進行追蹤的連接,如:raw表中關(guān)閉追蹤 |
舉個例子
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
#對于輸入的數(shù)據(jù)包,如果連接狀態(tài)是NEW(新建連接)或ESTABLISHED(已建立連接),允許該數(shù)據(jù)包通過
四、SNAT和DNAT
4.1 SNAT
SNAT用于在網(wǎng)絡(luò)中修改數(shù)據(jù)包的源IP地址。
SNAT是一種單向的地址轉(zhuǎn)換技術(shù),只會修改數(shù)據(jù)包的源IP地址,不會修改目的IP地址。
SNAT轉(zhuǎn)換前提條件:
- 局域網(wǎng)各主機已正確設(shè)置IP地址、子網(wǎng)掩碼、默認網(wǎng)關(guān)地址;
- Linux網(wǎng)關(guān)開啟IP路由轉(zhuǎn)發(fā) 。
4.2 DNAT
DNAT應(yīng)用環(huán)境:在Internet中發(fā)布位于局域網(wǎng)內(nèi)的服務(wù)器
DNAT原理:目的地址轉(zhuǎn)換,根據(jù)指定條件修改數(shù)據(jù)包的目的IP地址,保證了內(nèi)網(wǎng)服務(wù)器的安全,通常被叫做目的映射。
DNAT轉(zhuǎn)換前提條件:
- 局域網(wǎng)的服務(wù)器能夠訪問Internet;
- 網(wǎng)關(guān)的外網(wǎng)地址有正確的DNS解析記錄;
- Linux網(wǎng)關(guān)開啟IP路由轉(zhuǎn)發(fā)。
4.3 配置實例
centos7-1(內(nèi)網(wǎng)服務(wù)器) ens33 192.168.2.100
centos7-2 (網(wǎng)關(guān)服務(wù)器) ens36 僅主機 12.0.0.1 ens33 192.168.2.102
centos7-3(外網(wǎng)服務(wù)器) ens33 僅主機 12.0.0.10
1) 前置準備
#關(guān)閉三個虛擬機的防火墻和selinux
systemctl stop firewalld
setenforce
.1 配置內(nèi)網(wǎng)服務(wù)器
將內(nèi)網(wǎng)服務(wù)器的網(wǎng)關(guān)修改為網(wǎng)關(guān)服務(wù)器的IP地址
systemctl restart network #重啟網(wǎng)絡(luò)服務(wù)
.2 配置外網(wǎng)服務(wù)器
修改為僅主機模式
修改IP地址為12.0.0.10
systemctl restart network #重啟網(wǎng)絡(luò)服務(wù)
.3 配置網(wǎng)關(guān)服務(wù)器
(1)添加新網(wǎng)卡,改為僅主機模式
(2)配置新網(wǎng)卡,IP地址為12.0.0.1
systemctl restart network #重啟網(wǎng)絡(luò)服務(wù)
(3)開啟網(wǎng)關(guān)服務(wù)器的路由轉(zhuǎn)發(fā)功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #將此行寫入配置文件
sysctl -p #讀取修改后的配置
(4)清空防火墻配置
iptables -F
2)使用SNAT,使內(nèi)網(wǎng)能夠訪問外網(wǎng)
(1)在網(wǎng)關(guān)服務(wù)器添加規(guī)則
iptables -t nat -A POSTROUTING -o ens36 -s 192.168.2.0/24 -j SNAT --to 12.0.0.1
(2)內(nèi)網(wǎng)ping外網(wǎng),檢測連通性
3)使用DNAT,使外網(wǎng)能訪問內(nèi)網(wǎng)
(1)在網(wǎng)關(guān)服務(wù)器添加規(guī)則
iptables -t nat -A PREROUTING -i ens36 -s 12.0.0.0/24 -p tcp --dport 80-j DNAT --to 192.168.2.100
(2)在內(nèi)網(wǎng)服務(wù)器啟動httpd服務(wù)文章來源:http://www.zghlxwxcb.cn/news/detail-661420.html
yum install -y httpd
vim /var/www/html/index.html
byyd yyds #訪問顯示內(nèi)容
systemctl start httpd
(3)外網(wǎng)服務(wù)器訪問網(wǎng)關(guān)服務(wù)器的ens36,檢查DNAT是否成功文章來源地址http://www.zghlxwxcb.cn/news/detail-661420.html
#補充知識
#字符界面 但是需要用到圖形化時
yum install epel-release -y #安裝epel源
yum -y install xorg-x11-xauth
systemctl start firewalld
export DISPLAY=192.168.2.1:0.0
#真機地址
yum install firewall-config -y
firewall-config #啟動圖形化界面
到了這里,關(guān)于Linux網(wǎng)絡(luò)服務(wù)之iptables防火墻工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!