作者 主題: NAT 的 FTP 設定命題 (iptables)  (閱讀 3788 次)

0 會員 與 1 訪客 正在閱讀本文。

Anonymous

  • 訪客
NAT 的 FTP 設定命題 (iptables)
« 於: 2001-06-30 17:25 »

大家好﹗

自從上次公佈了 NAT 的 FTP 設定命題 之後﹐陸續收到一些朋友問起 iptables 的設定如何﹖今天花了點時間試了試﹐茲將我自己的設定供大家參考一下。

原命題詳見﹕

http://www.tango.idv.tw/study-area/read.php?f=1&i=200&t=200

假設﹕
1) NAT 上有三張網路卡﹕
eth0 接外部網路﹐201.1.2.3
eth1 接 DMZ﹐10.1.2.3
eth 2 接內部網路﹐192.168.0.254
2) DMZ 內有一台主機﹐10.1.2.6﹐打算提供 FTP 服務(port 21 和 port 20)

問題﹕

1) 假設 DMZ 和外部網路的路由是通的﹐NAT 上面只進行單純的封包過濾而沒修改 packet﹐而且其預設 policy 都是 DENY。請設定所有必須的規則﹐讓 FTP 能順利向外部提供服務。
2) 假設 DMZ 和外部網路的路由是不通的﹐我們用如下命令將 eth0 的 port 21和 的連線請求轉至 10.1.2.6 的 port 21﹕
ipmasqadm portfw -a -P tcp -L 201.1.2.3 21 -R 10.1.2.6 21
而且 NAT 上的預設 policy 也全部為 DENY。請設定所有必須的規則﹐讓 FTP 能順利向外提供服務。

(註﹕因為這次使用 iptables﹐所有原假設 2 中的 ipmasqadm 命令行就無需執行了)


我的 iptables 設定﹕

***************************************
假設 1)﹕

# Generated by iptables-save v1.2.1a on Thu Jun 28 14:45:26 2001
*nat
:PREROUTING DROP [3:144]
:POSTROUTING ACCEPT [2:108]
:OUTPUT ACCEPT [4:948]
-A PREROUTING -p udp -m udp --dport 53 -j ACCEPT
-A PREROUTING -p udp -m udp --sport 53 -j ACCEPT
-A PREROUTING -p tcp -m tcp --dport 113 -j ACCEPT
-A PREROUTING -p tcp -m tcp --sport 113 -j ACCEPT
-A PREROUTING -p icmp -j ACCEPT
-A PREROUTING -d 10.1.2.6 -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT
-A PREROUTING -s 10.1.2.6 -i eth1 -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Jun 28 14:45:26 2001
# Generated by iptables-save v1.2.1a on Thu Jun 28 14:45:26 2001
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [4:948]
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 113 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 113 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -p tcp -m tcp --sport 53 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 53 -j ACCEPT
-A FORWARD -s 10.1.2.6 -i eth1 -p tcp -m tcp --sport 21 -j ACCEPT
-A FORWARD -d 10.1.2.6 -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT
-A FORWARD -s 10.1.2.6 -o eth0 -p tcp -m tcp --sport 20 -j ACCEPT
-A FORWARD -d 10.1.2.6 -o eth1 -p tcp -m tcp --dport 20 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 113 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 113 -j ACCEPT
COMMIT
# Completed on Thu Jun 28 14:45:26 2001


***************************************
假設 2)﹕

# Generated by iptables-save v1.2.1a on Sat Jun 30 16:35:09 2001
*nat
:PREROUTING DROP [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p udp -m udp --dport 53 -j ACCEPT
-A PREROUTING -p udp -m udp --sport 53 -j ACCEPT
-A PREROUTING -p tcp -m tcp --dport 113 -j ACCEPT
-A PREROUTING -p tcp -m tcp --sport 113 -j ACCEPT
-A PREROUTING -p icmp -j ACCEPT
-A PREROUTING -d 201.1.2.3 -i eth0 -p tcp -m tcp --dport 21 -j DNAT --to-destination 10.1.2.6:21

# (註一)﹕思考一下為什麼不用為 port 20 做 DNAT﹖

-A PREROUTING -s 10.1.2.6 -i eth1 -p tcp -m tcp --sport 21 -j ACCEPT
-A PREROUTING -s 10.1.2.6 -i eth1 -p tcp -m tcp --sport 20 -j ACCEPT
-A POSTROUTING -p tcp -m tcp -s 10.1.2.6 --sport 20 -j MASQUERADE

# (註二)﹕請留意上一行﹐在 ipchains 中也有相同的設計。

COMMIT
# Completed on Sat Jun 30 16:35:09 2001
# Generated by iptables-save v1.2.1a on Sat Jun 30 16:35:09 2001
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 113 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 113 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -p udp -m udp --sport 53 -j ACCEPT
-A FORWARD -p udp -m udp --dport 53 -j ACCEPT
-A FORWARD -s 10.1.2.6 -i eth1 -p tcp -m tcp --sport 21 -j ACCEPT
-A FORWARD -d 10.1.2.6 -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT
-A FORWARD -s 10.1.2.6 -o eth0 -p tcp -m tcp --sport 20 -j ACCEPT
-A FORWARD -d 10.1.2.6 -o eth1 -p tcp -m tcp --dport 20 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 113 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 113 -j ACCEPT
COMMIT
# Completed on Sat Jun 30 16:35:09 2001


***************************************

以我自己觀察﹐在此命題中﹐iptables 和 ipchains 的最大分別﹐是對那個來自 ftp server 的 ftp-data 封包的處理上。
如果用 ipchains﹐在 masq 之後會另外建一個 source socket﹐但卻不是使用 port 20 ﹔
如果用 iptables﹐在 masq 之後也會另建一個 source socket﹐但卻保留原來的 port 20。
因為連線是從 server 端由內至外建立的﹐所以在 NAT 上已經有這個連線的 masq 記錄存在﹐所以我們也就無須為 port 20 做 DNAT 了。

不過﹐在進行 passive 模式測試的時候﹐盡管將 ip_nat_ftp 模組載入﹐還是不能建立 ftp-data 的連線。
抓幾個封包就可以發現﹕client 端從 command channel 中接收 server 的 port 命令之後﹐會嘗試直接以 ftp server 的 IP 來做 destination﹐卻不是以 NAT 的外部界面為目標。所以連線無法建立。

推論﹕如果 server 和 client 兩端都各自躲在 NAT 背後﹐無論用 ipchains 和 iptalbes 都無法用 passive 模式來建立 data channel。解決的方法﹐只能在 client 端的 NAT 上﹐將 ip_nat_ftp 的模組載入(ipchains 是用 ip_masq_ftp 模組)﹐而 server 端使用標準的 port 20 和 21 來提供 FTP 服務。


以上僅為個人測試心得﹐未必與實際的運作相符。同時很歡迎大家的指教﹐謝謝﹗