1. 程式人生 > >iptables防火牆 filter表控制 擴充套件匹配 nat表典型應用

iptables防火牆 filter表控制 擴充套件匹配 nat表典型應用

NSD SECURITY DAY04

案例1:iptables基本管理 案例2:filter過濾和轉發控制 案例3:防火牆擴充套件規則 案例4:配置SNAT實現共享上網

1 案例1:iptables基本管理

1.1 問題

本案例要求練習iptables命令的使用,按照要求完成以下任務:

  1. 關閉firewalld,開啟iptables服務
  2. 檢視防火牆規則
  3. 追加、插入防火牆規則
  4. 刪除、清空防火牆規則

1.2 步驟

實現此案例需要按照如下步驟進行。

步驟一:關閉firewalld,啟動iptables服務

1)關閉firewalld伺服器

  1. [[email protected]
    ~]# systemctl stop firewalld.service
  2. [[email protected] ~]# systemctl disable firewalld.service

2)安裝iptables-services並啟動服務

  1. [[email protected] ~]# yum -y install iptables-services
  2. [[email protected] ~]# systemctl start iptables.service

步驟二:熟悉iptables框架

1)iptables的4個表(區分大小寫):

iptables預設有4個表,nat表(地址轉換表)、filter表(資料過濾表)、raw表(狀態跟蹤表)、mangle表(包標記表)。

2)iptables的5個鏈(區分大小寫):

INPUT鏈(入站規則)

OUTPUT鏈(出站規則)

FORWARD鏈(轉發規則)

PREROUTING鏈(路由前規則)     //DNAT用的是PREROUTING,修改的是目的地址

POSTROUTING鏈(路由後規則)   //SNAT用的是POSTROUTING,修改的是源地址

步驟三:iptables命令的基本使用方法

1)iptabels語法格式

  1. [[email protected] ~]# iptables [-t 表名] 選項 [鏈名] [條件] [-j 目標操作]
  2. [[email protected]
    ~]# iptables -t filter -I INPUT -p icmp -j REJECT
  3. [[email protected] ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT
  4. [[email protected] ~]# iptables -I INPUT -p icmp -j REJECT
  5. //注意事項與規律:
  6. //可以不指定表,預設為filter表
  7. //可以不指定鏈,預設為對應表的所有鏈
  8. //如果沒有找到匹配條件,則執行防火牆預設規則
  9. //選項/鏈名/目標操作用大寫字母,其餘都小寫
  10. ########################################################################
  11. //目標操作:
  12. // ACCEPT:允許通過/放行
  13. // DROP:直接丟棄,不給出任何迴應
  14. // REJECT:拒絕通過,必要時會給出提示
  15. // LOG:記錄日誌,然後傳給下一條規則

iptables命令的常用選項如表-1所示。

表-1 iptables常用選項

2)iptables命令的使用案例

建立規則的案例:

  1. [[email protected] ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
  2. //追加規則至filter表中的INPUT鏈的末尾,允許任何人使用TCP協議訪問本機
  3. [[email protected] ~]# iptables -I INPUT -p udp -j ACCEPT
  4. //插入規則至filter表中的INPUT鏈的開頭,允許任何人使用UDP協議訪問本機
  5. [[email protected] ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
  6. //插入規則至filter表中的INPUT鏈的第2行,允許任何人使用ICMP協議訪問本機

檢視iptables防火牆規則

  1. [[email protected] ~]# iptables -nL INPUT                    //僅檢視INPUT鏈的規則
  2. target prot opt source destination
  3. ACCEPT udp 0.0.0.0/0 0.0.0.0/0
  4. ACCEPT icmp 0.0.0.0/0 0.0.0.0/0
  5. ACCEPT tcp 0.0.0.0/0 0.0.0.0/0
  6. [[email protected] ~]# iptables -L INPUT line-numbers        //檢視規則,顯示行號
  7. num target prot opt source destination
  8. 1 ACCEPT udp anywhere anywhere
  9. 2 ACCEPT icmp anywhere anywhere
  10. 3 ACCEPT tcp anywhere anywhere

刪除規則,清空所有規則

      [[email protected] ~]# iptables -D INPUT 3

  1. //刪除filter表中INPUT鏈的第3條規則
  2. [[email protected] ~]# iptables -nL INPUT                //檢視規則,確認是否刪除
  3. [[email protected] ~]# iptables -F
  4. //清空filter表中所有鏈的防火牆規則
  5. [[email protected] ~]# iptables -t nat -F
  6. //清空nat表中所有鏈的防火牆規則
  7. [[email protected] ~]# iptables -t mangle -F
  8. //清空mangle表中所有鏈的防火牆規則
  9. [[email protected] ~]# iptables -t raw -F
  10. //清空raw表中所有鏈的防火牆規則

設定防火牆預設規則

      [[email protected] ~]# iptables -t filter -P INPUT DROP

  1. [[email protected] ~]# iptables -nL
  2. Chain INPUT (policy DROP)
  3. … …

2 案例2:filter過濾和轉發控制

2.1 問題

本案例要求建立常用主機防火牆規則以及網路防火牆規則:

  1. 針對Linux主機進行出站、入站控制
  2. 利用ip_forward機制實現Linux路由/閘道器功能
  3. 在Linux閘道器上實現資料包轉發訪問控制

2.2 方案

根據防火牆保護的物件不同,防火牆可以分為主機型防火牆與網路型防火牆,如圖-1所示。

主機型防火牆,主要保護的是伺服器本機(過濾威脅本機的資料包)。

網路防火牆,主要保護的是防火牆後面的其他伺服器,如web伺服器、FTP伺服器等。

2.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:iptables防火牆規則的條件

iptables防火牆可以根據很多很靈活的規則進行過濾行為,具體常用的過濾條件如表-2所示。

                                        

表-2 iptables過濾條件

1)主機型防火牆案例

  1. [[email protected] ~]# iptables -I INPUT -p tcp dport 80 -j REJECT
  2. [[email protected] ~]# iptables -I INPUT -s 192.168.2.100 -j REJECT
  3. [[email protected] ~]# iptables -I INPUT -d 192.168.2.5 -p tcp dport 80 -j REJECT
  4. [[email protected] ~]# iptables -I INPUT -i eth0 -p tcp dport 80 -j REJECT
  5. [[email protected] ~]# iptables -A INPUT -s 192.168.4.100 -j DROP
  6. //丟棄192.168.4.100發給本機的所有資料包
  7. [[email protected] ~]# iptables -A INPUT -s 192.168.2.0/24 -j DROP
  8. //丟棄192.168.2.0/24網路中所有主機發送給本機的所有資料包
  9. [[email protected] ~]# iptables -A INPUT -s 114.212.33.12 -p tcp dport 22 -j REJECT
  10. //拒絕114.212.33.12使用tcp協議遠端連線本機ssh(22埠)

步驟二:開啟Linux的路由轉發功能

1)Linux核心預設支援軟路由功能,通過修改核心引數即可開啟或關閉路由轉發功能。

  1. [[email protected] ~]# echo 0 > /proc/sys/net/ipv4/ip_forward            //關閉路由轉發
  2. [[email protected] ~]# echo 1 > /proc/sys/net/ipv4/ip_forward            //開啟路由轉發
  3. //注意以上操作僅當前有效,計算機重啟後無效
  4. [[email protected] ~]# echo ‘net.ipv4.ip_forward=1’ >> /etc/sysctl.conf
  5. //修改/etc/sysctl.conf配置檔案,可以實現永久有效規則

步驟四:網路型防火牆案例

1)網路型防火牆案例

部署如表-3所示的網路拓撲,一定要把proxy主機的路由轉發功能開啟。

表-3 實驗拓撲

新增閘道器的命令

  1. [[email protected] ~]# nmcli connection modify eth0 ipv4.gateway 192.168.4.5
  2. [[email protected] ~]# nmcli connection up eth0
  3. [[email protected] ~]# nmcli connection modify eth1 ipv4.gateway 192.168.2.5
  4. [[email protected] ~]# nmcli connection up eth1

確認不同網路的聯通性

  1. [[email protected] ~]# ping 192.168.2.100
  2. [[email protected] ~]# ping 192.168.4.100

在web1主機上啟動http服務

  1. [[email protected] ~]# yum -y install httpd
  2. [[email protected] ~]# echo “test page” > /var/www/html/index.html
  3. [[email protected] ~]# systemctl restart httpd

沒有防火牆的情況下client訪問web服務

  1. [[email protected] ~]# curl http://192.168.2.100                    //成功

設定proxy主機的防火牆規則,保護防火牆後面的Web伺服器

  1. [[email protected] ~]# iptables -I FORWARD -s 192.168.4.100 -p tcp dport 80 -j DROP

設定完防火牆規則後,再次使用client客戶端訪問測試效果

  1. [[email protected] ~]# curl http://192.168.2.100                    //失敗

步驟三:禁ping的相關策略

1)預設直接禁ping的問題?

  1. [[email protected] ~]# iptables -I INPUT -p icmp -j DROP
  2. //設定完上面的規則後,其他主機確實無法ping本機,但本機也無法ping其他主機
  3. //當本機ping其他主機,其他主機迴應也是使用icmp,對方的迴應被丟棄

2)禁止其他主機ping本機,允許本機ping其他主機

  1. [[email protected] ~]# iptables -A INPUT -p icmp \
  2. > icmp-type echo-request -j DROP
  3. //僅禁止入站的ping請求,不拒絕入站的ping迴應包

注意:關閉ICMP的型別,可以參考help幫助,參考命令如下:

  1. [[email protected] ~]# iptables -p icmp help

3 案例3:防火牆擴充套件規則

3.1 問題

本案例要求熟悉使用iptables的擴充套件規則,實現更豐富的過濾功能,完成以下任務:

  1. 根據MAC地址封鎖主機
  2. 在一條規則中開放多個TCP服務
  3. 根據IP範圍設定封鎖規則

3.2 方案

iptables在基本過濾條件的基礎上還擴充套件了很多其他條件,在使用時需要使用-m引數來啟動這些擴充套件功能,語法如下:

iptables 選項 鏈名稱 -m 擴充套件模組 –具體擴充套件條件 -j 動作

3.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:根據MAC地址過濾

1)根據IP過濾的確定是對方修改IP後,防火牆是失效

  1. [[email protected] ~]# iptables -F
  2. [[email protected] ~]# iptables -I INPUT -s 192.168.4.100 -p tcp dport 22 -j DROP
  3. //設定規則禁止192.168.4.100使用ssh遠端本機

但是,當client主機修改IP地址後,該規則就會失效,注意因為修改了IP,對client主機的遠端連線會斷開,需要使用virt-manager開啟虛擬機器操作:

  1. [[email protected] ~]# ifconfig eth0 192.168.4.101
  2. [[email protected] ~]# ssh 192.168.4.5                    //依然成功

根據MAC地址過濾,可以防止這種情況的發生

  1. [[email protected] ~]# ip link show eth0     (  [[email protected] ~]# nmap  -sP 192.168.4.100  )    //檢視client的MAC地址   
  2. eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
  3. link/ether 52:54:00:00:00:0b brd ff:ff:ff:ff:ff:ff
  4. [[email protected] ~]# iptables -A INPUT -p tcp dport 22\
  5. > -m mac mac-source 52:54:00:00:00:0b -j DROP
  6. //拒絕52:54:00:00:00:0b這臺主機遠端本機

步驟二:基於多埠設定過濾規則

1)一次需要過濾或放行很多埠時會比較方便

  1. [[email protected] ~]# iptables -A INPUT -p tcp \
  2. > -m multiport dports 20:22,25,80,110,143,16501:16800 -j ACCEPT
  3. //一次性開啟20,21,22,25,80,110,143,16501到16800所有的埠

提示,多埠還可以限制多個源埠,但因為源埠不固定,一般不會使用,顯示多個源埠的引數是–sports.

步驟三:根據IP地址範圍設定規則

1)允許從 192.168.4.10-192.168.4.20 登入

  1. [[email protected] ~]# iptables -A INPUT -p tcp dport 22 \
  2. > -m iprange src-range 192.168.4.10-192.168.4.20 -j ACCEPT

注意,這裡也可以限制多個目標IP的範圍,引數是–dst-range,用法與–src-range一致。

2)禁止從 192.168.4.0/24 網段其他的主機登入

  1. [[email protected] ~]# iptables -A INPUT -p tcp dport 22 -s 192.168.4.0/24 -j DROP

4 案例4:配置SNAT實現共享上網

4.1 問題

本案例要求設定防火牆規則,允許位於區域網中的主機可以訪問外網,主要包括下列服務:

  1. 搭建內外網案例環境
  2. 配置SNAT策略實現共享上網訪問

4.2 步驟

實現此案例需要按照如下步驟進行。

步驟一:搭建內外網案例環境

                                  

表-4 實驗拓撲

這裡,我們設定192.168.2.0/24網路為外部網路,192.168.4.0/24為內部網路。

現在,在外部網路中有一臺web伺服器192.168.2.100,因為設定了閘道器,client已經可以訪問此web伺服器了。但,如果檢視web1的日誌就會發現,日誌裡記錄的是192.168.4.100在訪問網頁。

我們需要實現的效果是,client可以訪問web伺服器,但要偽裝為192.168.2.5後再訪問web伺服器(模擬所有位於公司內部的電腦都使用的是私有IP,希望訪問外網,就需要偽裝為公司的外網IP後才可以)。

步驟二:設定防火牆規則,實現IP地址的偽裝(SNAT源地址轉換)

1)確保proxy主機開啟了路由轉發功能

      [[email protected] ~]# echo 1 > /proc/sys/net/ipv4/ip_forward            //開啟路由轉發

2)設定防火牆規則,實現SNAT地址轉換

  1. [[email protected] ~]# iptables -t nat -A POSTROUTING \
  2. > -s 192.168.4.0/24 -p tcp dport 80 -j SNAT to-source 192.168.2.5

3)登陸web主機檢視日誌

        [[email protected] ~]# tail /var/log/httpd/access_log

  1. .. ..
  2. 192.168.2.5 - - [12/Aug/2018:17:57:10 +0800] “GET / HTTP/1.1” 200 27 “-“ “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)”

通過日誌會發現,客戶端是先偽裝為了192.168.2.5之後再訪問的web伺服器!

4)擴充套件知識,對於proxy外網IP不固定的情況可以執行下面的地址偽裝,動態偽裝IP。

        [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp dport 80 -j MASQUERADE

內網要訪問外網,需要使用路由後鏈,改變的是源地址。

外網訪問內網,需要使用路由前,改變的是目的地址。

  1.  虛擬機器指定閘道器【192.168.4.254】

          2. 清空iptables filter,nat表裡面的規則

          3.開啟ip_forwar開啟

最後,所有iptables規則都是臨時規則,如果需要永久保留規則需要執行如下命令:

        [[email protected] ~]# service iptables save

fuser -k /dev/pts/1  //踢除指定終端的使用者