==========================================
iptable 在 /sbin/下面
==========================================
為了更嚴厲的防火牆存取限制,一般初學者會這樣配配置:
代碼:
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 扮演很重要角色,那就是允許連線出去後對方主機回應
進來的封包。
依據前面介紹方式,只有開放 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 這類連線架構會引發另外才產生的主動建立的項目。