回Netman的話
kenduest兄教的方式確實可行....但把rule都拿掉豈不危險
[quota=Netman]#-- set policy --#
$IPT -P INPUT ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat PREROUTING ACCEPT
$IPT -t nat POSTROUTING ACCEPT
$IPT -t nat OUTPUT ACCEPT
$IPT -t mangle PREROUTING ACCEPT
$IPT -t mangle OUTPUT ACCEPT
[/quota]
$IPT -P INPUT ACCEPT這個好像打了兩次
且policy為全開後關?這樣豈不危險?
如果改為這樣呢?
1.先全關
###-----------------------------------------------------###
# 設定 filter table 的預設政策(預設全部丟棄)
###-----------------------------------------------------###
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
2.打開特定的port
iptables -A INPUT -p tcp -i $EXTIF --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 21 -j ACCEPT
這樣是否安全點?
是非常非常的安全,但是你網路也掛了,因為都不通

您說把 POLICY 改成 ACCEPT 您當初要的設定就通,那您有沒有思考過因為就是您把 POLICY 改成 DROP 後,還有一堆細節沒有處理好,所以才導致最終結果沒有達成所預期的呢?
OUTPUT chain 基本上是沒有必要設定為 DROP 的,因為那是找自己麻煩,自己主機對外連線預設都是封死的。連自己連自己 loop back 都連不通,還有對外要查詢 dns 也是不通。除非你確定你要做的事情,否則一般來說沒必要弄成這樣子。
再來就是,我想您打算要把 POLICY 設定為 DROP 時,那您應該就得了解所謂 TCP/IP 雙向連線溝通的做法,否則您怎樣設定網路還是不會通的。
我前面說您的 rule 有長厄長,所以那是讓除錯非常不利的情況。所以建議您要把規則簡化後再說,因為一個關卡錯誤其他就會有問題。
希望 firewall 設定是對外開放某些 port,然後最後封死,做法有...
預設 POLICY 為 ACCEPT 做法會像是:
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -P INPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -j DROP
預設 POLICY 為 DROP 做法會像是:
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
您的問題在於您只是把 INPUT chain 設定為 DROP,但是沒有考慮過若是您要對外連線時,對方回應丟回來的封包會因為您的 INPUT chains 是 DROP 而讓封包無法傳入。
所以
-m state --state ESTABLISHED 扮演很重要繳色,那就是允許連線出去後對方主機回應進來的封包。
你打算把 OUTPUT 的 POLICY 設定為 DROP,若你沒考慮剛剛說的雙向問題,那網路不通一點都沒錯。
再者,您也忽略了 FTP protocol 的傳輸架構,因為 FTP 本身有兩個通道在傳輸資料。一個為 command channel,另外一個是 data channel。其中 data channel 是動態於 command channel 溝通後才建立的,而該 data channel 的 port 是動態建立來傳輸後續要上傳與下載檔案的內容資料。您這樣的架構設定沒有考慮該情況,那另外一個 connection 傳輸是不通的。
更何況所謂 ftp 傳輸資料在 data channel 上,還細分 passive 與 active mode 兩種傳輸,您也沒有注意這兩個差異性質,那 firewall rule 常看到這樣設定的結果也是有問題的。像是:
iptables -P INPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state NEW -j DROP
或者是
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
這個方式來看其實一般網路連線存取是正常,但是 ftp 連線若是使用 active mode 的傳輸方式就會掛掉,因為到時候 ftp client 與 ftp server 溝通時,其 ftp server 會連到 ftp client 指定某個 > 1023 編號 的 port 把資料傳入,因為該 port 沒有允許連入,所以資料會無法送進來。這也是為何前面規則內我會補上 --state RELATED 的規則允許關係。因為 RELATED 是偵測另外一個 NEW CONNECTION,比方向是於ftp 這類傳輸另外建立的通道有關係的項目。
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
netman 在 study-area 文章部分也已經討論過這問題很多次了,若您打算要深入了解一點,請先去看一下 netman 之前花時間寫的文章吧。
個人的建議是,若是您學習 iptables 的 firewall rule,您有打算希望預設為 DROP 然後一一開放,或者是一一開放後最後 DROP 無法連線,您都需要知道 tcp/ip 是雙向溝通的原則,並且還需要熟悉 iptables 在 state 狀態比對的語法使用,這樣才能夠達成所需要的最終結果。
題外話的就是,很多網路文章看到,有人說預設開啟 FORWARD 是危險的,所以要改成這樣:
iptables -P FORWARD DROP
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
就是只有允許內部 192.168.1.0/24 開放 FORWARD 封包轉送。不過為何實際內部網段還是無法出去?若是您有思考過雙向問題時,應該就知道問題點在那邊。所以您的原本問題也許就是在這邊 ?因為您的轉送進來流程會是:
PREROUTING --> FORWARD --> ...
很多人是說 POLICY 設定為 DROP 然後一一開放是非常安全這點我非常認同,但是前提是您要能夠掌握住整個架構設定,否則 firewall 結果可能讓網路還是處於不通的狀態,那就真的傷腦筋了。
--