一:網絡安全
1.1、昨日功能優化
配置后引發的問題:
配置iptables后防火墻起到了防護作用,但使用127.0.0.1訪問不了數據庫了
[root@localhost /]# mysql -u admin -p -h 127.0.0.1
Enter password:
思考:如果使用localhost可以訪問嗎? 是什么原因?
localhost
和127.0.0.1
的區別
localhost
:通常被解析為127.0.0.1
,但它的訪問方式不使用網卡,不受防火墻和網卡限制。它通過內存中的套接字(socket)進行通信。
127.0.0.1
:是一個具體的IP地址,訪問時會通過網卡傳輸數據,受防火墻和網卡設置的限制。當設置了iptables規則后,這些規則可能會影響網絡流量,特別是針對特定IP地址或端口的流量。
使用
127.0.0.1
無法登錄:
當您嘗試通過
127.0.0.1
連接MySQL時,數據包會通過網卡發送,并受到iptables規則的檢查。如果iptables規則中包含了阻止127.0.0.1
訪問MySQL端口(通常是3306)的規則,那么連接就會被拒絕。使用
localhost
可以登錄:
使用
localhost
連接MySQL時,數據不會通過網卡傳輸,而是直接在內存中通過套接字進行通信,因此不受iptables規則的影響。這樣即使iptables有阻止127.0.0.1
的規則,也不會影響到localhost
的連接。
配置iptables解決問題:
[root@localhost /]# iptables -A INPUT -i lo -j ACCEPT
[root@localhost /]# iptables -A OUTPUT -o lo -j ACCEPT
?# 查看規則
[root@localhost /]# iptables -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target ? ? prot opt in ? ? out ? ? source
destination ? ? ? ?
1153 68876 ACCEPT ? ? tcp -- * ? ? * ? ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp dpt:22 ?
4 ? 176 ACCEPT ? ? tcp -- * ? ? * ? ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp dpt:80 ?
0 ? ? 0 ACCEPT ? ? all -- lo ? ? * ? ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? ?Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target ? ? prot opt in ? ? out ? ? source ? ? ? ? ? ? ?
destination ? ? ? ?
?Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target ? ? prot opt in ? ? out ? ? source ? ? ? ? ? ? ? destination ? ? ? ?630 49672 ACCEPT ? ? tcp -- * ? ? * ? ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp spt:22
24 1056 ACCEPT ? ? tcp -- * ? ? * ? ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp spt:80 ?
0 ? ? 0 ACCEPT ? ? all -- * ? ? lo ? ? 0.0.0.0/0 ? ? ? ? ? 0.0.0.0/0 ?
iptables -A INPUT -i lo -j ACCEPT
允許所有從本地回環接口(
lo
)進入本機的網絡流量。簡單來說,就是讓本機可以接收來自自己內部的服務請求。
iptables -A OUTPUT -o lo -j ACCEPT
允許所有通過本地回環接口(
lo
)向外發送的網絡流量。也就是說,讓本機能正常回應自己內部發出的請求。
再次測試mariadb
[root@localhost /]# mysql -u admin -p -h 127.0.0.1
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]>
1.2、規則的保存與恢復
配置的防火墻規則如果不保存,在重啟之后規則需要重新配置,規則的保存命令如下:
# 將規則保存到etc/iptables-script
[root@localhost ~]# iptables-save > /etc/iptables-script# 恢復規則
[root@localhost ~]# iptables-restore /etc/iptables-script
1.3、安全加固
配置 MariaDB 以允許遠程主機訪問數據庫服務,并通過防火墻規則進一步限制只有特定 IP 范圍的客戶端可以訪問。
# 配置mariadb允許遠程訪問
MariaDB [mysql]> grant all privileges on *.* to 'admin'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
此操作雖然開放了遠程訪問權限,但并沒有限制具體的訪問源 IP。
如果僅需要特定 IP 可以訪問,應將
%
替換為具體的 IP 或子網(如'admin'@'192.168.114.0/24'
)
# 配置防火墻規則,允許訪問3306
[root@localhost ~]# iptables -A INPUT -p tcp --dport 3306 -m iprange --src
-range 192.168.114.100-192.168.114.150 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 3306 -m iprange--dst-range 192.168.114.100-192.168.114.150 -j ACCEPT
iptables -A INPUT -p tcp 允許指定 IP 范圍訪問 MariaDB 端口(3306)
iptables -A OUTPUT -p tcp 允許 MariaDB 向指定 IP 范圍發送響應數據
注意事項
最小權限原則:不要隨意使用
GRANT ALL PRIVILEGES
,應根據實際需求授予最小權限。IP 白名單限制:盡量避免使用
admin@%
,改為使用admin@192.168.114.0/24
等方式限制具體來源。保存防火墻規則:執行完 iptables 命令后,使用
service iptables save
或iptables-save > /etc/iptables/rules.v4
保存規則,防止重啟后失效。
1.4、狀態過濾
狀態過濾(Stateful Packet Inspection,SPI)是一種防火墻技術,它不僅檢查數據包的頭部信息(如源IP、目標IP、端口號等),還會跟蹤和維護連接的狀態信息。
通過這種方式,它可以更智能地判斷數據包是否合法,從而提高安全性。
假設已經配置了以下基本的
iptables
規則:# 允許 80 端口的入站(INPUT)流量 iptables -A INPUT -p tcp --dport 80 -j ACCEPT# 允許 80 端口的出站(OUTPUT)流量 iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT# 默認拒絕所有其他入站流量 iptables -P INPUT DROP iptables -P OUTPUT DROP
思考配置存在的問題
步驟 數據方向 源 IP:端口 目標 IP:端口 1. 請求發起 客戶端 → 服務器 192.168.1.10:54321 203.0.113.45:80 2. 響應返回 服務器 → 客戶端 203.0.113.45:80 192.168.1.10:54321 但這只是“無狀態”的規則 —— 它不會區分這個流量是否是主動發起連接后返回的響應
情況:A服務器不能遠程訪問其他服務器資源
A服務器主動連接C服務器
A服務器 主動向 C服務器 的
80
端口發起HTTP請求。源端口 是
5623
(一個非特權端口),目標端口 是80
。連接被 拒絕。
問題:
在
iptables
規則中,只允許目標端口為80
的入站流量,但沒有明確允許從A服務器
發起的出站流量。因此,即使
A服務器
使用非特權端口(如5623
)發起請求,這個連接也會被默認的DROP
策略拒絕。
那能不能將5623設置為開放呢? 同學們請思考:
當服務器(或客戶端)主動發起一個 TCP 連接時(比如訪問網頁、API 等),它會使用一個 臨時非特權端口(ephemeral port)作為源端口。
這些端口通常在 Linux 上是范圍在 32768 到 60999 或 49152 到 65535 之間(不同系統略有差異)。
所以每次建立新連接時,源端口都可能是不同的,而且是非特權端口。
如果想讓從A服務器主動發起訪問外部 80 端口的服務,并能接收到響應
# 允許主動發起訪問遠程 80 端口的請求 iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT# 允許遠程服務器返回給的響應數據包進來 iptables -A INPUT -p tcp --sport 80 -j ACCEPT
[ 本地程序 ] | | 使用 TCP 協議發起請求 | 源地址: 192.168.1.10:5623 | 目標地址: 203.0.113.45:80 v [ OUTPUT 鏈 - 出站規則 ] | | 檢查 iptables 規則: | -A OUTPUT -p tcp --dport 80 -j ACCEPT | 匹配目標端口為 80 → 放行 v [ 發送請求到遠程服務器 ] | | 數據包到達遠程 Web 服務器 | Web 服務器處理請求并準備返回響應 v [ 遠程 Web 服務器發送響應 ] | | 源地址: 203.0.113.45:80 | 目標地址: 192.168.1.10:5623 v [ INPUT 鏈 - 入站規則 ] | | 檢查 iptables 規則: | -A INPUT -p tcp --sport 80 -j ACCEPT v [ 響應數據包交付給本地程序 (端口 5623) ]
情況:A服務器不能ping其他服務器 (同理)
情況:B服務器與A服務器之間的正常通信
B服務器 向 A服務器 的
80
端口發起請求,源端口 是6534
。A服務器 響應 B服務器,源端口 是
80
,目標端口 是6534
。連接成功(綠色箭頭)。
情況:黑客可以通過自己的80端口,連接A服務器中的一個隨機端口
當從 A 服務器訪問一個 Web 服務器(如 B 服務器的
http://b.example.com:80
),通信過程如下:
步驟 數據包方向 源端口 目標端口 1. A 發起請求 A → B 隨機非特權端口(如 54321) 80 2. B 返回響應 B → A 80 54321 當我們在上面設置針對80的過濾規則之后,就會出現問題
IP欺騙:黑客構造一個TCP/IP數據包,并將該數據包的源IP地址設置為目標服務器信任的另一臺服務器的IP地址。這樣做的目的是讓目標服務器誤以為收到的數據包是來自一臺它信任的機器。
端口偽裝攻擊:在上述的基礎上,黑客進一步將源端口設為80(HTTP服務的默認端口)或其它常見的、被允許通過防火墻的服務端口。許多網絡管理員會開放這些端口以確保正常的服務通信,但這同樣可能成為攻擊者的入口。
繞過防火墻規則:如果防火墻規則配置不當,例如僅基于目的端口(
--dport
)或者源端口(--sport
)進行過濾,而沒有考慮連接的狀態或其他安全策略,那么黑客就有可能通過這種方式發送惡意流量并成功繞過防火墻限制。
1、處理方案:tcp協議標記位
使用tcp協議的標記位,阻止從外部進來的第一次握手請求
[root@localhost ~]# iptables -I INPUT -p tcp -m tcp --sport 80 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j DROP# 簡化寫法,只檢查SYN標記位
[root@localhost ~]# iptables -I INPUT -p tcp -m tcp -sport 80 --sync -j DROP# 但這樣做也是有問題的,比如協議時UDP是沒有標記位的,無法通過標記位去判斷來自外部的第一次請求
TCP 是面向連接的協議,通信前需要建立連接,過程如下:
客戶端 → 服務端:SYN(同步標志位)=1
服務端 → 客戶端:SYN=1, ACK=1
客戶端 → 服務端:ACK=1
所以:
第一次握手:只有
SYN=1
后續才是
SYN+ACK
或ACK
如果黑客試圖偽裝成 Web 服務器,主動發起連接(比如想攻擊本地的 SSH、MySQL 等服務),他會發送一個 SYN 包,源 IP 和源端口偽造為可信服務器的 80 端口。
通過上面的規則:
只攔截 SYN 請求(也就是“主動發起連接”的請求)
不影響正常的響應流量(因為正常響應是
SYN,ACK
或者只是ACK
)這樣就能有效防止黑客偽裝成 Web 服務器發起連接請求。
UDP 沒有 TCP 的標記位,所以不能使用
--syn
這類判斷。UDP 是無連接協議,沒有三次握手,所以這類規則對 UDP 無效。
有些合法服務可能會從源端口 80 發起連接,如果不加區分地丟棄所有來自源端口 80 的 SYN 請求,可能會導致某些正常連接失敗。
2、處理方案:state擴展
對于靜態的無狀態的防火墻,將每個數據包都看作是獨立的數據包,并不知道數據包之間的關系,
使用 state擴展,可以分析出數據包之間的關系,不再將每個數據包只看做孤立的,
所以使用了state擴展后 netfilter可以用作有狀態防火墻,相對于無狀態防火墻,有狀態防火墻可以定義更加精準的過濾條件。
state | 說明 |
---|---|
NEW | 新創建連接的數據包。這是指那些試圖建立新連接的初始數據包,通常包含TCP三次握手的第一個SYN包。 |
ESTABLISHED | 已連接狀態下的數據包。這些是已經成功建立連接后,在連接中傳輸的數據包,包括正常的數據交換和ACK確認等。 |
RELATED | 新建的,且與現有連接相關的數據包,典型的如ICMP數據包,FTP數據傳輸數據包。這類數據包雖然不是直接屬于某個已建立的連接,但與之相關聯,例如FTP的控制連接和數據連接、ICMP錯誤消息等。 |
INVALID | 沒有與現有連接相關的數據,像一匹孤狼,直接DROP。這類數據包無法被識別為任何已知連接的一部分,可能是由于網絡錯誤、攻擊或配置問題導致的無效數據包,通常會被丟棄以防止潛在的安全威脅。 |
NEW:當一個數據包試圖建立一個新的連接時,它會被標記為
NEW
。例如,當使用瀏覽器訪問一個網站時,計算機發送的第一個SYN包就是NEW
狀態。
ESTABLISHED:一旦連接成功建立,后續在這個連接中傳輸的所有數據包都會被標記為
ESTABLISHED
。這包括從網站下載的數據、向網站發送的請求等。
RELATED:有些數據包雖然不是直接屬于某個已建立的連接,但與之相關聯。例如,當使用FTP下載文件時,除了控制連接外,還會有一個數據連接用于實際的數據傳輸,這個數據連接的數據包就會被標記為
RELATED
。再比如,ICMP錯誤消息也是與某個已建立的連接相關的,因此也會被標記為RELATED
。
INVALID:如果一個數據包無法被識別為任何已知連接的一部分,它就會被標記為
INVALID
。這種情況可能是由于網絡錯誤、攻擊或配置問題導致的。為了安全起見,這類數據包通常會被直接丟棄(DROP)。
使用state擴展來配置防火墻
配置之前,無法ping外部主機
[root@localhost ~]# ping 192.168.114.1
PING 192.168.114.1 (192.168.114.1) 56(84) bytes of data.
ping: sendmsg: 不允許的操作
ping: sendmsg: 不允許的操作
結果顯示 ping
操作被拒絕,提示“不允許的操作”。這表明當前的網絡策略或防火墻設置阻止了 ICMP 請求。
無法訪問外部 web 服務
這個執行之前請去除源端口80規則(講解A-C的時候設置的)
[root@localhost ~]# wget www.baidu.com--2021-08-18 17:16:26-- http://www.baidu.com/
正在解析主機 www.baidu.com (www.baidu.com)... 失敗:未知的名稱或服務。wget: 無法解析主機
地址 “www.baidu.com”
配置 state 擴展
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
這里添加了兩條 iptables
規則來配置狀態擴展模塊:
INPUT 鏈規則:允許所有已建立(ESTABLISHED)和相關聯(RELATED)的入站數據包通過。
這意味著任何與現有連接相關的數據包都會被接受,例如響應數據包、ICMP 錯誤消息等。
OUTPUT 鏈規則:允許所有新建(NEW)、已建立(ESTABLISHED)和相關聯(RELATED)的出站數據包通過。
這意味著新的連接請求、現有連接的數據傳輸以及與現有連接相關的數據包都會被接受。
配置后,驗證
可以執行 ping
[root@localhost ~]# ping 192.168.114.1
PING 192.168.114.1 (192.168.114.1) 56(84) bytes of data.
64 bytes from 192.168.114.1: icmp_seq=1 ttl=128 time=0.165 ms
配置完成后,再次嘗試使用 ping
命令訪問外部 IP 地址 192.168.114.1
。
這次成功收到了回應,顯示 ICMP 數據包已經能夠正常發送和接收,說明出站和入站的 ICMP 流量已經被允許。
可以訪問外部資源
[root@localhost ~]# wget www.baidu.com
--2021-08-18 17:22:34-- http://www.baidu.com/
正在解析主機 www.baidu.com (www.baidu.com)... 14.215.177.39, 14.215.177.38
正在連接 www.baidu.com (www.baidu.com)|14.215.177.39|:80... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:2381 (2.3K) [text/html]
配置完成后,再次嘗試使用 wget
命令訪問百度網站 www.baidu.com
。
這次成功解析了主機地址并建立了連接,收到了 HTTP 200 OK 響應,說明出站和入站的 HTTP 流量已經被允許,可以正常訪問外部 Web 服務。
配置時需要注意規則的順序,如果將新加的state擴展規則,放到了前面,則可能回造成遠程客戶機 不能訪問本地web服務的問題。
nmap掃描
C:\Users\lisensir>nmap -sS -O 192.168.114.140
Starting Nmap 7.92 ( https://nmap.org ) at 2021-08-18 17:44 中國標準時間
Nmap scan report for 192.168.114.140
Host is up (0.00044s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp closed http
3306/tcp closed mysql
MAC Address: 00:0C:29:BC:31:9A (VMware)
Device type: general purpose
Running: Linux 3.x|4.x
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
更嚴謹一些的方式
# 1. 允許 TCP 協議、源端口為 1024-65535 的出站流量(NEW, ESTABLISHED, RELATED)
iptables -A OUTPUT -p tcp -m multiport --sports 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT# 2. 允許 UDP 協議、源端口為 1024-65535 的出站流量(NEW, ESTABLISHED, RELATED)
iptables -A OUTPUT -p udp -m multiport --sports 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT# 3. 允許 ICMP 協議的出站流量(NEW, ESTABLISHED, RELATED)
iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT# 4. 允許所有已建立和相關連接的入站流量
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
第一個: 允許TCP協議的出站流量,滿足以下條件:
源端口在 1024 到 65535 范圍內(即非特權端口,客戶端常用)
并且連接狀態是:新建 (
NEW
)、已建立 (ESTABLISHED
) 或相關 (RELATED
)客戶端發起請求時,通常使用隨機非特權端口(如瀏覽器訪問網頁、curl、wget 等),這些端口一般都在
1024~65535
。
使用
-m multiport --sports
可以限制只放行這類客戶端使用的源端口。結合狀態模塊,確保只放行合法的新建連接或已有連接的后續通信。
用途:允許本機主動發起 TCP 連接(如訪問 Web、SSH、數據庫等)
第二個: 允許UDP協議的出站流量,滿足以下條件:
源端口在
1024~65535
連接狀態是:新建、已建立或相關
解釋:
與第一條類似,但適用于 UDP 協議(如 DNS 查詢、NTP 時間同步、VoIP 等)
UDP 是無連接協議,但仍可通過狀態模塊追蹤會話
用途:允許本機主動發起 UDP 請求(如解析域名)
第三個: 允許ICMP協議(如 ping)的出站流量
連接狀態為:新建、已建立或相關
解釋:
ICMP 不涉及端口,所以不需要用到
multiport
模塊放行 ICMP 流量是為了允許執行
ping
、traceroute
等網絡診斷命令用途:允許本機使用 ping 和 traceroute 等工具測試網絡連通性
第四個: 允許所有已建立連接和相關連接的入站流量
解釋:
這是最關鍵的一條安全規則!
當服務器主動發起一個請求(如訪問某個網站、更新系統包),遠程服務器會返回響應數據包,這些響應包進入服務器時走的是
INPUT
鏈。如果不放行這些響應數據包,就收不到任何回復。
使用狀態模塊可以自動識別哪些是“自己發起的連接”的返回數據包,并安全地放行它們。
用途:讓服務器能正常接收自己請求的響應(比如 curl 返回結果)
二:FTP的防火墻配置
FTP分為主動模式和被動模式。
在主動模式下ftp服務器防火墻配置
# 允許入站的TCP連接到端口21(FTP控制端口),狀態為NEW或ESTABLISHED時接受
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT# 允許出站的TCP連接,源端口為21,目標端口在1024-65535之間,狀態為ESTABLISHED時接受
iptables -A OUTPUT -p tcp --sport 21 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT# 允許入站的TCP連接到端口20(FTP數據端口),狀態為ESTABLISHED時接受
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT# 允許出站的TCP連接,源端口為20,目標端口在1024-65535之間,狀態為NEW或ESTABLISHED時接受
iptables -A OUTPUT -p tcp --sport 20 --dport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
功能:允許入站的TCP連接到端口21(FTP控制端口)。
說明:當客戶端嘗試與FTP服務器建立新的連接(NEW)或者已經建立了連接(ESTABLISHED)時,允許這些連接通過防火墻。這是為了確保客戶端能夠成功地連接到FTP服務器并進行命令交互。
iptables -A OUTPUT -p tcp --sport 21 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
功能:允許出站的TCP連接,源端口為21,目標端口在1024-65535之間,狀態為ESTABLISHED時接受。
說明:當FTP服務器響應客戶端請求時,它會從端口21發送數據到客戶端的高隨機端口(1024-65535)。這條規則確保了這些響應數據包能夠順利通過防火墻返回給客戶端。
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
功能:允許入站的TCP連接到端口20(FTP數據端口),狀態為ESTABLISHED時接受。
說明:在主動模式下,FTP服務器會使用端口20來傳輸數據。這條規則確保了當數據傳輸已經開始(ESTABLISHED)時,數據包能夠順利通過防火墻到達客戶端。
iptables -A OUTPUT -p tcp --sport 20 --dport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
功能:允許出站的TCP連接,源端口為20,目標端口在1024-65535之間,狀態為NEW或ESTABLISHED時接受。
說明:在主動模式下,FTP服務器會從端口20發起新的數據傳輸連接(NEW)或者繼續已有的數據傳輸(ESTABLISHED)。這條規則確保了這些數據傳輸連接能夠順利通過防火墻。
在設置客戶端防火墻時,比較麻煩: 在入站規則中,服務器的20端口號需要對客戶機的一個隨機的非特權端口發起連接請求。為方便客戶機設置,出現了被動模式。
在被動模式下ftp服務器防火墻配置
# 1. 允許 FTP 控制連接(端口 21)
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT# 2. 允許 FTP 被動模式使用的端口范圍(5000-5100)
iptables -A INPUT -p tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 5000:5100 -m state --state ESTABLISHED -j ACCEPT# 3. 允許 FTP 主動模式下的數據連接(服務器端口 20)
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -m state --state NEW,ESTABLISHED -j ACCEPT# 4. 允許客戶端發起的數據連接(客戶端使用隨機非特權端口)
iptables -A INPUT -p tcp --sport 1024:65535 --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 1024:65535 --sport 20 -m state --state ESTABLISHED -j ACCEPT
2.1、連接跟蹤助手(了解即可)
它是 Netfilter(即 iptables/nftables)框架下的一個模塊,專門用于跟蹤 FTP 協議的連接狀態,尤其是被動模式下由服務器主動打開的額外數據連接。
若使用連接跟蹤模塊(nf_conntrack_ftp):
對于主動模式:
ftp服務器20端口號連接客戶端特定端口號的第一次握手信息(SYN)將被連接跟蹤模塊視為相關性的 (RELATED),客戶端的返回的(SYN,ACK)就是已連接(ESTABLISHED)的。
對于被動模式:
客戶端主動發起連接到ftp服務器的第一次握手信息(SYN)將被連接跟蹤模塊視為相關性的 (RELATED),ftp服務器的返回(SYN,ACK)則為已連接的(ESTABLISHED)
[root@localhost ~]# modprobe nf_conntrack_ftp
[root@localhost ~]# modinfo nf_conntrack_ftp
filename: /lib/modules/3.10.0-1160.15.2.e17.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko.xz
alias: nfct-helper-ftp
alias: ip_conntrack_ftp
description: ftp connection tracking helper
author: Rusty Russell <rusty@rustcorp.com.au>
license: GPL
retpoline: Y
rhelversion: 7.9
srcversion: F21861D5AD43080B93CC4DD
depends: nf_conntrack
intree: Y
vermagic: 3.10.0-1160.15.2.e17.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: 02:FB:1B:20:B0:39:E3:CD:C7:59:93:8B:A9:58:53:84:81:77:80:31
sig_hashalgo: sha256
parm: ports:array of ushort
parm: loose:bool
[root@localhost ~]#
2.2、實驗過程
安裝vsftp服務器
停用firewalld
使用nmap掃描,查看沒有設置防火墻的情況
首先設置防火墻允許22端口號,否則沒法使用遠程客戶端
[root@localhost /]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost /]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
設置默認規則,除明確允許的端口,禁止其他所有的端口
[root@localhost /]# iptables -P INPUT DROP
[root@localhost /]# iptables -P OUTPUT DROP
??允許客戶端發起到ftp服務器21命令端口號的連接
[root@localhost /]# iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED \
> -j ACCEPT -m comment --comment "ftp21命令端口"
# 允許外部客戶端通過 TCP 協議訪問本機的 FTP 控制端口(21),無論是新發起的連接還是已經建立的連接。[root@localhost /]# iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT \
> -m comment --comment "ftp21端口出站"
# 允許本機 FTP 服務通過 TCP 端口 21 發送響應數據包,但只允許那些屬于已建立連接的流量,防止非法出站行為。
主動模式下,允許服務器從20端口發起數據連接
[root@localhost /]# iptables -A OUTPUT -p tcp --sport 20 -m state --state RELATED,ESTABLISHED \
> -j ACCEPT -m comment --comment "允許ftp20端口出站"
# 允許服務器通過端口 20 向客戶端發送數據包,但只允許那些屬于已有 FTP 控制連接(端口 21)
或其關聯連接的數據包通過,確保安全性。[root@localhost /]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED \
> -j ACCEPT -m comment --comment "允許ftp服務器20端口進站"
# 允許客戶端通過端口 20 向服務器發送數據包,但僅限于已經建立的 FTP 連接(控制通道),從而
防止非法訪問。
被動模式下,允許客戶端連接ftp服務器的非特權端口