設定每次開啟不啟動該服務項目,可以使用 chkconfig 來關閉。
chkconfig iptables off
--
若是 SLES 的話,修改 /etc/sysconfig/network/config 配置,裡面可以找到:
# With this variable you can determine if the SuSEfirewall when enabled
# should get started when network interfaces are starte
FIREWALL="yes|no"
這可以設定每次啟動網路時是否啟用 firewall 配置。
這個要區分成為幾點來說明:
1) 一般說法就是,first match,也就是符合規則敘述後就不再往下走
比方配置:
iptables -P INPUT ACCEPT
iptables -A INPUT -s 192.168.1.1 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP
這就是 192.168.1.0/24 中,只有允許 192.168.1.1 可以存取,其餘192.168.1.0/24 該網段 ip 都禁止存取。
常見設定觀唸錯誤如下:
iptables -P INPUT ACCEPT
iptables -A INPUT -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP
為何 1921.68.1.0/24 還是可以存取不被禁止?這就是比對的符合就不會繼續往下走。
不過這邊到是要先註明的是,-j LOG 與 -j MARK 這類規則倒是會繼續往下比對,這個與 -j ACCEPT 與 -j DROP 就不相同情況。
2) 當比對規則都跑完了都沒有任何符合的敘述時,最後結果要看預設政策設定
iptables -P INPUT ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP......
上面規則來說,表示預設封包都允許連入存取的,只有禁止 192.168.1.0/24,也就是說比對流程規則跑完後都沒有任何符合敘述,最後就是允許存取。
iptables -P INPUT DROP
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT ......
上面規則來說,表示預設封包都禁止連入存取的,只有允許 192.168.1.0/24,也就是說比對流程規則跑完後都沒有任何符合敘述,最後就是允許禁止。
把預設的政策調整為 DROP 基本上需要注意非常多流程,下面部份會談到這部份要注意事項。一般來說建議除非很清楚把預設存取設定為 DROP 帶來的結果,要不然請勿貿然配置使用。因為這樣設定的話,雖然是說只有開放 192.168.1.0/24 可以連入存取,但是卻會導致這台服務主機只可以連線到 192.168.1.0/24 網段的主機,其他的目的都被禁止了。
=====
7. 使用 -P INPUT DROP 引起的主機本身對外連線不通問題?
為了更嚴厲的防火牆存取限制,一般初學者會這樣配配置:
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
也就是主機只有打算開放 ssh 服務對外提供存取。
這樣乍看之下好像非常正確,但是設定好後外面是可以連到該 port 22 服務,但是卻導致了一個後續的問題,也就是 "該主機若是要主動對外要建立連線卻被禁止"。比方這台服務主機無法使用 ssh 登入到遠端主機,也無法用瀏覽器看其他主機 port 80 的 http 服務的。
引起該問題的原因呢? TCP/IP 本身是雙向的,也就是有出必有進,有進必有出。這個規則沒考慮到這點問題。
當主機對外要建立連線時,對方勢必也要回應封包到原主機,所以回應的封包是要被允許的。不過該配置來看卻沒考慮到這點問題,所以導致回應的封包被丟棄,所以連線根本建立失敗。
所以設定 -P INPUT DROP 時,一般正確方式應該考慮加上允許主機本身對外連線時對方回應封包項目,也就是:
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-m state --state ESTABLISHED 扮演很重要角色,那就是允許連線出去後對方主機回應進來的封包。
=====
8. 使用 -P INPUT DROP 導致本機存取自己服務也受到限制?
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
不過上面規則通常應該考慮的是,主機本身對外只有提供可以連結存取port 22 該 ssh 服務,但是若是自己主機有開 port 80 與 port 25 等 服務項目的話,這樣配置卻也導致自己存取自己的主機服務也被限制住了。
基於該問題,一般會建議加上由 loopback interface 該介面不受到該 firewall 組態限制而被阻擋,一般會建議改成:
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
=====
9. 使用 -P INPUT DROP 引起的網路存取正常,但是 ftp 連入卻失敗?
依據前面介紹方式,只有開放 ftp port 21 服務,其他都禁止的話,一般會配置使用:
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
這樣的配置,確認 ftp 用戶端是可以連到 ftp 主機並且看到歡迎登入畫面,不過後續要瀏覽檔案目錄清單與檔案抓取時卻會發生錯誤...
ftp 協定本身於 data channnel 還可以區分使用 active mode 與 passive mode 這兩種傳輸模式,而就以 passive mode 來說,最後是協議讓 ftp client 連結到 ftp server 本身指定於大於 1024 port 的連接埠傳輸資料。
這樣配置在 ftp 傳輸使用 active 可能正常,但是使用 passive mode 卻發生錯誤,其中原因就是因為該主機firewall 規則配置不允許讓 ftp client 連結到 ftp server 指定的連結埠才引發這個問題。
要解決該問題方式,於 iptables 內個名稱為 ip_conntrack_ftp 的 helper,可以針對連入與連外目的 port 為 21 的 ftp 協定命令溝通進行攔截,提供給 iptables 設定 firwewall 規則的配置使用。開放做法為:
modprobe ip_conntrack_ftp
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
其中 -m state 部分另外多了 RELATED 的項目,該項目也就是狀態為主動建立的封包,不過是因為與現有 ftp 這類連線架構會引發另外才產生的主動建立的項目。
不過若是主機 ftp 服務不在 port 21 的話,請使用下列方式進行調整:
modprobe ip_conntrack_ftp ports=21,30000
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 30000 -j ACCEPT
10. 使用 -P OUTPUT DROP 引起的網路不通問題?
來看看這樣配置片段敘述:
iptables -P INPUT ACCEPT
iptables -P OUTPUT DROP
這樣配置來看,感覺上就是主機對外完全開放沒有任何限制連入,但是該主機對外本身限制預設不可以連外,但是結果卻是不管外面也根本連不進來。
該問題 如同上面提到使用 -P INPUT DROP 的配置問題一樣,這樣也是根本沒有考慮到 TCP/IP 本身是雙向溝通的問題。
考慮連入封包後續主機要回應的項目,也是需要搭配傳入 -m state 來提供允許回應封包的項目,所以整個來看片段敘述為:
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
這樣設定好結果,就是該主機本身可以對自己主機服務連結存取,但是對外連結存取都會被禁止。
不過拉回來看,有必要配置 -P OUTPUT DROP 嗎?老實說個人倒是感覺通常都是多此一舉,因為實際應用部份通常不會限制自己主機對外連線的功能。
不過若是堅持要設定 -P OUTPUT DROP 的話,要考慮後續主動連外部份的開放描述可能可多了.... 比方這樣配置項目:
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT