iptables

iptables


一、基礎概念

1、防火墻概念

Firewall隔離工具;Packets Filter Firewall;工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件;

如果沒有防火墻,你的本機的所有端口都會被別人訪問到!

2、分類

  • 硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現;
    5
  • 軟件防火墻:應用軟件處理邏輯運行于通用硬件平臺之上的防火墻;

  • 主機防火墻:服務范圍為當前主機;
  • 網絡防火墻:服務范圍為防火墻被的局域網;

3、防火墻的兩個層面 — iptables/netfilter:

netfilter:防火墻框架,framework;位于內核空間;

iptables:命令行工具程序,位于用戶空間;規則管理工具;

  • netfilter:防火墻框架

      hooks function
          prerouting 路由之前
          input     入棧
          forward 轉發
          output 出棧
          postrouting     路由之后
    
  • iptables:為了驅動內核防火墻框架創造5條鏈

      CHAINS:鏈
          PREROUTING
          INPUT
          FORWARD
          OUTPUT
          POSTROUTING
    

4、Linux下防火墻如何實現?

1、iptables,這個只是方便用戶編寫各類規則交由netfilter處理執行。

2、一部分是基于TCP/IP協議棧的netfilter安全框架,通過“數據報文進入主機,內核處理完成,交由用戶空間處理,在由內核處理完成并響應給客戶”, 數據報文的處理路徑設置了各種規則鏈,根據規則鏈的順序或者特點, 又在規則鏈中增加功能表,通過在不同的功能表中設置具體的規則,來達到安全訪問。

那么netfilter的規則定義是如何來達到安全訪問的效果呢?

首先我們應該知道主機之間的通信是數據流,是參考OSI七層模型來包裝用戶的數據,OSI七層包括了應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層,每一層都有其自己的功能,netfilter就是通過識別每一層功能中的數據是否符合我們定義的規則,從而達到監控,修改,丟棄,轉發的目錄。        

5、報文流向:

到本機某進程的報文:PREROUTING –> INPUT

由本機轉發的報文:PREROUTING –> FORWARD –> POSTROUTING

由本機的某進程發出報文:OUTPUT –> POSTROUTING

6、tables:

  • filter:過濾,防火墻;
  • nat:network address translation,網絡地址轉換;
  • mangle:拆解報文,做出修改,并重新封裝;蓋戳
  • raw:關閉nat表上啟用的連接追蹤機制;

優先級次序(由高而低):

raw –> mangle –> nat –> filter

iptables

功能<–>鉤子:

raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT

iptables

7、iptables規則的組成部分:

匹配條件:

  • 網絡層首部:Source IP, Destination IP

  • 傳輸層首部:Source Port, Destination Port

  • 擴展檢查機制:拓展了可以檢查應用層首部,需要指明使用了那些擴展

處理動作:target

  • ACCEPT:允許
  • DROP :丟棄
  • REJECT:拒絕后并回應

二、安裝:

1、內核要確保安裝netfilter這個協議框架

netfilter:位于內核中的tcp/ip協議棧報文處理框架;對于任何發行版來說這都是必備的功能

2、iptables 工具:
iptables并不是一個服務,它只是內核中的一個功能而已,只要內核在,這個功能就在。我們并不需要啟動!雖然我們在centos 6上會用到service但只是用它來加載配置文件的!

CentOS 5/6:iptables命令編寫規則;

    # iptables -t filter -F
    # service iptables save

CentOS 7:firewalld,firewall-cmd, firewall-config

    # systemctl disable firewalld

注意:firewalld 我們并不建議使用,因為這只是在redhat這一個分支上使用并不能通用!
由于這個應用,centos7就沒有unit file文件,這需要我們自己加載配置的防火墻規則!

程序包:iptables, iptstate

三、iptables命令:

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

匹配條件

  • 基本匹配條件:源地址,目標地址,傳輸層協議
  • 擴展匹配條件:需要借助于擴展模塊進行指定的匹配條件
    • 隱式擴展:已經在基本匹配條件中指明的協議相關的擴展;
    • 顯式擴展:隱式擴展之外的其它擴展匹配條件;

處理動作:

  • 基本動作:ACCEPT,DROP,REJECT…
  • 擴展動作:需要借助于擴展模塊進行,但無須顯式指定,僅需指明動作;

添加規則時需要考量的問題:

  1. 報文流經的位置:用于判斷將規則添加至哪個鏈;
  2. 實現的功能:用于判斷將規則添加至哪個表;
  3. 報文的方向:用于判斷哪個為“源”,哪個為“目標”;
  4. 匹配條件:用于編寫能夠正確匹配目標報文的規則;

四、iptabls命令的使用格式:

    iptables [-t table] {-A|-C|-D} chain rule-specification

    iptables [-t table] -I chain [rulenum] rule-specification

    iptables [-t table] -R chain rulenum rule-specification

    iptables [-t table] -D chain rulenum

    iptables [-t table] -S [chain [rulenum]]

    iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

    iptables [-t table] -N chain

    iptables [-t table] -X [chain]

    iptables [-t table] -P chain target

    iptables [-t table] -E old-chain-name new-chain-name

        rule-specification = [matches...] [target]

        match = -m matchname [per-match-options]
        target = -j targetname [per-target-options]

規則管理格式:

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]

    -t table:指明要管理的表; 默認為filter;

iptables

iptables [-t table] COMMANDS:

鏈管理:

  • -P chain target
    定義鏈的默認策略;其target一般可使用ACCEPT或DROP;

  • -N chain
    自定義規則鏈;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數;

  • -X [chain]
    刪除自定義的空的引用計數為0的鏈;如果后邊不加名的話就會刪除所有符合的自定義鏈

  • -F [chain [rulenum]] [options…]
    清空指定的鏈,或刪除指定鏈上的規則,不指名就會刪除所在表上的所有鏈

  • -E old-chain-name new-chain-name
    重命名自定義的引用計數為0的鏈;

  • -Z [chain [rulenum]] [options…]
    清零,置零規則計數器;

規則:

  • -A:append, iptables [-t table] -A chain rule-specification,
    追加規則到指定的鏈尾部;

  • -I:insert, iptables [-t table] -I chain [rulenum] rule-specification,
    插入規則到指定的鏈中的指定位置,默認為鏈首;

  • -D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum
    刪除指定的鏈上的指定規則;指明規則的條件來刪除那條規則,或直接刪除規則所對應的額號碼

  • -R:replace,iptables [-t table] -R chain rulenum rule-specification,
    將指定的鏈上的指定規則替換為新的規則;

查看:-vnL

-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
    -n:數字格式;
    -v:verbose,詳細格式信息;
    -vv, -vvv 
    --line-numbers:顯示鏈上的規則的編號;
    -x:exactly,顯示計數器的精確值; 

計數器:

    每條規則以及鏈的默認策略分別有各自的兩個計數器:
    (1) 匹配到的報文的個數:pkts
    (2) 匹配到的所有報文的大小之積:bytes

總結

iptables/netfilter

四表:raw, mangle, nat, filter
五鏈:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

iptables命令:

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]
    COMMANDS:
        鏈管理:-P,-N,-X,-E,-F,-Z
        規則管理:-A,-I,-D,-R
        查看:-L,-n, -x, -v, --line-numbers

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]

匹配條件

基本匹配條件
擴展匹配條件
    隱式擴展
    顯式擴展

注意:多重條件之間的隱含邏輯為“與”操作;

1.基本匹配條件:

  • [!] -s –source address[/mask][,…]:檢查報文中的源IP地址是否符合此處指定的地址或地址范圍;
  • [!] -d, –destination address[/mask][,…]:檢查報文中的目標IP地址是否符合此處指定的地址或地址范圍;

  • [!] -p, –protocol protocol:檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 “all”;

  • [!] -i, –in-interface name:檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD and PREROUTING ;

  • [!] -o, –out-interface name:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING;

-m, –match match:顯式指明要使用的擴展模塊;
-j, –jump target:跳轉目標;

我們設置防火墻規則時 一般都是要把入棧進程阻斷!不過最好INPUT OUTPUT都要阻斷最好

練習1.設置防火墻規則為默認禁止所有人訪問,只允許自10.1.250.28主機進行訪問
iptables
練習2、在上提基礎上加上允許10.1.0.0/16網絡上的主機都能訪問但10.1.249.175不能訪問
iptables
練習3、刪除練習1的記錄條目兩種方法
iptables

iptables
練習4、僅允許10.1.0.0/16網段對本機(10.1.6.72)tcp開放
iptables

2.擴展匹配條件:

隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議后可直接對給定的協議所進行的擴展;

  • -p tcp:可直接使用tcp協議對應的擴展選項;
    [!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;

    [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;

    [!] --tcp-flags mask(所有標志位) comp(標志位為1)
        SYN,ACK,FIN,RST,URG,PSH;

    mask:要檢查的標志位列表,以逗號分隔,例如SYN,ACK,FIN,RST 

    comp:mask給定的眾標志位中,其值必須為1的標志位列表,余下的必須為0;

        --tcp-flags SYN,ACK,FIN,RST SYN 

    [!] --syn:相當于--tcp-flags SYN,ACK,FIN,RST SYN 
        表示匹配 tcp標志位中的SYN,ACK,FIN,RST,且其中只有SYN為1其他為0的位
        TCP握手的第一次,初次連接
  • -p udp:可直接使用udp協議對應的擴展選項;
    [!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
    [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;
  • -p icmp:可直接使用icmp協議對應的擴展選項;
    [!] --icmp-type   {type[/code]|typename}
        --icmp-type  0/0:匹配對ping請求的響應報文
        --icmp-type 8/0:匹配ping請求報文

例1.:僅開放本機(10.1.6.72)tcp 22號端口給本網段
iptables

iptables

例2、在1的基礎上允許別人ping本地主機
iptables

例3、在此基礎上允許自己ping其他主機
iptables

(2)顯式擴展:必須使用-m選項給出matchname的擴展,而且有些擴展都還存在專用選項;

1、multiport
以離散或連續的方式定義的多端口匹配條件; Up to 15 ports can be specified.

    [!] --source-ports,--sports port[,port|,port:port]...‘:’指定多個源端口;

    [!] --destination-ports,--dports port[,port|,port:port]...‘:’指定多個目標端口;

    [!] --ports port[,port|,port:port]...‘:’匹配此處指定的源或目標端口;

2、iprange
以連續的ip地址范圍指明多地址匹配條件;

    [!] --src-range from[-to]

    [!] --dst-range from[-to]

3、string
對報文中的應用層數據做字符串匹配檢測;

    [!] --string pattern
    [!] --hex-string pattern
        --algo {bm|kmp}:字符串匹配檢查算法;
        --from offset  不檢查from之前的字符
        --to offset        到達的to字符之后的字符

    iptables -I OUTPUT -s 10.1.0.6 -p tcp --sport 80 -m string --string "haha" --algo bm -j REJECT
        表示定義到達本機(10.1.0.6)上的tcp 80端口用 bm算法匹配到含有字符為 “haha” 的就拒絕并回    

:服務端對 “haha“字符做了限制
iptables

iptables

客戶端也可以對請求的網頁做限制
iptables

iptables

4、time
根據報文到達的時間與指定的時間范圍進行匹配度檢測;

     --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
     --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

     --timestart hh:mm[:ss]:只給定起始表示從這時開始一直有效
     --timestop hh:mm[:ss]:表示到此就完了

     [!] --monthdays day[,day...]

     [!] --weekdays day[,day...]

iptables -I INPUT -d 10.1.6.72 -p tcp –dport 23 -m time –timestart 16:00:00 –timestop 09:00:00 ! –weekdays Sat,Sun -j REJECT
iptables

5、connlimit 
根據每客戶端IP做并發連接數限制,即限制單IP可同時發起連接請求;

    --connlimit-upto n:連接數小于等于閾值;
    --connlimit-above n:連接數超出閾值;

~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
        單個ip的請求的連接請求大于 2個就REJECT            

6、limit 
基于收發報文的速率進行匹配;

    --limit rate[/second|/minute|/hour|/day]
    --limit-burst number

     ~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT

iptables
設置令牌桶為3 每分鐘20個

7、state *重要

狀態檢測:連接追蹤機制(conntrack)

相當于在連接前建立了一個表,每次連接前都要與這個表中的ip匹配,這張表中的內容會有默認的保存時間! 不要隨意打開這個連接追蹤器,因為如果訪問并發數非常大的話就會導致某些請求相應不了!

    NEW:新連接

    ESTABLISHED:已建立的連接,
        NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信的狀態

    RELATED:相關聯的連接
        如ftp協議的命令連接與數據連接之間的關系;
            modprobe nf_conntrack_ftp   要先打開這個
    INVALID:無法識別的連接

    UNTRACKED:未被追蹤連接;

    [!] --state state

相關的內核模塊:
    nf_conntrack
    nf_conntrack_ipv4
    nf_conntrack_ftp
  • 已經追蹤到并記錄下的連接:

      /proc/net/nf_conntrack
    
  • 能追蹤的最大連接數量定義在:

      /proc/sys/net/nf_conntrack_max
          建議調整至足夠大;和內存空間有關系
    
  • 不同的協議的連接追蹤時長:

      /proc/sys/net/netfilter/
    
          [!] --state state
    

iptables

iptables

如何開放被動模式的ftp服務:

(1) 裝載追蹤ftp協議的模塊;
    # modprobe nf_conntrack_ftp

    這個模塊是Netfilter專門用來處理FTP這個復雜協議的模塊,它能夠將FTP的數據包標識為RELATED狀態,從而允許使用被動模式訪問。
    使用命令: modprobe   nf_conntrack_ftp   加載該模塊,之后客戶端就能以被動模式連接至FTP服務器了。                        
(2) 放行入站命令連接
    # iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

(3) 放行入站數據連接
    # iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

(4) 放行出站的ESTABLISHED連接
    # iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT

1.處理動作(跳轉目標):

-j tagetname [per-target-options]
  • 簡單target:
    ACCEPT,DROP

  • 擴展target:
    REJECT:

–reject-with type
默認為icmp-port-unreachable;

        icmp-net-unreachable, 網絡不可達 
        icmp-host-unreachable,  主機不可達
        icmp-port-unreachable,     端口不可達
        icmp-proto-unreach‐able, 協議不可達
         icmp-net-prohibited,  網絡被禁止    
        icmp-host-prohibited,     主機被禁止
        icmp-admin-prohibited,    管理禁止
        *  表示所有

LOG: 要在拒絕之前使用

        Turn  on  kernel  logging of matching packets.

        --log-level level
        --log-prefix prefix:日志信息的前導信息;
        -j LOG --log-prefix prefix "內容表示 日志信息的前綴"

規則優化的思路:

  1. (1) 優先放行雙方向狀態為ESTABLISHED的報文;
  2. (2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
  3. (3) 服務于同一類別的功能的規則,匹配條件較為嚴格的放前面;
  4. (4) 設置默認策略:白名單機制
    • (a) 可使用iptables -P設定默認策略;
    • (b) 建議在規則鏈的最后定義規則做為默認策略;

保存和載入規則:

    保存:iptables-save > /PATH/TO/SOME_RULE_FILE 
    重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE  注意默認會清空原有的表!
        -n, --noflush:不清除原有規則
        -t, --test:僅分析生成規則集,但不予提交;

        注意:重載文件中的規則,會清除已有規則;

    CentOS 6:要先要有這個文件

        保存規則:service  iptables  save
            保存規則于/etc/sysconfig/iptables,保存操作會清除文件中原有的內容;
        重載規則:server iptables restart 
            默認重載/etc/sysconfig/iptables文件中的規則

        腳本配置文件:/etc/sysconfig/iptables-config
            用于指明要裝載的模塊;
        IPTABLES_MODULES="nf_conntrack_ftp"就會把依賴的模塊裝載,先要touch 一個/etc/sysconfig/iptables 就能裝載此文件了

    CentOS 7開機自動生效規則:

        (1) firewalld服務;
        (2) shell腳本,直接記錄iptables命令;
        (3) 自定義unit file或init script;
    自動生效規則文件中的規則:
        把iptables命令放在腳本文件中,讓腳本文件開機自動運行
                /etc/rc.d/rc.local
                iptables-restore < /PATH/TO/SOME_RULE_FILE 
                或者此文件內寫上腳本的路徑 /usr/bin/iptables.sh

練習:

基于狀態放行telnet, ftp, ssh, http, samba, icmp等服務;

  • (1) 對本機的ping請求每分鐘不得超出20個;
  • (2) 每客戶端對本機的ssh的并發連接數不得超過3個;
  • (3) 本機的telnet服務僅允許工作時間內訪問;
iptables -I INPUT -d 10.1.6.72 -p icmp --icmp-type 8 -m limit --limit-burst 1 --limit 20/minute    
    設置對本機的ping請求不超過20/min

~]# iptables -I INPUT -d 10.1.6.72 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT    
    設置22端口 ssh的連接數不能大于3個

iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --weekdays Sat,Sun --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
    設置周六周天拒絕telnet服務

iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --timestart 10:00:00 --timestop 00:00:00 --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
    設置非工作時間禁止使用telnet

iptables -A INPUT -d 10.1.6.72 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    設置允許RELATED ESTABLISHED

 ~]# iptables -A INPUT -d 10.1.6.72 -p tcp -m multiport --dport 21:23,80,139,445 -m state --state NEW -j ACCEPT
     設置對21:22:80:139:445第一次請求不限制
iptables -A INPUT -d 10.1.6.72 -p udp -m multiport --dport 138,139 -m state --state NEW -j ACCEPT
    設置對138,139號udp端口的第一次相應不限制

iptables -A INPUT -d 10.1.6.72/32 -j REJECT
    禁止其他對端口的訪問


iptables -A OUTPUT -s 10.1.6.72 -p udp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 10.1.6.72 -p tcp -m state --state ESTABLISHED -j ACCEPT

iptables -I OUTPUT -s 10.1.6.72 -p icmp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 10.1.6.72/32 -j REJECT            

原創文章,作者:qzx,如若轉載,請注明出處:http://www.www58058.com/54715

(0)
qzxqzx
上一篇 2016-10-26
下一篇 2016-10-26

相關推薦

  • 計算機的組成及功能

    計算機的組成有中央處理器(包含邏輯運算器和控制器)、內存、輸入設備、輸出設備    邏輯運算器主要負責程序的運算和邏輯的判斷、控制器是協調各組件與各單元的工作。 內存是與CPU進行溝通的橋梁,其作用是用于暫時存放CPU中的運算數據,以及與硬盤等外部存儲器交換的數據。 輸入設備是用戶和計算機系統之間進行信息交換的主要裝置之一。 輸出設備是外…

    Linux干貨 2017-07-02
  • RAID功能介紹及其使用

    RAID功能介紹及其使用 獨立硬盤冗余陣列(RAID, Redundant Array of Independent Disks),舊稱廉價磁盤冗余陣列(Redundant Array of Inexpensive Disks),簡稱磁盤陣列。其基本思想就是把多個相對便宜的硬盤組合起來,成為一個硬盤陣列組,使性能達到甚至超過一個價格昂貴、容量巨大的硬盤。根據…

    Linux干貨 2017-01-06
  • Linux網絡功能協議介紹(二)

      上個內容中,我們知道了只要是本地通信得廣播,而廣播不是邏輯(IP)地址對應的MAC地址,所以主要是將邏輯地址轉換成目標地址,這叫地址解析稱為ARP,還有一種是反向解析RARP,都是在本地網絡中完成的,邏輯IP地址分為兩個階段,前一段分為網絡地址,后一段分為主機地址,如何判定?用子網掩碼用來判斷那一部分是網絡位,那一部分是主機位,最重要…

    Linux干貨 2016-11-25
  • 《 Git 權威指南 》學習筆記

    這個沒辦法直接發博客了,篇幅太長,無法直接在 Blog 上排版了,直接發上 pdf 文檔了。 接 《LNAMP Shell 部署腳本》 博文的內容,線上測試系統的 Git 環境部署。 整個 Git 環境包括了:     Git / Gitweb     Gitolite / Gerrit &nbsp…

    Linux干貨 2015-10-27
  • 把編譯安裝的httpd 實現服務腳本,通過service和chkconfig 進行管理

    把編譯安裝的httpd 實現服務腳本,通過service和chkconfig 進行管理 1 編譯安裝httpd 把httpd編譯安裝在/app/httpd/目錄下。 2 在/etc/rc.d/init.d/目錄下新建一個文件httpd 這個文件的目的在于讓service 命令可以管理編譯安裝的httpd服務。 文件內容如下: [root@CentOS68 ~…

    Linux干貨 2017-05-15
  • bash腳本編程之select語法詳解

    shell編程之select select控制結構(在tcsh中不可用)基于Korn Shell中的控制結構 select語句首先顯示一個菜單,然后根據用戶的選擇給變量賦予相應的值,最后執行一系列命令 其語法如下: select varname in list do commands done select 表達式是一種bash的擴展應用,動作包括: 自動用…

    Linux干貨 2016-08-24
欧美性久久久久