1. 程式人生 > >Iptables 規則基礎筆記

Iptables 規則基礎筆記

iptables 規則基礎筆記

Iptables規則:

Firewall:工作在主機或網絡邊緣,對進出的保溫按事先定義的規則進行檢查,並有匹配到的規則進行處理的一組硬件或者軟件.

用戶請求進來,先到本地的route路由判斷是否訪問的為本地ip,如果不是則查看是否開啟了ip-forward功能,如果開起來,則繼續向後轉發.


iptables/netfilter:

netfilter:工作內核中,讓規則能夠生效的網絡框架.

iptables:工作於用戶空間,防火墻規則編寫工具,編寫規則並發送到netfilter

PREROUTING:主要做目標地址轉換

INPUT :從本機進來的

OUTPUT:從本機出去的

FORWARD:從本機轉發的

POSTROUTING:路由之後轉發,主要做源地址轉換


過濾:做報文篩選

NAT:Network Adress Translation 網絡地址轉換.

Dnat:目標地址轉換 公網響應,將公網地址自動Dnat到內網.

Snat:源地址轉換 內網地址訪問公網資源,出去時將源地址轉換為公網地址.


表和鏈的對應關系:

filter:

INPUT FORWARD OUTPUT

nat:

PREROUTING OUTPUT POSTROUTING

mangle:

PREROUTING INPUT FORWARD OUTPUT POSTROUTING

檢查條件,處理機制:

通:默認為堵,只對能識別的進行放行

堵:默認為通,只對能識別的進行阻截


檢查條件:

IP:SIP DIP

TCP,UDP,ICMP協議首部


處理機制:

DROP:悄悄丟棄,不返回任何結果

REJECT:拒絕,返回拒絕信息


ACCEPT:允許通過

SNAT:源地址轉換

DNAT:目標地址轉換

RETURN:未匹配到重新返回

REDIRECT:映射

LOG:日誌


Iptables規則參數:

  # iptables -nL   查看規則
 iptables [-t table] -N chain   #新增一條自定義的規則鏈(自定義的鏈只能在被調用或轉發時生效)

-I 插入,默認為第1條

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

iptables [-t table] -X [chain] #刪除一條自定義的空鏈

實例:

 # iptables -X Mew


iptables [-t table] -E old-chain-name new-chain-name #修改自定義鏈名


實例:

    [[email protected] ~]# iptables -E Mew Redhat
        [[email protected] ~]# iptables -nL
        Chain INPUT (policy ACCEPT)
        target     prot opt source               destination         
        Chain FORWARD (policy ACCEPT)
        target     prot opt source               destination         
        Chain OUTPUT (policy ACCEPT)
        target     prot opt source               destination         
        Chain Redhat (0 references)
        target     prot opt source               destination

iptables [-t table] -P chain target #修改鏈的默認策略,無法修改自定義鏈的默認規則.

實例:

# iptables -t filter -P FORWARD DROP
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

-F :清空鏈中的規則

規則有編號,在鏈中自上而下,從1開始;

-L: list,列出表中的所有規則

-n:數字格式顯示IP和Port

-v:以詳細格式顯示


實例:

  [[email protected] ~]# iptables -nL -v
   Chain INPUT (policy ACCEPT 10936 packets, 1068K bytes)
   pkts bytes target     prot opt in     out     source               destination         
    Chain FORWARD (policy DROP 0 packets, 0 bytes)
    pkts bytes target     prot opt in     out     source               destination         
   Chain OUTPUT (policy ACCEPT 8217 packets, 698K bytes)
    pkts bytes target     prot opt in     out     source               destination         
   Chain Redhat (0 references)
   pkts bytes target     prot opt in     out     source               destination

pkts:packets,被本規則所匹配到的報文個數

bytes:被本規則所匹配到的所有報文的大小之和,會執行單位換算.

target:目標,即處理機制

prot:協議,一般為{tcp|udp|ICMP}

opt:可選項

in:數據包流入接口.

out:數據包的流出接口

source:源地址

destination:目標地址:


-v

-vv

-x:exactly,精確值,不執行單位換算

--line-number:顯示各規則的行號

實例: --line-number 看到每條規則都有編號

 [[email protected] ~]# iptables -nL --line-numbers
            Chain INPUT (policy ACCEPT)
            num  target     prot opt source               destination         
            1    ACCEPT     all  --  172.16.0.0/16        172.16.0.192       
            2    ACCEPT     tcp  --  172.16.0.0/16        172.16.0.192       
            Chain FORWARD (policy DROP)
            num  target     prot opt source               destination         
            Chain OUTPUT (policy ACCEPT)
            num  target     prot opt source               destination         
            1    ACCEPT     tcp  --  172.16.0.192         172.16.0.24         
            Chain Redhat (0 references)
            num  target     prot opt source               destination


-Z:zero,規則計數器清零


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

-A append,附加一條規則;rule-specification 條件匹配 -j 處理機制,默認在指定鏈的最後一行添加

匹配條件(通用匹配)

-s:源ip,可以時ip,也可以是網絡地址,可以取反:!172.10.10.0/24,"!"取反

-s 相當於--src或者--source


-d:匹配目標地址

-p:匹配協議,通常只使用{TCP|UDP|ICMP}三者之一

-i:數據報文流入的接口:通常只用於INPUT/FORWARD/PREROUTING

-o:流出的接口:通常只用於OUTPUT/FORWARD/POSTROUTING



實例:

# iptables -A INPUT -p tcp -s 172.16.0.0/16 -d 172.16.0.192 -j ACCEPT

所有來自172.16.0.0這個網段的tcp協議訪問本地172.16.0.192資源的都允許進來

   # iptables -A OUTPUT -p tcp -s 172.16.0.192 -d 172.16.0.24 -j ACCEPT


所有從本機 172.16.0.192出去的協議為tcp的目標為172.16.0.24的店鋪允許出去.


-s:源地址不寫,默認為4個零

實例:

 [[email protected] ~]# iptables -A INPUT -d 172.16.0.192 -j ACCEPT
 [[email protected] ~]# iptables -nL -v
 Chain INPUT (policy ACCEPT 163 packets, 15385 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 23  1752 ACCEPT     all  --  *      *       0.0.0.0/0            172.16.0.192

-i :指定流入網卡,不能在output上使用,否則會報錯.

 # iptables -A INPUT -i eth0 -d 172.16.0.192 -j ACCEPT

只要從eth0進來訪問本機的就允許


從本機eth0出去訪問公網的就允許.

 # iptables -A OUTPUT -o eth0 -s  172.16.0.192 -j ACCEPT
Chain OUTPUT (policy ACCEPT 66 packets, 5489 bytes)
pkts bytes target     prot opt in     out     source               destination         
 4   592 ACCEPT     all  --  *      eth0    172.16.0.192         0.0.0.0/0



保存恢復規則:

service iptables save

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



將火墻規則保存到其他文件中:iptables-save

# iptables-save > iptables.20170707



從某個文件中恢復規則,iptables-restore

# iptables-restore < iptables.20170707



隱含擴展:使用-p{TCP|UDP|ICMP}指定某特定協議後,協議自身所能夠進行的自動擴展

-p:tcp

--dport :可以指定單個端口,可以使連續的多個端口.

--sport: 可以指定源端口---

--tcp-flags:標誌位

RST,SYN,ACK,FIN

實例:

#允許172.16.0.0/16通過tcp協議的22端口訪問本地資源

 [[email protected] ~]# iptables -A INPUT -i eth0 -s 172.16.0.0/16 -d 172.16.0.192 -p tcp --dport 22 -j ACCEPT


#允許本地通過tcp協議的22端口與172.16.0.0/16通訊.

[[email protected] ~]# iptables -A OUTPUT -s 172.16.0.192 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT

#允許本地lo端口進出.

# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT


-p: udp

--sport:

--dport:

udp協議沒有標誌位。


-p:icmp

--icmp-type 8是ping請求 0是ping響應


例子:放行ping其他主機:

     # iptables -A OUTPUT -s 172.16.0.177 -p icmp --icmp-type 8 -j ACCEPT
     # iptables -A INPUT -d 172.16.0.177 -p icmp --icmp-type 0 -j ACCEPT


規則命令:

iptables -D chain rulenum [options] 刪除規則


實例:刪除OUTPUT鏈上的第1條規則

  # iptables -D OUTPUT 1


iptables [-t table] -I chain [rulenum] rule-specification 在指定的地方插入規則

如果不指定默認為第一行.

實例:在第三行

# iptables -I INPUT 3 -i lo -j ACCEPT
 # iptables -I INPUT 3 -i eth0 -d 172.16.0.192  -j ACCEPT


iptables [-t table] -R chain rulenum rule-specification 替換指定規則


明確指定將第幾行替換為.

實例:

     # iptables -R INPUT 4 -i lo -p tcp -j ACCEPT


顯示指定鏈的規則:-S 後面未指定具體的鏈,則顯示所有鏈的規則.

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

實例:

 # iptables -S INPUT
 -P INPUT ACCEPT
 -A INPUT -s 172.16.0.0/16 -d 172.16.0.192/32 -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -d 172.16.0.192/32 -i eth0 -j ACCEPT
 -A INPUT -i lo -p tcp -j ACCEPT



顯示擴展:必須明確指定擴展模塊


-m 擴展模塊名稱 --專用選項


multiport:多端口匹配,一次指定多個(15個以內)零散端口

[!] --source-port,--sport port[:port]


[!] --destination-port,--dport port[:port]

--ports:


實例:


iptables -A INPUT -d 172.16.0.192 -p tcp -m multiport --dport 22,80 -j ACCEPT

# iptables -A OUTPUT -s 172.16.0.192 -p tcp -m multiport --sport 22,80 -j ACCEPT


iprange:ip地址範圍


time:指定時間範圍


--datestart:

--datestop:

--timestart:

--timestop:



實例:

# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT



string:字符串

--algo {bm|kmp} :字符匹配時使用到的算法

--string "string":要查找的字符串

--from offset


從本地80端口出去包含字符串"hello"的全丟掉.

# iptables -A OUTPUT -s 172.16.0.7 -p tcp --sport 80 -m string --algo kmp --string "hello" -j DROP
# iptables -A INPUT -d 192.168.149.128  -p tcp -m multiport --dports 22,80 -j ACCEPT	

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

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

ip-range:指定ip段訪問:

只允許這個網段訪問本地的23端口telnet服務.

 # iptables -A INPUT -d 192.168.149.128 -p tcp --dport 23 -m iprange --src-range 172.16.0.9-172.16.0.110 -j ACCEPT
# iptables -A OUTPUT -s 192.168.149.128  -p tcp --sport 23  -m iprange --dst-range 172.16.0.9-172.16.0.110 -j ACCEPT

time:指定時間daunt

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

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

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

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

# iptables -A OUTPUT -s 192.168.149.128 -p tcp --sport 91 -m time --weekdays 1,7 --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
# iptables -A INPUT -d 192.168.149.128 -p tcp --dport 91 -m time --weekdays 1,7 --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT


string:字符串訪問控制

--algo {bm|kmp}:字符匹配查找時使用的算法

--string:查找的字符串

[!] --hex-string pattern:要查找的字符串,字符編碼轉換

--from :

--to

# iptables -I OUTPUT -s 192.168.149.128 -p tcp --sport 80 -m string --algo kmp --string "hello" -j DROP

connlimit :每個ip對指定服務的最大連接數

[!] --connlimit-above n

請求本地80端口,並發大於5的請求全部丟掉.

# iptables -I INPUT -d 192.168.149.128 -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP


limit:報文的速率控制

--limit-burst number :峰值

--limit rate[/second|/minute|/hour|/day]每秒的速率

# iptables -A INPUT -d 192.168.149.128 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPT

hping3 命令

ab -c 20 -n 2000 http://www.baidu.com/index.html 並發測試命令

網絡工具排名:

sectools.org

state:狀態匹配

ip_conntrack,nf_conntrack Iptables根據這2個模塊完成連接追蹤


--state:


NEW 狀態;第一次連接狀態叫NEW


ESTABLISHED 連接狀態,後續的狀態都是ESTABLISHED


RELATED 相關聯的,命令請求和數據傳輸之間就是RELATED


INVALID 無效連接或者無法識別的連接


法則:

1、對於進入的狀態為ESTABLISHED的都應該放行

2、對於出去的狀態為ESTABLISHED的都應該放行

3、嚴格檢查進入的狀態為NEW的連接

4、所有狀態為INVIALIED的都應該拒絕



實例:

匹配state 狀態為NEW,ESTABLISHED的放行.


調整連接追蹤功能所能容納的最大追蹤連接數:


/proc/sys/net/nf_conntrack_max 定義了onntrack 連接追蹤的最大值


/proc/net/nf_conntrack 定義了當前追蹤的所有連接


/proc/sys/net/netfilter/ 目錄定義個了超時時間

        # iptables -A INPUT -d 172.16.0.177 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
        # iptables -A OUTPUT -s 172.16.0.177 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
        # iptables -A INPUT -d 172.16.0.177 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -m state --state NEW,ESTABLISHED -j ACCEPT
        # iptables -A OUTPUT -s 172.16.0.177 -p icmp -m state --state NEW,ESTABLISHED -j ACCEPT


放行本地80端口,進來時state為NEW,ESTABLISHED,出去時狀態為 ESTABLISHED

  # iptables -A INPUT -d 172.16.0.177 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
        # iptables -A OUTPUT -s 172.16.0.177 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT


-j target

        RETURN:返回調用連
        # iptables -N clean_in
        # iptables -t filter -I clean_in -d 172.16.0.255 -p tcp --tcp-flags ALL ALL -jDROP
        # iptables -t filter -I clean_in -d 172.16.0.255 -p tcp --tcp-flags ALL NONE -jDROP
        # iptables -A clean_in -d 172.16.255.255 -p ucmp -j DROP
        # iptables -A clean_in -d 255.255.255.255 -p ucmp -j DROP
        # iptables -A clean_in -d 172.16.0.177 -j RETURN
        # iptables -I INPUT -d 172.16.0.177 -j RETURN
        # iptables -I clean_in 4 -d 172.16.0.177 -m state --state INVALID -j DROP  無法識別的都應該要刪除.


被動服務器放行例如ftp,服務器被動模式下相應端口隨機相應.

1、確保iptables加載ftp協議支持的模塊:ip_nat_ftp,ip_conntrack_ftp

編輯/rtc/sysconfig/iptables-config文件,定義如下參數:

IPTABLES_MODULES="ip_nat_ftp,ip_conntrack_ftp"


手動安裝使用:modprobe ip_nat_ftp


2、方形請求報文的RELATED和ESTABLISHED

        # iptables -A INPUT -d 172.16.0.177 -p tcp --dport 22 -j ACCEPT
        # iptables -A INPUT -d 172.16.0.177 -p tcp --dport 21 -j ACCEPT
        # iptables -A OUTPUT -s 172.16.0.177 -p tcp --sport 22 -j ACCEPT
        # iptables -A OUTPUT -s 172.16.0.177 -p tcp --sport 21 -j ACCEPT
        # iptables -P INPUT DROP
        # iptables -P OUTPUT DROP
        # iptables -A INPUT -d 172.16.0.177 -m state --state RELATED,ESTABLISHED -j ACCEPT
        # iptables -A INPUT -s 172.16.0.177 -m state --state ESTABLISHED -j ACCEPT
        # iptables -I INPUT 2 -d 172.16.0.177 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
        # iptables -I OUTPUT 1 -s 172.16.0.177 -p tcp -m state --state ESTABLISHED -j ACCEPT



本文出自 “螞蟻” 博客,請務必保留此出處http://215687833.blog.51cto.com/6724358/1946477

Iptables 規則基礎筆記