iptables基礎概念

iptables基本概念梳理

前言

netfilter/Iptables (其中包括netfilter和Iptables兩個組件)組 成了Linux平臺下的包過濾防火墻,它與大多數的Linux自帶軟 件一樣,這個防火墻是免費提供的,它可以代替昂貴的企業級 防火墻來解決實際問題與實際方案,完成封包過濾,封包重定 向和網絡地址轉換等功能。

一、工作原理

數據包從外網傳送到防火墻后,防火墻在IP層向TCP層傳 送之前,將數據包轉發給檢查模塊進行處理。其過程如下。

⑴ 首先與第一個過濾規則比較。

⑵ 如果與第一個模塊相同,則對它進行審核,判斷是否要 轉發該數據包,這時審核的結果是轉發數據包,則將數據包發 送到TCP層進行處理,否則就將它丟棄。

⑶ 如果與第一個過濾規則不同,則接著與第二個規則相 比較,如果相同則對它進行審核,過程與上一步相同。

⑷ 如果與第二個過濾規則不同,則繼續與下一個過濾規 則比較,直到與所有的過濾規則比較完成。要是不滿足所有過 濾規則,就將數據丟棄。

iptables基礎概念

二、iptables規則集

規則就是決定如何處理一個包的語句。如果一個包符合 所有的條件(match),我們就運行target指令。

書寫規則的語法格式是:

Iptables [-t table] command [match] [target]

一條Iptables規則包含上面四個元素:表,命令,匹配,目標。

1、表

有四種 可用的表選項:filter、nat、mangle和raw。該選項不是必須的,如果 未指定,則filter用作默認表。

filter

filter表用來過濾數據包的,實現原理比較簡單,根據規則對數據包做DROP或者ACCEPT處理。下圖是信息包在filter表中的穿越過程。

iptables基礎概念

NAT

NAT,Network Address Translation的縮寫,NAT表的主要用處是網絡地址的轉換,采用網絡地址轉換技術可提高內網安全性。當IP地址不足時,很多用戶使用私有IP地址來組建網絡,而這些私有地址又不能直接訪問Internet上的資源,針對這種情況也可以采用地址轉換技術來解決。NAT可以實現一個IP地址轉換為另一個或一組IP地址。下圖是包在NAT表中的處理過程。

iptables基礎概念

PREROUTING鏈的作用是在包進防火墻時改變它的目的地址,OUTPUT鏈改變本地產生的包的目的地址。POSTROUTING鏈在包就要離開防火墻之前改變其源地址。

mangle

這個表的用途主要是用來Mangle數據包,可以改變不同的包及包頭的內容,比如TTL,TOS或MARK,這里要強調的是TOS并沒有真正的改變數據包內容,只是在內核空間為包做了一個標記,防火墻內其它程序可以用這種標記對包進行過濾或者高檔路由。這個表由五個內建的鏈組成:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

iptables基礎概念

raw

優先級最高,設置raw一般是為了不再讓iptables做數據包的鏈接跟蹤處理,提高性能。raw:PREROUTING, OUTPUT。

鏈的概念

鏈是數據包傳播的路徑,一條鏈就是規則的一個檢查清單,每條鏈可以有一條或者多條規則。如果包頭不符合鏈中的規則,iptables就會根據該鏈的默認策略來處理數據包。

INPUT鏈:過濾所有目標地址是本機的數據包(對進入本機數據包的過濾)

OUTPUT鏈:過濾所有本機產生的數據包(對源地址的數據包過濾)

FORWARD鏈:過濾所有經過本機的數據包(源地址和目標地址都不是本機的數據包)

POSTROUTING鏈:在數據包離開防火墻時改變數據包的源地址

PEROUTING鏈:數據包到達防火墻時改變數據包的目的地址

2、命令

-A 增加一個規則到鏈中;

-D 在鏈中的指定位置刪除一個規則;

-R 在鏈中的指定位置替換一個規則;

-I 在鏈中的指定位置插入一個新的規則;

-N 產生一個新的鏈;

-X 刪除一個空的鏈;

-P 設置一個鏈的默認策略;

-L 列出一個鏈的規則;

-F 清空一個鏈的所有規則;

-Z 清零一個鏈里所有規則的包和字節計數器;

3、匹配

根據規則匹配所應有的特征,如源地址、目的地址和協議,將匹配分為五類:

第一類是generic matches:通用匹配,適用于所有的規則

第二類是TCP matches,只能適用于TCP包的匹配

第三類是UDP matches,主要用于UDP包的匹配

第四類是ICMP matches,用于ICMP包的

第五類針對的是特殊狀態的,如訪問的頻率限制等。

匹配條件:

基本匹配條件:無需加載任何模塊,由 iptables/netfilter 自行提供;

    [!] -s, --source address[/mask][,...]:檢查報文中的源 IP 地址是否符合此處指定的地址或范圍;
    [!] -d, --destination address[/mask][,...]:檢查報文中的目標 IP 地址是否符合此處指定的地址或范圍;
    [!] -p, --protocol protocol
        protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mhor "all"

            {tcp|udp|icmp}
    [!] -i, --in-interface name:數據報文流入的接口;只能應用于數據報文流入的環節,只能應用于 PREROUTING,INPUT 和 FORWARD 鏈;
    [!] -o, --out-interface name:數據報文流出的接口;只能應用于數據報文流出的環節,只能應用于 FORWARD、OUTPUT 和 POSTROUTING 鏈;

擴展匹配條件: 需要加載擴展模塊,方可生效;

隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p 指明了協議,就表示已經指明了要擴展的模塊;
    tcp:

        [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
        [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
        [!] --tcp-flags mask comp
            mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST
                comp is a comma-separated list of flags whichmust be set,例如 SYN
                例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標志位為 SYN,ACK,FIN,RST 四個,其中 SYN 必須為 1,余下的必須為 0;
        [!] --syn:用于匹配第一次握手,相當于”--tcp-flags SYN,ACK,FIN,RST SYN“;

    udp
        [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
        [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;

    icmp
        [!] --icmp-type {type[/code]|typename}
            echo-request:8
            echo-reply:0

顯式擴展:必須要手動加載擴展模塊, [-m matchname [per-match-options]];

使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions

1、multiport 擴展
以離散方式定義多端口匹配;最多指定 15 個端口;
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
[!] --ports port[,port|,port:port]...:指明多個端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT

2、iprange 擴展
指明連續的(但一般不腦整個網絡)ip 地址范圍;
[!] --src-range from[-to]:源 IP 地址;
[!] --dst-range from[-to]:目標 IP 地址;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

3、string 擴展
對報文中的應用層數據做字符串模式匹配檢測;
--algo {bm|kmp}:字符串匹配檢測算法;
    bm:Boyer-Moore
    kmp:Knuth-Pratt-Morris
[!] --string pattern:要檢測的字符串模式;
[!] --hex-string pattern:要檢測的字符串模式,16 進制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT

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...]
--kerneltz:使用內核上的時區,而非默認的 UTC;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

5、connlimit 擴展
根據每客戶端 IP 做并發連接數數量匹配;
--connlimit-upto n:連接的數量小于等于 n 時匹配;
--connlimit-above n:連接的數量大于 n 時匹配;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

6、limit 擴展
基于收發報文的速率做匹配;
令牌桶過濾器;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT

7、state 擴展
    根據”連接追蹤機制“去檢查連接的狀態;
    conntrack 機制:追蹤本機上的請求和響應之間的關系;狀態有如下幾種:
    NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別為第
    一次發出的請求;
    ESTABLISHED:NEW 狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的
    通信狀態;
    RELATED:相關聯的連接;如 ftp 協議中的數據連接與命令連接之間的關系;
    INVALID:無效的連接;
    UNTRACKED:未進行追蹤的連接;
[!] --state state
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

調整連接追蹤功能所能夠容納的最大連接數量:
    /proc/sys/net/nf_contrack_max
已經追蹤到到的并記錄下來的連接:
    /proc/net/nf_conntrack
不同的協議的連接追蹤時長:
    /proc/sys/net/netfilter/

iptables 的鏈接跟蹤表最大容量為/proc/sys/net/ipv4/ip_conntrack_max,鏈接碰到各種狀態的超時后就會從表中刪除;當模板滿載時,后續的連接可能會超時解決方法一般有兩個:

(1) 加大 nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216

(2) 降低 nf_conntrack timeout 時間
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

iptables -t nat -L -n

4、目標

目標是由規則指定的操作,對與那些規則匹配的信息包執 行這些操作:

ACCEPT:當信息包與具有ACCPET目標的規則完全匹配 時,會被接受(允許它前往目的地)。

DROP:當信息包與具有DROP目標的規則完全匹配時,會 阻塞該信息包,并且不對它作進一步處理。

REJECT:該目標的工作方式與 DROP目標相同,但它比 DROP好。REJECT不會在服務器和客戶機上留下死套接字。 另外,REJECT會將錯誤信息發回給信息包的發送方。

處理動作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回調用鏈;
REDIRECT:端口重定向;
LOG:記錄日志;
MARK:做防火墻標記;
DNAT:目標地址轉換;
SNAT:源地址轉換;
MASQUERADE:地址偽裝;
...
自定義鏈:

三、iptables狀態機制

狀態機制是一種連接跟蹤機制,連接跟蹤可以讓Netfilter知道某個特定連接的狀態,通常運行連接跟蹤機制的防火墻稱作帶有狀態機制的防火墻,這種防火墻要比非狀態防火墻跟安全,因為它允許編寫更嚴密的規則。幾種狀態機制組合使用,用來匹配數據包,可以使防火墻效果更加顯著。

(1)NEW

表明這個包是第一個遇到的包,即某個連接第一個包,它即將被匹配了,NEW狀態。

(2)ESTABLISHED

ESTABLISHED其關注兩個方向上的數據傳輸,而且會繼續匹配這個連接報,處于ESTABLISHED狀態是比較容易理解的,只要發送并接到應答即為ESTABLISHED的了;一個連接要從NEW變為ESTABLISHED,只要接到響應即可。

(3)RELATED

RELATED是一個繁瑣的狀態,如果一個連接和某個已知處于ESTABLISHED狀態的連接有關系時,就認為是RELATED的了。首先要有一個ESTABLISHED的連接,這個連接再產生一個主連接之外的連接,這個連接就是RELATED的了。

(4)INVALID

INVALID說明數據包是無效的,即不能被識別,導致出現這種情況的因素有幾個,比如內存溢出等,收到不知屬于哪個連接的錯誤信息。一般情況下,會采用DROP來處理這個狀態的任何東西。

四、規則的檢查次序

(1)同類規則(訪問同一應用),匹配范圍小的放前面;用于特殊處理;

(2)不同類的規則(訪問不同應用),匹配范圍大的放前面;

(3)應該將那些可由一條規則描述的多個規則合并為一;

(4)設置默認策略;

五、規則優化:

服務器端規則設定:任何不允許的訪問,應該在請求到達時給予拒絕;

(1) 可安全放行所有入站的狀態為 ESTABLISHED 狀態的連接;

(2) 可安全放行所有出站的狀態為 ESTABLISHED 狀態的連接;

(3) 謹慎放行入站的新請求

(4) 有特殊目的限制訪問功能,要于放行規則之前加以拒絕;

六、如何開放被動模式的 ftp 服務?

(1) 裝載 ftp 連接追蹤的專用模塊:
    ~]# modproble nf_conntrack_ftp
(2) 放行命令連接(假設 Server 地址為 172.16.100.67):
    ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3) 放行數據連接(假設 Server 地址為 172.16.100.67):
    ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ~]# iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT

七、規則的用效期限:

使用 iptables 命令定義的規則,手動刪除之前,其生效期限為 kernel 存活期限;

保存規則:

CentOS 6:

~]# service iptables save

將規則保存至/etc/sysconfig/iptables 文件中;

~]# iptables-save /PATH/TO/SOMERULESFILE

CentOS 7:

~]# iptables-save /PATH/TO/SOMERULESFILE

重新載入預存規則文件中規則:

~]# iptables-restore < /PATH/FROM/SOMERULESFILE

CentOS 6:

~]# service iptables restart (重載)


自動生效規則文件中的規則:

(1) 用腳本保存各 iptables 命令;讓此腳本開機后自動運行;

/etc/rc.d/rc.local 文件中添加腳本路徑:/PATH/TO/SOMESCRIPTFILE

(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則;

/etc/rc.d/rc.local 文件添加:iptables-restore < /PATH/FROM/IPTABLESRULESFILE

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

(0)
N24_yeziN24_yezi
上一篇 2016-12-19
下一篇 2016-12-19

相關推薦

  • Linux Sysadmin–part2

    1、寫一個腳本,使用ping命令探測192.168.4.1-192.168.4.254之間的所有主機的在線狀態; 在線的主機使用綠色顯示; 不在線的主使用紅色顯示; #!/bin/bash #description: #date: #Author: for i in {1..254}; do if ping -c 3 192.168.4.$i &&g…

    2017-09-19
  • Python基礎篇之過程型程序設計

    一、Python過程型程序設計 面向過程 以指令為中心,由指令處理數據 如何組織代碼解碼問題 面向對象 以數據為中心,所有的處理代碼都圍繞數據展開 如何設計數據結構組織數據,并提供對此類數據所允許處理操作 簡單方法: 1)、編譯安裝新版本至某特定路徑 # yum install readline-devel # tar xf Python-2.7.6.tar…

    2018-01-11
  • CentOS 6.5下OpenVPN的搭建

    一、openvpn原理 二、安裝openvpn 三、制作相關證書     3.1 制作CA證書     3.2 制作Server端證書     3.3 制作Client端證書 四、配置Server端 五、配置Client端 一、openvp…

    Linux干貨 2016-04-21
  • 第二周-作業

    第二周作業: 題1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 Linux上常見的文件管理類命令有mkdir、touch、cp、mv、rm、stat。     mkdir:創建新目錄         用法:mk…

    Linux干貨 2016-12-08
  • 進程管理,計劃任務(2)

    二、作業管理     Linux的作業控制         前臺作業:通過終端啟動,且啟動后一直占據終端;         后臺作業:可通過終端啟動,但啟動后即…

    Linux干貨 2016-09-18
  • 幾個正則表達式和find查找語句事例

    顯示當前系統上root、fedora、或user1用戶的默認shell; ~]# grep -E "^(root|bin|hadop)" /etc/passwd | cut -d: -f7 找出/etc/rc.d/init.d/functions文件中某單詞后面跟一組小括號的行,形如: hello(); ~]#grep -E -o &qu…

    Linux干貨 2016-10-30
欧美性久久久久