歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux問題解決 >> linux防火牆iptables常用規則(屏蔽IP地址、禁用ping、協議設置、NAT與轉發、負載平衡、自定義鏈)

linux防火牆iptables常用規則(屏蔽IP地址、禁用ping、協議設置、NAT與轉發、負載平衡、自定義鏈)

日期:2017/3/6 10:16:41   编辑:Linux問題解決

一、iptables:從這裡開始

刪除現有規則

iptables -F
(OR)
iptables --flush

設置默認鏈策略

iptables的filter表中有三種鏈:INPUT, FORWARD和OUTPUT。默認的鏈策略是ACCEPT,你可以將它們設置成DROP。

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

你需要明白,這樣做會屏蔽所有輸入、輸出網卡的數據包,除非你明確指定哪些數據包可以通過網卡。

屏蔽指定的IP地址

以下規則將屏蔽BLOCK_THIS_IP所指定的IP地址訪問本地主機:

BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
(或者僅屏蔽來自該IP的TCP數據包)
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

允許來自外部的ping測試

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

允許從本機ping外部主機

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

允許環回(loopback)訪問

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

二、iptables:協議與端口設定

允許所有SSH連接請求

本規則允許所有來自外部的SSH連接請求,也就是說,只允許進入eth0接口,並且目的端口為22的數據包

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

允許從本地發起的SSH連接

本規則和上述規則有所不同,本規則意在允許本機發起SSH連接,上面的規則與此正好相反。

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

僅允許來自指定網絡的SSH連接請求

以下規則僅允許來自192.168.100.0/24的網絡:

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

上例中,你也可以使用-s 192.168.100.0/255.255.255.0作為網絡地址。當然使用上面的CIDR地址更容易讓人明白。

僅允許從本地發起到指定網絡的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

允許HTTP/HTTPS連接請求

# 1.允許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

# 2.允許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

允許從本地發起HTTPS連接

本規則可以允許用戶從本地主機發起HTTPS連接,從而訪問Internet。

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協議(80端口)。

-m multiport:指定多個端口

通過指定-m multiport選項,可以在一條規則中同時允許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

允許出站DNS連接

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

允許NIS連接

如果你在使用NIS管理你的用戶賬戶,你需要允許NIS連接。即使你已允許SSH連接,你仍需允許NIS相關的ypbind連接,否則用戶將無法登陸。NIS端口是動態的,當ypbind啟動的時候,它會自動分配端口。因此,首先我們需要獲取端口號,本例中使用的端口是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.為NIS使用靜態IP地址
2.每次系統啟動時調用腳本獲得NIS相關端口,並根據上述iptables規則添加到filter表中去。

允許來自指定網絡的rsync連接請求

你可能啟用了rsync服務,但是又不想讓rsync暴露在外,只希望能夠從內部網絡(192.168.101.0/24)訪問即可:

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

允許來自指定網絡的MySQL連接請求

你可能啟用了MySQL服務,但只希望DBA與相關開發人員能夠從內部網絡(192.168.100.0/24)直接登錄數據庫:

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

允許Sendmail, Postfix郵件服務

郵件服務都使用了25端口,我們只需要允許來自25端口的連接請求即可。

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

允許IMAP與IMAPS

# IMAP:143
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:993
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

允許POP3與POP3S

# POP3:110
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:995
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

防止DoS攻擊

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
  • -m limit: 啟用limit擴展
  • –limit 25/minute: 允許最多每分鐘25個連接
  • –limit-burst 100: 當達到100個連接後,才啟用上述25/minute限制

三、轉發與NAT

允許路由

如果本地主機有兩塊網卡,一塊連接內網(eth0),一塊連接外網(eth1),那麼可以使用下面的規則將eth0的數據路由到eht1:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

DNAT與端口轉發

以下規則將會把來自422端口的流量轉發到22端口。這意味著來自422端口的SSH連接請求與來自22端口的請求等效。

# 1.啟用DNAT轉發
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to-destination 192.168.102.37:22

# 2.允許連接到422端口的請求
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

假設現在外網網關是xxx.xxx.xxx.xxx,那麼如果我們希望把HTTP請求轉發到內部的某一台計算機,應該怎麼做呢?

iptables -t nat -A PREROUTING -p tcp -i eth0 -d xxx.xxx.xxx.xxx --dport 8888 -j DNAT --to 192.168.0.2:80
iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT

當該數據包到達xxx.xxx.xxx.xxx後,需要將該數據包轉發給192.168.0.2的80端口,事實上NAT所做的是修改該數據包的目的地址和目的端口號。然後再將該數據包路由給對應的主機。
但是iptables會接受這樣的需要路由的包麼?這就由FORWARD鏈決定。我們通過第二條命令告訴iptables可以轉發目的地址為192.168.0.2:80的數據包。再看一下上例中422端口轉22端口,這是同一IP,因此不需要設置FORWARD鏈。

SNAT與MASQUERADE

如下命令表示把所有10.8.0.0網段的數據包SNAT成192.168.5.3的ip然後發出去:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j snat --to-source 192.168.5.3

對於snat,不管是幾個地址,必須明確的指定要snat的IP。假如我們的計算機使用ADSL撥號方式上網,那麼外網IP是動態的,這時候我們可以考慮使用MASQUERADE

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

負載平衡

可以利用iptables的-m nth擴展,及其參數(–counter 0 –every 3 –packet x),進行DNAT路由設置(-A PREROUTING -j DNAT –to-destination),從而將負載平均分配給3台服務器:

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

自定義的鏈

記錄丟棄的數據包

# 1.新建名為LOGGING的鏈
iptables -N LOGGING

# 2.將所有來自INPUT鏈中的數據包跳轉到LOGGING鏈中
iptables -A INPUT -j LOGGING

# 3.指定自定義的日志前綴"IPTables Packet Dropped: "
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

# 4.丟棄這些數據包
iptables -A LOGGING -j DROP
Copyright © Linux教程網 All Rights Reserved