防火牆之 iptables軟件(Netfilter機制)

kernel版本不同 防火牆機制不同--2004年以後的distributions 已經都爲2.6的kernel

  • Version 2.0:使用 ipfwadm 這個防火牆機制;

  • Version 2.2:使用的是 ipchains 這個防火牆機制;

  • Version 2.4 與 2.6 :主要是使用 Netfilet機制的iptables 這個軟件,不過在某些早期的 Version 2.4 版本也同時支持 ipchains (編譯成爲模塊)。不過,不建議在 2.4 之後的核心版本使用 ipchains !

table 

    表格 防火牆可以有多個表格 :定義默認政策與規則 

    Linux的iptables至少有三個表格 

    管理本機進出的 filter表格 

    管理後端主機 (防火牆內部的其他計算機) 的 nat 表格

    管理特殊旗標使用的 mangle表格 (較少使用) 

chain 

    鏈 表格中可以有多個鏈

  • filter (過濾器):主要跟進入 Linux 本機的封包有關,這個是預設的 table!

    • INPUT:主要與想要進入我們 Linux 本機的封包有關;

    • OUTPUT:主要與我們 Linux 本機所要送出的封包有關;

    • FORWARD:這個咚咚與 Linux 本機比較沒有關係, 他可以『轉遞封包』到後端的計算機中,與nat table 相關性較高。

  • nat (地址轉換):是 Network Address Translation 的縮寫, 這個表格主要在進行來源IP與目的 IP 或 port 的轉換,與 Linux 本機較無關,主要與 Linux 主機後的局域網絡內計算機較有相關。

    • PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)

    • POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)

    • OUTPUT:與發送出去的封包有關

  • mangle (破壞者):這個表格主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鏈。 由於這個表格與特殊旗標相關性較高,所以單純的環境當中,較少使用 mangle table。

[root@www ~]# iptables [-t tables] [-L] [-nv]選項與參數:
-t :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用默認的 filter
-L :列出目前的 table 的規則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多!
-v :列出更多的信息,包括通過該規則的封包總位數、相關的網絡接口等

本機的iptables語法

列出filter table 的三條鏈規則

    [root@bird ~]# iptables -L -n

    Chain INPUT (policy ACCEPT)                                                                    INPUT鏈預設政策爲放行

    target        prot      opt  source               destination

    ACCEPT     all         --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED    規則1

    ACCEPT     icmp     --  0.0.0.0/0            0.0.0.0/0                                                                規則2

    ACCEPT     all         --  0.0.0.0/0            0.0.0.0/0

    ACCEPT     tcp       --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22

    ACCEPT     tcp       --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:23

    ACCEPT     tcp       --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8888

    REJECT     all         --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

    Chain FORWARD (policy ACCEPT)

    target     prot opt source               destination

    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

    Chain OUTPUT (policy ACCEPT)

    target     prot opt source               destination

  • target:代表進行的動作, ACCEPT 是放行,而 REJECT 則是拒絕,此外,尚有 DROP (丟棄) 的項目!

  • prot:代表使用的封包協議,主要有 tcp, udp 及 icmp 三種封包格式;

  • opt:額外的選項說明

  • source :代表此規則是針對哪個『來源 IP』進行限制

  • destination :代表此規則是針對哪個『目標 IP』進行限制

    以上的信息結合iptables-save命令查看比較清晰

    [root@bird ~]# iptables-save -t filter

    # Generated by iptables-save v1.4.7 on Wed Nov 16 21:01:07 2016

    *filter

    :INPUT ACCEPT [0:0]

    :FORWARD ACCEPT [0:0]

    :OUTPUT ACCEPT [11661:2912327]

    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    -A INPUT -p icmp -j ACCEPT

    -A INPUT -i lo -j ACCEPT

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT

    -A INPUT -j REJECT --reject-with icmp-host-prohibited

    -A FORWARD -j REJECT --reject-with icmp-host-prohibited

    COMMIT

    # Completed on Wed Nov 16 21:01:07 2016

修改防火牆規則前 一般都清除本機防火牆(filter)的所有規則 然後逐條添加 這三條規則不會改變預設政策policy

    一下只是臨時清除

    [root@bird ~]# iptables -F    清除所有的已定製的規則

    [root@bird ~]# iptables -X    殺掉所有使用者 自定義的tables

    [root@bird ~]# iptables -Z    將所有的chaind的計數與流量統計都歸零


定義預設政策policy

    當你的封包不在你設定的規則之內時,則該封包的通過與否,是以 鏈的Policy 的設定爲準

    將本機filter表格的INPUT鏈設置爲DROP

    [root@bird ~]# iptables -P INPUT DROP


封包的規則配置

[root@www ~]# iptables [-AI 鏈名] [-io 網絡接口] [-p 協議][-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]選項與參數:
-AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加"
   -A :新增加一條規則,該規則增加在原本規則的最後面。例如原本已經有四條規則,
        使用 -A 就可以加上第五條規則!
   -I :插入一條規則。如果沒有指定此規則的順序,默認是插入變成第一條規則。
        例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5 號
   鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。

-io 網絡接口:設定封包進出的接口規範
   -i :封包所進入的那個網絡接口,例如 eth0, lo 等接口。需與 INPUT 鏈配合;
   -o :封包所傳出的那個網絡接口,需與 OUTPUT 鏈配合;

-p 協定:設定此規則適用於哪種封包格式
  主要的封包格式有: tcp, udp, icmp 及 all 。

-s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,例如:
  IP  :192.168.0.100
  網域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
  若規範爲『不許』時,則加上 ! 即可,例如:
  -s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之封包來源;

-d 目標 IP/網域:同 -s ,只不過這裏指的是目標的 IP 或網域。

-j :後面接動作,主要的動作有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG)


封包的基礎規則比對:IP,網域及接口裝置(網卡)的配置

    沒有指定的選項 則表示該選項完全接受 

        設定lo爲受信任的裝置 即進入lo的封包都接受 

        [root@bird ~]# iptables -A INPUT -i lo -j ACCEPT 

        來自內網的封包都接受

        [root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT


        指定具體ip

        [root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.x -j DROP


        記錄某個規則 (只是記入日誌/var/log/messages中 會繼續依據後續規則對比)

        [root@bird ~]# iptables -A INPUT -s 192.168.x.x -j LOG 


TCP,UDP的規則比對:針對端口配置

[root@www ~]# iptables [-AI 鏈] [-io 網絡接口] [-p tcp,udp] 
\> [-s 來源IP/網域] [--sport 端口範圍]
\> [-d 目標IP/網域] [--dport 端口範圍] -j [ACCEPT|DROP|REJECT]
選項與參數:
--sport 端口範圍:限制來源的端口號碼,端口號碼可以是連續的,例如 1024:65535
—dport 端口範圍:限制目標的端口號碼。



   端口21的封包全部拒絕

   [root@bird ~]# iptabels -A INPUT -i eth0 -p tcp --dport 21 -j DROP


   只要來自 192.168.1.0/24 的 1024:65535 端口的封包,且想要聯機到本機的 ssh port 就予以拒絕

   [root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24  --sport 1024:65534 -dport ssh -j DROP


    TCP 還有特殊的旗標flags!針對主動聯機的 SYN 旗標的限制規則

   [root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.129.124/23  --sport 1:1023 -dport 1:1023 --syn  -j DROP


iptables的外掛模塊:  state 與 mac

     ipchains 沒有所謂的封包狀態模塊,因此我們必須要針對封包的進、出方向進行管控

     iptables 免除了這個困擾!他可以透過一個狀態模塊來分析 這個想要進入的封包是否爲剛剛我發出去的響應

[root@www ~]# iptables -A INPUT [-m state] [--state 狀態]選項與參數:
-m :一些 iptables 的外掛模塊,主要常見的有:
     state :狀態模塊
     mac   :網絡卡硬件地址 (hardware address)
--state :一些封包的狀態,主要有:
     INVALID    :無效的封包,例如數據破損的封包狀態
     ESTABLISHED:已經聯機成功的聯機狀態;
     NEW        :想要新建立聯機的封包狀態;
     RELATED    :這個最常用!表示這個封包是與我們主機發送出去的封包有關

    只要是已建立或相關封包就予以通過 只要是不合法的封包就丟棄 這樣就無需對“響應封包”單獨撰寫規則了

    [root@bird ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    [root@bird ~]# iptables -A INPUT -m state --state INVALID -j DROP


    針對網卡的接受與拒絕

    [root@bird ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT


ICMP 封包規則的比對:針對是否響應 ping 來設計

    通常我們會把 ICMP type 8 (echo request) 拿掉而已,讓遠程主機不知道我們是否存在,也不會接受 ping 的響應就是了 

    [root@bird ~]# iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP

    因爲客戶端需要檢測網絡是否暢通 所以局域網的路由器主機 建議不要關閉爲好

    

類別代號類別名稱與意義
0Echo Reply (代表一個響應信息)
3Destination Unreachable (表示目的地不可到達)
4Source Quench (當 router 的負載過高時,此類別碼可用來讓發送端停止發送訊息)
5Redirect (用來重新導向路由路徑的信息)
8Echo Request (請求響應消息)
11Time Exceeded for a Datagram (當數據封包在某些路由傳送的現象中造成逾時狀態,此類別碼可告知來源該封包已被忽略的訊息)
12Parameter Problem on a Datagram (當一個 ICMP 封包重複之前的錯誤時,會回覆來源主機關於參數錯誤的訊息)
13Timestamp Request (要求對方送出時間訊息,用以計算路由時間的差異,以滿足同步性協議的要求)
14Timestamp Reply (此訊息純粹是響應 Timestamp Request 用的)
15Information Request (在 RARP 協議應用之前,此訊息是用來在開機時取得網絡信息)
16Information Reply (用以響應 Infromation Request 訊息)
17Address Mask Request (這訊息是用來查詢子網 mask 設定信息)
18Address Mask Reply (響應子網 mask 查詢訊息的)


設置了一個本地虛擬機的規則

  1. 規則歸零:清除所有已經存在的規則 (iptables -F...)

  2. 預設政策:除了 INPUT 這個自定義鏈設爲 DROP 外,其他爲預設 ACCEPT;

  3. 信任本機:由於 lo 對本機來說是相當重要的,因此 lo 必須設定爲信任裝置;

  4. 迴應封包:讓本機主動向外要求而響應的封包可以進入本機 (ESTABLISHED,RELATED)

  5. 信任用戶:這是非必要的,如果你想要讓區網的來源可用你的主機資源時

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin;export PATH

iptables -F

iptables -X

iptables -Z

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -A INPUT -i lo -j ACCEPT    (本機迴環網卡開放)

iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT    (可以主動請求外部)

iptables -A INPUT -I eht0 -s 192.168.0.124/24 -j ACCEPT                開放了本機ip(宿主是手動設置的DHCP ip)

[root@bird shell]# chmod 744 firewall.sh

[root@bird shell]#./firewall.sh

[root@bird shell]# /etc/init.d/iptables status

表格:filter

Chain INPUT (policy DROP)

num  target     prot opt source               destination

1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

3    ACCEPT     all  --  192.168.129.0/24     0.0.0.0/0

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination

[root@bird shell]# /etc/init.d/iptables save

其實直接修改/etc/sysconfig/iptables 然後 /etc/init.d/iptables restart也可以

 IPv4的核心管理功能: /proc/sys/net/ipv4/*

    阻斷式服務 (DoS) ***法當中的一種方式,就是利用 TCP 封包的 SYN 三向交握原理所達成的,稱爲 SYN Flooding

    可以啓用核心的 SYN Cookie模塊來預防SYN Flooding

    SYN Cookie 可以在系統用來啓動隨機聯機的端口 (1024:65535) 即將用完時自動啓動。

    但不適合負載已經很高的服務器內 會延遲 比如SMTP

    當啓動 SYN Cookie 時,主機在發送 SYN/ACK 確認封包前,會要求 Client 端在短時間內回覆一個序號,這個序號包含許多原本 SYN 封包內的信息,包括 IP、port 等。若 Client 端可以回覆正確的序號,那麼主機就確定該封包爲可信的,因此會發送 SYN/ACK 封包,否則就不理會此一封包。

    啓動SYN Cookie模塊

    [root@bird ~]# echo "1" > /proc/sys/net/ipv4/tcp_syncookies


    數臺主機同時不斷攜帶大數據ping你的主機使主機帶寬被吃光,或系統會當 稱爲 ping flooding

    可以用防火牆來抵擋也可以用核心模塊來自動取消 ping 的響應

    [root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts    僅有 ping broadcast 地址時才取消 ping 的迴應

    [root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all     全部的 ping 都不迴應 不建議使用


    

 /proc/sys/net/ipv4/conf/網絡接口/*

    核心還可以針對不同的網絡接口進行不一樣的參數設定

    可以使用     echo "1" > /proc/sys/net/ipv4/conf/???/rp_filter 

    建議直接修改文件    /etc/sysctl.conf +sysctl -p

  • rp_filter:稱爲逆向路徑過濾 (Reverse Path Filtering), 可以藉由分析網絡接口的路由信息配合封包的來源地址,來分析該封包是否爲合理。舉例來說,你有兩張網卡,eth0 爲 192.168.1.10/24 ,eth1 爲 public IP 。那麼當有一個封包自稱來自 eth1 ,但是其 IP 來源爲 192.168.1.200 , 那這個封包就不合理,應予以丟棄。這個設定值建議可以啓動的。

  • log_martians:這個設定數據可以用來啓動記錄不合法的 IP 來源, 舉例來說,包括來源爲 0.0.0.0、127.x.x.x、及 Class E 的 IP 來源,因爲這些來源的 IP 不應該應用於 Internet 啊。 記錄的數據默認放置到核心放置的登錄檔 /var/log/messages。

  • accept_source_route:或許某些路由器會啓動這個設定值, 不過目前的設備很少使用到這種來源路由,你可以取消這個設定值。

  • accept_redirects:當你在同一個實體網域內架設一部路由器, 但這個實體網域有兩個 IP 網域,例如 192.168.0.0/24, 192.168.1.0/24。此時你的 192.168.0.100 想要向 192.168.1.100 傳送訊息時,路由器可能會傳送一個 ICMP redirect 封包告知 192.168.0.100 直接傳送數據給 192.168.1.100 即可,而不需透過路由器。因爲 192.168.0.100 與 192.168.1.100確實是在同一個實體線路上 (兩者可以直接互通),所以路由器會告知來源 IP 使用最短路徑去傳遞數據。但那兩部主機在不同的 IP 段,卻是無法實際傳遞訊息的!這個設定也可能會產生一些輕微的安全風險,所以建議關閉他。

  • send_redirects:與上一個類似,只是此值爲發送一個 ICMP redirect 封包。 同樣建議關閉。

   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章