蠻牛比左岸咖啡有效 <ruey.bbs@cis.nctu.edu.tw> wrote in message
news:3cXA1J$GbT@bbs.cis.nctu.edu.tw...
>
>  小弟在架設NAT中, 遇到一個問題, 希望各方高手能給予建議.
>
>  基本的網路架構入下:
>
>  public network <--> NAT server <--> private network
>                 eth0            eth1
>
>  我將 WWW server 直接架在 private network 中, ip為 192.168.1.253
>  然後, 利用 ipmasqadm 讓 public network 可以連上 192.168.1.253 的
>  80 port. 事實上, 的確成功了!! 但問題是, 我在 private network 中
>  無法連到 NAT server就直接幫我 redirect到 private network中的www
>  server. 請問有解決的方法嗎??
>
>  client與server同時存在於同一個subnet中, 沒有DMZ, 似乎很難解決這
>  樣的問題喔!!!
>

此一現象弟在前不久和網友 Ting 兄討論時就發現了﹐不過一直都想不出原因。剛才模
擬了一下這樣的環境﹕

NAT 只啟動兩張網卡﹐一張對外﹐另一張對內﹐不設 DMZ(不同子網)﹐讓轉址後的
server 與內部網路的客戶端同屬一個子網內。

所發現現象如下﹕
1﹐當客戶端送出關於 HTTP (port 80) 的連線請求至 NAT 外部界面之後﹐也就是發出
一個帶 SYN 的 TCP 封包﹐來源 port 為 1238﹐Sequence 為
43980464﹐Acknowledgement 為 0。
2﹐緊接著客戶端就收到一個來自 NAT 內部界面的 ICMP 封包﹐類型為一個 Host
Gateway 的 Redirect 封包﹐目的 IP 指向內部 server 的地址。
3﹐然後客戶端改向內部 server 發出 SYN 的 TCP 封包﹐來源 port 依然為
1238﹐Sequence 也是 43980464﹐ ACK 為 0。
4﹐接著客戶端收到來自內部 server 的 ACK/SYN 封包﹐目的 port 為 1238﹐SEQ為
1579961125﹐ACK 為 43980465。
5﹐然而奇怪的事情來了﹕客戶端卻向內部 server 送出一個 Reset 封包﹐來源 port
為 1238﹐SEQ 為 43980465﹐ACK 和 SEQ 一樣也是 43980465。
6﹐然後隔 6 秒後重複上述動作﹐之後再隔 12 秒重複﹐然後客戶端出現不能連線錯誤
信息。

假如將 URL 改為直接向內部 server 查詢﹐或是在 NAT 上啟動另一界面於不同子網做
為 DMZ﹐再將 server 搬遷過去﹐其連線就不會再出現 ICMP 的 redirect﹐而且 TCP
的 SYN -- ACK/SYN -- ACK 這三段 handshack 都能順利完成。

雖然弟對 TCP 與 socket programing 不是很熟﹐但個人認為問題出在 ICMP 那個
redirect 上面。不過﹐我暫時沒時間去做深入的追蹤﹐僅提供前面的測試信息供各位
朋友參考一下﹐同時也希望有能力者幫大家解答。

p.s. 還有這個情形也可以參考一下﹕在一個內部網路中同時使用兩條 ADSL 連接
internter 的情況下﹐要讓某些 client 透過其中一條 ADSL 去連接另一 ADSL 的
servers﹐通常的做法會去修改 routing ﹐避免封包繞 inernet 一圈回到另一端去。
但如果為了節省一個外部 IP 而讓 routing 都使用內部網路地址(在 MASQ 之內)﹐我
發現第一次連線也會遭到來自 server 端的 reset ﹐然而緊著再發一次請求﹐則可以
順利通過(具體的最大閑置間隔我記不很清楚了)。對此一現象﹐弟也是百思不解﹐如果
有哪位仁兄知道﹐拜託幫忙解惑一下。

謝謝﹗