1. 程式人生 > 其它 >7376. 【2021.11.11NOIP提高組聯考】超級加倍

7376. 【2021.11.11NOIP提高組聯考】超級加倍

1. 基本概念

1.1 防火牆

在計算機中,防火牆是基於預定安全規則來監視和控制傳入和傳出網路流量的網路安全系統,計算機流入流出的所有網路通訊均要經過此防火牆。

防火牆分為硬體防火牆和軟體防火牆:

  • 硬體防火牆:是一種可以購買的獨立產品,通常用於寬頻路由器,通常比軟體防火牆可以給使用者提供更好的安全性,同時價格也更加貴。
  • 軟體防火牆:也叫作個人防火牆,是最常用的防火牆,常作為計算機系統上的程式執行,可定製,允許使用者控制其功能,軟體防火牆單獨使用軟體系統來完成防火牆功能,將軟體部署在系統主機上,其安全性較硬體防火牆差,同時佔用系統資源,在一定程度上影響系統性能。

1.2 netfilter和iptables概念

Netfilter 是 unix/linux 自帶的一款優秀且開放原始碼的完全自由的基於包過濾的防火牆工具,它的功能十分強大,使用非常靈活,可以對流入和流出伺服器的資料包進行很精細的控制,比如資料包過濾、資料包處理、地址偽裝、透明代理、動態網路地址轉換(NAT)等。

Netfilter 是 Linux 作業系統核心中的一個數據包處理模組,它所設定的規則是放在核心空間中的,而 iptables 是一個應用層的應用程式,它通過 Netfilter 提供的介面來對存放在核心空間中 Netfilter配置表進行修改,跟 iptables 類似的應用程式是 firewalld。

在 Centos7 後,iptables 服務的啟動指令碼已被忽略,管理 Netfilter 的應用程式替換成了 firewalld服務。儘管替換成了 firewalld ,但是 firewalld 服務底層呼叫的依舊是 iptables。

1.3 iptables 與 firewalld 的區別

  1. firewalld 可以動態修改單條規則,動態管理規則集,允許更新規則而不破壞現有會話和連線。而 iptables,在修改了規則後必須得全部重新整理才可以生效;
  2. firewalld 使用區域和服務而不是鏈式規則;
  3. firewalld 預設是拒絕的,需要設定以後才能放行。而 iptables 預設是允許的,需要拒絕的才去限制;
  4. firewalld 自身並不具備防火牆的功能,而是和 iptables 一樣需要通過核心的 netfilter 來實現。也就是說,firewalld 和 iptables 一樣,它們的作用都用於維護規則,而真正使用規則幹活的是核心的 netfilter。只不過 firewalld 和 iptables 的結果以及使用方法不一樣。

2. iptables防火牆

iptables 是 linux2.4 及 2.6 核心中整合的服務,主要工作在 0SI 七層的二、三、四層。如果重新編譯核心,iptables也可以支援7層控制(squid代理 + iptables)。

2.1 iptables 相關概念

  • 容器:容器就是用來裝東西的物品,水缸,包包、箱子等,在iptables裡用來描述包含的關係,裝的是各種各樣的規則;
  • 表(Table):表示鏈的容器,所有的鏈Chart都在對應的表上
  • 鏈(Chains): 鏈是規則的容器
  • 規則(Policy): 表示允許或者拒絕的規則

2.2 iptables 執行流程

如圖,iptables具體的工作流程如下:

  1. 防火牆是層層過濾的,實際是按照配置的規則從上到下,從前到後進行過濾的
  2. 如果匹配上規則,即明確表明是阻止還是通過,資料包就不再向下匹配新的規則
  3. 如果規則中沒有明確表明是阻止還是通過,也就是沒有匹配規則,向下進行匹配,直到匹配規則得到明確的阻止還是通過
  4. 防火牆預設的規則是所有規則執行完之後才執行,預設是允許

2.3 iptables 鏈的概念

上面介紹了鏈是存放規則的容器,當 iptables 開啟後,資料包從進入伺服器到從伺服器出去會經過五條鏈,分別是 PREROUTINGINPUTOUTPUTFORWAEDPOSTROUTING,分別表示路由前,輸入、輸出、轉發和路由後。

每條鏈中都有規則,一個數據包發起後,從這些規則裡一個一個從上到下進行匹配,串起來就像是一條鏈(chain),如圖:

  • INPUT鏈:當接收到防火牆本機地址的資料包(入站)時,應用此鏈中的規則
  • OUTPUT鏈:當防火牆本機向外傳送資料包(出站)時,應用此鏈中的規則
  • FORWARD鏈:當接收到需要通過防火牆傳送給其他地址的資料包(轉發)時,應用此鏈中的規則
  • PREROUTING鏈:在對資料包做出路由選擇之前(NAT),應用此鏈中的規則
  • POSTROUTING鏈:在對資料包做出路由選擇之後(SNAT),應用此鏈中的規則

其中中 INPUT、OUTPUT 鏈更多的應用在 主機防火牆 中,即主要針對伺服器本機進出資料的安全控制;而 FORWARD、PREROUTING、POSTROUTING 鏈更多的應用在 網路防火牆 中,特別是防火牆伺服器作為閘道器使用時的情況。

2.4 iptables 表的概念

由於每條鏈上都有規則,而有些規則都很類似,把具有相同功能的規則集合叫做表,iptables 為我們定義了4個表,每個表對應著不用的功能。4個表如下:

filter、nat、mangle、raw。其中,最常用的兩個表是 filter表nat表。

上面介紹的5鏈中,不是都存在於每個表中,每個表都有各自對應的鏈,錶鏈關係如下:

從上表可以看出,並不是每張表都有所有鏈,也就是不是每條鏈的規則都適用於每個表。

上面也說到,資料包進入防火牆後,匹配的規則是有順序之分的,是一條一條進行匹配的。而表是一些功能相似的規則的集合,那麼這個時候,哪個表的規則在鏈上的執行順序就需要注意了。參考下圖:

從上圖可見,無論在哪條鏈,raw的優先順序都是最高的。當4個表在同一條鏈上時,規則匹配的優先順序從高到低依次是:raw>mangle>nat>filter。

小結,iptables的工作流程:

2.5 iptables 規則的概念

iptabls 規則包含 條件動作。根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則後面指定的處理動作進行處理。

匹配條件

  • S_IP:source ip,根據源IP進行匹配
  • S_PORT:source port,根據源埠進行匹配
  • D_IP:destination ip,目標IP
  • D_PROT:destination port,目標埠
  • TCP/UDP:匹配TCP或者UDP協議

處理動作

  • ACCEPT:允許資料包通過
  • DROP:丟棄資料包,不迴應任何資訊給客戶端,客戶端在改請求超時後才有反應
  • REJECT:拒絕資料包,會給客戶端傳送一個數據包被丟棄的響應資訊
  • SNAT:S指Source,源NAT(源地址轉換)。在進入路由層面的route之後,出本地的網路棧之前,改寫源地址,目標地址不變,並在本機建立NAT表項,當資料返回時,根據NAT表將目的地址資料改寫為資料傳送出去時候的源地址,併發送給主機。解決私網使用者用同一個公網IP上網的問題;
  • DNAT:D指Destination,目的NAT,解決私網服務端,接收公網請求的問題。和SNAT相反,IP包經過route之前,重新修改目標地址,源地址不變,在本機建立NAT表項,當資料返回時,根據NAT表將源地址修改為資料傳送過來時的目標地址,併發給遠端主機。可以隱藏後端伺服器的真實地址;

3. iptables 實踐

Centos7預設沒有iptables防火牆,被firewalld替換了。不過可以自己進行安裝:

$ yum install -y iptables # 安裝iptables
$ yum install -y iptables-services # 安裝iptables服務管理

iptables是使用netfilter核心模組來實現防火牆功能,所以需要開啟相應的模組:

# 臨時載入核心模組
$ modprobe ip_tables && \
modprobe iptable_filter && \
modprobe iptable_nat && \
modprobe ip_conntrack && \
modprobe ip_conntrack_ftp && \
modprobe ip_nat_ftp && \
modprobe ipt_state

# 永久載入
$ cat >> /etc/rc.local <<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF

3.2 iptables命令引數

語法:iptables [-t table] command [鏈名] [條件匹配] [-j 處理動作]

  • -t table:用來指明要操作的表是哪個,不指定時預設為filter表。
  • command引數:增刪改查規則的操作,針對規則有以下引數:
    • -A:追加一條規則,預設放到該鏈的最後;
    • -I:在指定的位置插入規則,不指定位置預設在鏈的最上面插入。比如 iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT,在INPU鏈的第二個位置插入規則
    • -L:檢視規則列表,常與 **nvx **搭配使用:
      • n:只顯示 IP 地址和埠號碼,不顯示域名和服務名稱
      • v:顯示詳細資訊,包括每條規則的匹配包數量和匹配位元組數
      • x:在 v 的基礎上,禁止自動單位換算(K、M)
      • --line-number:可以檢視到規則序列號,在結合 -D 刪除具體第幾條規則時很有用
    • -D:從規則列表中刪除規則
    • -P:設定某條鏈的預設規則
    • -F:清空規則
    • -Z:將指定鏈的所有計數器歸零
  • 條件匹配引數
    • -i:匹配資料進入的網路介面,主要應用於nat表,如:-i eth0,匹配從網絡卡eth0流入的資料包
    • -o:匹配資料流出的網路介面,如:-o eth0 匹配從網絡卡eth0流出的資料包
    • -s:匹配源地址,可以是IP、網段、域名、也可以為空表示任何地址
    • -d:匹配目標地址
    • -p:匹配協議型別,如TCP、UDP、ICMP等
    • --sport:匹配源埠;可以是單個埠,也可以是埠範圍,當指定埠時,需要使用-p指定協議,否則會出錯
    • --dport:匹配目的埠
  • 處理動作
    • -j ACCEPT:允許資料包通過本鏈而不攔截它
    • -j DROP:丟棄資料包;阻止資料包通過改鏈,並且沒有訊息返回給客戶端
    • -j DNAT:目的地址轉換,支援轉換為單IP,也支援轉換到IP地址池
    • -j REJECT:拒絕資料包,會給客戶端傳送一個數據包被丟棄的響應資訊
    • ......

iptables 還有個 -m 選擇,用於指定附加模組。如:

# -m multiport:多埠匹配,如,允許訪問本機TCP/22,53,80,443埠
iptables -A INPUT -p tcp -m multiport --dports 22,53,80,443 -j ACCEPT

# -m limit:按速率進行匹配,如
iptables -A FORWARD -d 192.168.1.1 -m limit --limit 50/s -j ACCEPT

# -m mac:按來源mac地址匹配,如
iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

3.3 iptables filter表示例

3.3.1 禁止/允許訪問埠或者網段

# 禁止訪問本機的22埠
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

# 禁止訪問本機的22,80,443埠
iptables -I INPUT -p tcp -m multiport --dport 22,80,443 -j DROP

# 禁止訪問本地的1000到2000範圍內的埠
iptables -I INPUT -p tcp -m multiport --dport 1000:2000 -j DROP

# 禁止某個IP訪問,如禁止192.168.5.30訪問本機
iptables -I INPUT -s 192.168.5.30 -j DROP

# 禁止192.168.5.0網段的IP訪問本機的8080埠
iptables -I INPUT -s 192.168.5.0/24 -p tcp --dport 8080 -j DROP

3.3.2 禁ping

Linux預設是允許Ping響應的,系統是否允許Ping由2個因素決定的,分別是核心引數和防火牆,需要2個因素同時允許才能允許Ping,2個因素有任意一個禁Ping就無法Ping。

核心引數設定

  • 臨時允許Ping,echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
  • 永久允許Ping:echo "net.ipv4.icmp_echo_ignore_all=0" >> /etc/sysctl.conf && sysctl -p
  • net.ipv4.icmp_echo_ignore_all 等號後面的引數為0表示允許,為1表示禁止

防火牆設定

防火牆設定的前提是需要核心引數開啟允許Ping。通過iptables禁止Ping

iptables -A INPUT -p icmp --icmp-type8 -s 0/0 -j DROP

3.3.3 匹配TCP/IP狀態

-m state --state
  • NEW:已經或者將啟動新的連線

  • ESTABLISHED:已建立連線

  • RELATED:正在啟動新連線

  • INVALID:非法或無法識別的連線

一般都是允許的規則:

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

3.3.4 限制併發與速率

iptables -I INPUT -p icmp  --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
  • -m limit: 指定使用 limit 模組

  • --limit number/{hour/minute/second}:指定時間內的請求速率,number為速率,後面單位可選擇時分秒

  • --limit-burst number:在同一時間內允許通過的請求數,不指定預設為5

3.3.5 iptables規則的儲存和恢復

# 儲存
$ iptables-save > /etc/sysconfig/iptables

# 恢復
$ iptables-restore < /etc/sysconfig/iptables

3.3.6 filter表生產環境常用配置

$ cat iptables-init.sh 
# 清空規則
iptables -F

# 刪除使用者自定義的鏈
iptables -X

# 鏈的計數器清零(資料包計數器與資料包位元組計數器)
iptables -Z

# 允許訪問本地SSH的22預設埠
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

# 允許本機lo網絡卡的資料流入和流出
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 修改INPUT和FORWARD鏈的預設規則為拒絕
iptables -P INPUT DROP
iptables -P FORWARD DROP

# 允許訪問80和443埠
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT

# 允許來源IP是內網IP的訪問,網段根據自己需要進行修改
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT

# 儲存規則,儲存的檔案可以自定義
iptables-save > /etc/sysconfig/iptables

參考資料