iptables最常用的規則示例


iptables v1.4.21

iptables基礎

規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作就是添加、修改和刪除這些規則。

iptables和netfilter的關系:

Iptables和netfilter的關系是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道netfilter。其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是netfilter,它是Linux內核中實現包過濾的內部結構。

iptables傳輸數據包的過程:    

可以簡單理解為:

1.若數據包是發送到本機,則經過PREROUTING-->INPUT;

2.若數據包是需要本機轉發,則經過PREROUTING-->FORWORD-->POSTROUTING;

3.若數據包是本機發出的,則要經過OUTPUT-->POSTROUTING.

iptables的規則表和鏈:

表(tables)提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網絡地址轉換、包重構(修改)和數據跟蹤處理。

鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。

規則表與鏈的關系

1.filter表——三個鏈:INPUT、FORWARD、OUTPUT

作用:過濾數據包  內核模塊:iptables_filter.

2.Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT

作用:用於網絡地址轉換(IP、端口) 內核模塊:iptable_nat

3.Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這么麻煩,咱們設置策略時幾乎都不會用到它)

4.Raw表——兩個鏈:OUTPUT、PREROUTING

作用:決定數據包是否被狀態跟蹤機制處理  內核模塊:iptable_raw

表的一般順序:Raw——mangle——nat——filter。

Commands:
  --append          -A chain                    Append to chain
  --check            -C chain                    Check for the existence of a rule
  --delete            -D chain                    Delete matching rule from chain
  --delete            -D chain rulenum           Delete rule rulenum (1 = first) from chain
  --insert             -I chain [rulenum]         Insert in chain as rulenum (default 1=first)
  --replace           -R chain rulenum          Replace rule rulenum (1 = first) in chain
  --list                 -L [chain [rulenum]]         List the rules in a chain or all chains
  --list-rules        -S [chain [rulenum]]      Print the rules in a chain or all chains
  --flush              -F [chain]                      Delete all rules in  chain or all chains
  --zero                -Z [chain [rulenum]]     Zero counters in chain or all chains
  --new                -N chain                       Create a new user-defined chain
  --delete-chain    -X [chain]                     Delete a user-defined chain
  --policy              -P chain target                 Change policy on chain to target
  --rename-chain  -E old-chain new-chain      Change chain name, (moving any references)

  Options:
    --ipv4                  -4                           Nothing (line is ignored by ip6tables-restore)
    --ipv6                  -6                           Error (line is ignored by iptables-restore)
[!] --protocol           -p proto                   protocol: by number or name, eg. `tcp',‘udp’
[!] --source             -s address[/mask][...]    source specification
[!] --destination      -d address[/mask][...]    destination specification
[!] --in-interface      -i input name[+]           network interface name ([+] for wildcard)
    --jump                -j target                    target for rule (may load target extension:ACCEPT, DROP, QUEUE, RETURN,MASQUERADE)
    --goto                -g chain                      jump to chain with no return
    --match             -m match                   extended match (may load extension)
    --numeric          -n                            numeric output of addresses and ports
[!] --out-interface   -o output name[+]         network interface name ([+] for wildcard)
    --table               -t table                    table to manipulate (default: `filter')
    --verbose           -v                            verbose mode
    --wait                -w [seconds]               wait for the xtables lock
    --line-numbers                                print line numbers when listing
    --exact               -x                           expand numbers (display exact values)
[!] --fragment        -f                            match second or further fragments only
    --modprobe=<command>                      try to insert modules using this command
    --set-counters PKTS BYTES                   set the counter during insert/append
[!] --version           -V                            print package version.

語法:

iptables [-t 表名] 選項 [鏈名] [條件] [-j 控制類型] 參數
-P 設置默認策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空規則鏈
-L 查看規則鏈
-A 在規則鏈的末尾加入新規則
-I num 在規則鏈的頭部加入新規則
-D num 刪除某一條規則
-s 匹配來源地址IP/MASK,加嘆號"!"表示除這個IP外。
-d 匹配目標地址
-i 網卡名稱 匹配從這塊網卡流入的數據
-o 網卡名稱 匹配從這塊網卡流出的數據
-p 匹配協議,如tcp,udp,icmp
--dport num 匹配目標端口號
--sport num 匹配來源端口號

示例:

1、刪除現有規則

在開始建立新的規則之前,您可能需要清理所有默認規則和現有規則。使用iptables如下所示的命令來做這個。

iptables -F       #警告:當前命令后將切斷linux對外的一切端口請求,請確保你還能連接到vnc或主機上
(or)
iptables --flush

2、設置默認鏈策略

默認的iptables策略是ACCEPT。將此更改為如下所示。

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

當將INPUT和OUTPUT默認策略作為DROP時,對於每一個防火牆規則要求都應該定義兩條規則。即一個INPUT和一個OUTPUT。
如果信任內部用戶,則可以忽略上面OUTPUT的設置。默認情況下,不要丟棄所有OUTPUT的數據包。在這種情況下,對於每一個防火牆規則的要求,你只需要定義一個規則。即定義規則傳入,因為傳出是接受所有數據包。

3、阻止一個特定的IP地址

在我們做其他規則前,如果你想阻止一個特定的IP地址,你應該先做如下所示。當您在日志文件中找到特定的IP地址時發現一些奇怪的活動,並希望在進一步研究時暫時阻止該IP地址,這將很有幫助。

BLOCK_THIS_IP="192.168.1.108"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP

你也可以使用下面的一種規則。

iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP           //規則禁止這個IP地址對我們服務器eth0網卡的所有連接
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP   //規則只禁止這個IP地址對我們服務器eth0網卡的tcp協議的連接

4.允許所有傳入SSH

以下規則允許eth0接口上的所有傳入的SSH連接。

iptables -A INPUT  -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

5.只能從一個特定的網絡允許傳入的SSH

下面的規則只允許從網絡192.168.100.X傳入SSH連接。

iptables -A INPUT  -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

6.允許傳入的HTTP和HTTPS

以下規則允許所有傳入的網絡流量。即HTTP流量的端口80。

iptables -A INPUT  -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

下面的規則允許所有傳入安全的網絡流量。即HTTPS流量的端口443。

iptables -A INPUT  -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

7.相結合多個規則使用多端口

當你不是寫為每個端口單獨的規則,而是從外面的世界多個端口傳入的連接,可以在一起使用多端口擴展。

下面的示例允許所有傳入SSH,HTTP和HTTPS流量。

iptables -A INPUT  -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

8.允許OUTPUT SSH

以下規則允許傳出ssh連接。也就是說當你從內ssh到外部服務器。

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT  //允許雙方新建立的OUTPUT鏈通信
iptables -A INPUT  -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT      //只允許雙方已經建立的INPUT鏈通信 

9.允許撥出SSH到特定網絡

下面的規則只允許特定的網絡傳出的ssh連接。即你的SSH只有從內部網絡192.168.100.0/24。

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT  -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

10.允許撥出HTTPS

以下規則允許傳出安全的Web流量。當你想允許互聯網流量的用戶,這是很有幫助。在服務器上,當你想使用wget從外部下載一些文件,這些規則也有幫助。

iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT  -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

注:對於傳出HTTP Web流量,增加兩個額外的規則就像上面,並改變443 80。

11.負載均衡傳入的Web流量

您也可以加載使用iptables防火牆規則平衡傳入的網絡流量。

This uses the iptables nth extension. The following example load balances the HTTPS traffic to three different ip-address. 
For every 3th packet, it is load balanced to the appropriate server (using the counter 0). iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

12.允許從外部到內部Ping

以下規則允許外部用戶能夠ping您的服務器。

iptables -A INPUT  -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

13.允許從內部到外部ping

以下規則允許您從內部ping到任何外部服務器。

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT  -p icmp --icmp-type echo-reply -j ACCEPT

14.允許環回訪問

您應該允許在服務器上進行完全環回訪問。即使用127.0.0.1訪問

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

15.允許內部網絡到外部網絡

在防火牆服務器上,一個以太網卡連接到外部網絡,另一個以太網卡連接到內部服務器,請使用以下規則允許內部網絡與外部網絡通信。

//在此示例中,eth1連接到外部網絡(互聯網),eth0連接到內部網絡(例如:192.168.1.x)。
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

16.允許出站DNS

以下規則允許傳出DNS連接。

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT  -p udp -i eth0 --sport 53 -j ACCEPT

17.允許NIS連接

如果您正在運行NIS(網絡信息服務)來管理您的用戶帳戶,您應該允許NIS連接。即使允許SSH連接,如果您不允許NIS相關的ypbind連接,用戶將無法登錄。

NIS端口是動態的。即當ypbind啟動時,它分配端口。(ypbind是定義NIS服務器的客戶端進程。)

//首先做一個rpcinfo -p如下所示並獲取端口號。在此示例中,它使用端口853和850。
rpcinfo -p | grep ypbind

//現在允許到端口111的入站連接,以及ypbind使用的端口。
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT

以上不會工作,當你重新啟動ypbind,因為它在不同的時間會有不同的端口號。

有兩個解決方案:1)使用靜態ip地址為您的NIS,或2)使用一些聰明的shell腳本技術來自動抓取動態端口號從“rpcinfo -p”命令輸出,並使用上述iptables規則。

18.允許Rsync來自特定網絡

以下規則僅允許來自特定網絡的rsync。

iptables -A INPUT  -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

19.僅允許來自特定網絡的MySQL連接

如果你正在運行MySQL,通常你不想允許從外部直接連接。在大多數情況下,您可能在運行MySQL數據庫的同一服務器上運行Web服務器。

但是DBA和開發人員可能需要使用MySQL客戶端從他們的筆記本電腦和桌面直接登錄到MySQL。在這種情況下,您可能希望允許內部網絡直接與MySQL通信,如下所示。

iptables -A INPUT  -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

20.允許Sendmail或Postfix流量

以下規則允許郵件通信。它可以是sendmail或postfix。

iptables -A INPUT  -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

21.允許IMAP和IMAPS

以下規則允許IMAP / IMAP2流量。

iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

以下規則允許IMAPS流量。

iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

22.允許POP3和POP3S

以下規則允許POP3訪問。

iptables -A INPUT  -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

以下規則允許POP3S訪問。

iptables -A INPUT  -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT 

23.防止DoS攻擊

以下iptables規則將幫助您防止對您的Web服務器的拒絕服務(DoS)攻擊。

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

在上面的例子中:
  -m limit:這使用限制iptables擴展
  -limit 25 /分鍾:每分鍾最多只能連接25個請求包。根據您的具體要求更改此值
  -limit-burst 100:此值指示僅在連接的總數達到limit之后才實施限制/分鍾

注意“-m limit”只匹配數據包而不是連接,所以上方例子中你將匹配25包每分鍾。

如果是想限制每分鍾下connect次數呢。限制連接數的解決方案是使用connlimit匹配。

iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 15 –connlimit-mask 32 -j REJECT –reject-with tcp-reset

它將拒絕來自一個源IP的15以上的連接 - 一個很好的規則來保護Web服務器。

此外,當與“hashlimit” 結合后在保護免受DDoS攻擊時效果更好。

使用“limit”匹配,您可以限制每個時間間隔的數據包的全局速率,但是使用“hashlimit”,您可以限制每個IP,每個組合IP +端口等。

所以一個Web服務器的例子將是這樣:

iptables -A INPUT -p tcp –dport 80 -m hashlimit –hashlimit 45/sec –hashlimit-burst 60 
–hashlimit-mode srcip–hashlimit-name DDOS
–hashlimit-htable-size 32768
–hashlimit-htable-max 32768
–hashlimit-htable-gcinterval 1000
–hashlimit-htable-expire 100000
-j ACCEPT

24. 端口轉發

例:將來自422端口的流量全部轉到22端口。

這意味着我們既能通過422端口又能通過22端口進行ssh連接。啟用DNAT轉發。

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

除此之外,還需要允許連接到422端口的請求

iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT 
-o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

25. 記錄丟棄的數據表

iptables -N LOGGING   //1.新建名為LOGGING的鏈
iptables -A INPUT -j LOGGING  //2.將所有來自INPUT鏈中的數據包跳轉到LOGGING鏈中
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7  
//3.為這些包自定義個前綴,命名為”IPTables Packet Dropped” iptables -A LOGGING -j DROP //4.丟棄這些數據包 

 

參考:

http://www.linuxidc.com/Linux/2014-03/99159p2.htm

http://blog.csdn.net/yeqihong/article/details/1489407

https://www.cnblogs.com/bill1015/p/6847841.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM