作者 主題: NAT 的迷思  (閱讀 10151 次)

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

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 於: 2002-10-29 14:18 »
近來發覺對 NAT 的理解還不足夠, 所以再一次拜訪這裡, 怎知越搞越胡塗, 在拜訪 http://www.study-area.org/linux/servers/linux_nat.htm 時, 嘗試利用這裡描述的 IP Masquerading 的圖示方法自行繪畫 Redirect 的情況, 但發覺有點不對勁.

先講講我觀念上的 NAT, 原因是我看了又看 NAT 的文章, 人都胡塗了, 我也不確定是否已在錯誤的觀念中繞圈.

在實作 NAT 的 Server 上, 對 SNAT 的進入只作 Source Socket 替換, 回程的作相反換轉 (在 http://www.study-area.org/linux/servers/linux_nat.htm 中有圖示描述); 而 DNAT 只作 Destination Socket 替換 (在 請問什麼是虛擬ip? http://www.study-area.org/tips/virtual_ip.htm  一文中有以下描述 : "所謂 Source NAT﹐是指進行 NAT 的時候﹐只單純修改 source socket ( IPv4 標頭第 13 個 byte 起的接連 4 個 byte ﹔以及 TCP 標頭的開首兩個 byte )﹐而不會碰到> destination socket。", 所以我將 SNAT 的理解擴展至 DNAT), 回程的作相反換轉.

在參考 http://www.study-area.org/linux/servers/linux_nat.htm 的 IP Masquerading, 自己也圖了一幅 Redirect 的情況, 如下:

代碼: [選擇]
---              ---            ---
| |              | |            | |
| |---internet---| |------------| |
| |S           G1| |G2         D| |
---              ---            ---

S               G2
G1 - ---------> D  ------------------
                                    |
                G1             D    |
                S  <---------- G2 <--

S : 遠端主機 IP
G1 : 內部主機對外連接 IP
G2 : 內部主機對內連接 IP
D : 內部被 Redirect 主機 IP

在這裡好像就連 Source 及 Destination Socket 一同更改?? 那是否在圖示方式中有問題? 可以肯定的是 Redirect 是 DNAT, 在 nat-how-to 中 將 Redirect 納入 Destination  中得以確定, 我多番翻閱有關文章仍得不到滿意的答案, 那個看似簡單的 NAT 真不好理解, 煩請各位多多指教.

謝謝.

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #1 於: 2002-10-29 14:56 »
就從  socket 著手就好:
1) 從 client 送出的封包﹐是否能正確 resolve 為 IP ﹖
2) 該 IP 是否正確的被路由到 NAT 外部界面﹖
3) 然後這個封包到達 NAT 外部界面的時候﹐是否被接收進來﹖
4) 然後是否能正確的轉換 destination socket?
5) 轉換後是否能順利 forwarded (例如 routing 判斷)?
6) 是否能順利從內部界面送出 ﹖
7) 被修改後的封包是否能到達內部 server ?
8) 內部 server 是否能接受這個封包﹖
9) 內部 server 是否能正確讀到封包的 source socket ﹖
10) 內部 server 在處理完之後﹐是否能順利將 source socket 換成 destination socket ?
11) 然後這個封包是否能順利送到 NAT 的內部界面﹖
12) NAT 的內部界面是否能接受這個封包﹖
13) NAT 是否能順利復原遭替換的 socket ﹖並變成 source socket ?
14) 封包能否正確的進行路由判斷而從外部界面送出﹖
15) 封包是否能順利送回 client 端﹖
16) 封包的 source socket 是否與 client 所 expect 的一致﹖
17) 封包的其它監測資訊(如 checksum﹑seq/ack number)是否能被接受﹖
18) 封包的內容所攜帶的資訊是否正確﹖(例如您本來以為會得到 A 結果卻是 B 之類的)
......

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #2 於: 2002-10-29 15:12 »
不好意思, 看完閣下的一些見意後我還是不太了解我以圖示方式所表達的觀念是否正確. 我的觀念中有兩個不太理解的問題.

1) DNAT 實際不只對 Destination Socket 做改動??
2? 還是圖中表示的方式有問題??

謝謝.

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
NAT 的迷思
« 回覆 #3 於: 2002-10-29 15:19 »
snat:在POSTROUTING可以做所謂的SNAT,也就是經過nat router的routing
        table後,要送出時修改其source address及port,也就是source socket,並紀
       錄起來,而當對方回應的封包回來時,該封包的destination address及port會
       符合剛紀錄的那筆資料,所以便將之改寫回來(請注意,這動作並不是DNAT)

      而寫法如netman大的範例
     由eth0出去的封包,將其source address改靜態改寫成1.2.3.4
     iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

而有時的狀況,是預改寫的address無法預測,如撥接的adsl,如此變無法用靜態的方式來達成,可用MASQUERADE來達成,如:
 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

此種方式也是snat,只是這是動態的snat而己.而snat的例子最常用在多人上網的機制上.

dnat:在PREROUTING可以做dnat,也就是在nat router的路由判斷之前,將其destination address及port,也就是destination socket,修改為欲指定的位址,並紀錄起來後送出,而回應的封包回來時,該封包的source address及port會將符合剛紀錄的那筆資料,所以便將之改寫回來(請注意,這動作並不是SNAT).

其實這些資料,在您貼的文章都有,可能要多看幾次,才會了解吧~
以上是在下目前對nat的認知,有錯的話請指正.^^

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
NAT 的迷思
« 回覆 #4 於: 2002-10-29 15:21 »
引述: "小金"


1) DNAT 實際不只對 Destination Socket 做改動??


如果沒錯的話!
只對Destination Socket 做改動^^

snat及dnat是獨立作業的^^

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #5 於: 2002-10-29 15:28 »
引述: "小金"
不好意思, 看完閣下的一些見意後我還是不太了解我以圖示方式所表達的觀念是否正確. 我的觀念中有兩個不太理解的問題.

1) DNAT 實際不只對 Destination Socket 做改動??
2? 還是圖中表示的方式有問題??

謝謝.


1) DNAT 只改 destination socket,若用 iptables 來做,只能在 -t nat 的 PREROUTING 來做。但,同一個封包,iptables 可同時作 DNAT 及 SNAT 處理。
2) 請畫好一點,看不出個所以然

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #6 於: 2002-10-29 15:49 »
1) 就你的說法, DNAT 只改動 Destination Port, 那麼圖示的方式就不正確了. 那麼以下的圖才是正確的?


代碼: [選擇]
---              ---            ---
| |              | |            | |
| |---internet---| |------------| |
| |S           G1| |G2         D| |
---              ---            ---

S               S
G1 - ---------> D  ------------------
                                    |
                G1             D    |
                S  <---------- S <--

2) 不好意思我是有先預覽才送出的, 預覽時還好端端的, 但送出後就走了樣.

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #7 於: 2002-10-29 16:36 »
你的圖我還是看不懂~~~

請不要偷懶,將 ip + port 寫出來吧?

或做練習:
外部 client : 4.3.2.1:1025
NAT 外: 8.7.6.5
NAT 內: 1.2.3.4
內部 server :1.2.3.5:80
請將如下 socket pair 寫好:
1) 外部 client -> NAT 外 (sa: sp: da: dp:)
2) NAT 內 -> 內部  server  (sa: sp: da: dp:)
3) 內部  server  ->  NAT 內 (sa: sp: da: dp:)
4) NAT 外 ->  外部 client  (sa: sp: da: dp:)

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #8 於: 2002-10-29 17:02 »
我現在的理解是這樣 (這些圖很不好畫^_^), 對嗎?

S: 4.3.2.1:1025
G1: 8.7.6.5
G2: 1.2.3.4
D:1.2.3.5:80

代碼: [選擇]
---              ---            ---
| |              | |            | |
| |---internet---| |------------| |
| |S           G1| |G2         D| |
---              ---            ---



    sa: 4.3.2.1       sa 4.3.2.1
    sp: 1025          sp 1024
    da: 8.7.6.5 ====> da 1.2.3.4 =====
    dp: 80            dp 80          |
                                     |
                                     |
    sa: 8.7.6.5       sa: 1.2.3.4    |                          
    sp: 80            sp: 80         |
    da: 4.3.2.1 <==== da: 4.3.2.1 <===
    dp: 1025          dp: 80


謝謝指教

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #9 於: 2002-10-29 17:19 »
錯!

如過 "只" 做 DNAT ,那 sa 與 sp 都不變、、、
建議重學 subneting 與 routing ,沒有基礎是很難理解 nat 的。

p.s.
下次畫圖,請不要用 pre ,改用 code 吧(在編輯框上面就有按鈕,先選取,再按 "Code"。)

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #10 於: 2002-10-29 17:37 »
這次應該沒問題吧! 再來一次.

S: 4.3.2.1:1025
G1: 8.7.6.5
G2: 1.2.3.4
D:1.2.3.5:80

代碼: [選擇]

---              ---            ---
| |              | |            | |
| |---internet---| |------------| |
| |S           G1| |G2         D| |
---              ---            ---



    sa: 4.3.2.1       sa 4.3.2.1
    sp: 1025          sp 1025
    da: 8.7.6.5 ====> da 1.2.3.5 =====
    dp: 80            dp 80          |
                                     |
                                     |
    sa: 8.7.6.5       sa: 1.2.3.5    |                            
    sp: 80            sp: 80         |
    da: 4.3.2.1 <==== da: 4.3.2.1 <===
    dp: 1025          dp: 1025



P.S. 謝謝指教, 我忘記從那裡學的用
 會保持 ACSII Style, 真不好意思, 搞亂了你的版子.

潛水夫

  • 可愛的小學生
  • *
  • 文章數: 21
    • 檢視個人資料
NAT 的迷思
« 回覆 #11 於: 2002-10-30 08:44 »
試著回答一下, 若有錯誤, 尚請指正:
其實NAT的用途是幹什麼, 你有沒有弄清楚??最基本的就是讓"假'IP能透過這個機制來"上網".

internet         NAT            假IP
     |------------|---------------|
一般的網路封包, 都會包含兩個資料, Dest Address & Source Address.
以出去來講, Source Address的IP是假的, 所以若以這個IP出去話, 會找不到回來的路(因為IP是假的), 所以要NAT把SA改成NAT上面的真實IP, 而當封包回來時, 再由NAT把真實IP換成原來假的IP. 如此就可以讓一堆"假"IP上網了.
而這種方式可用來種方法來達成, MASQ及SNAT, MASQ就是用"代表號"出去, 而SNAT則可以指定IP(以本公司為例, Hinet給了五個真實IP, 但實際只有一個"代表號", 剩下的就可以用SNAT的方式來給, 以充分利用IP.
而DNAT剛好可以說是相反, 可能你的一些Server用的是假IP, 但卻希望給全世界的人來讀取, 就可以利用DNAT的方式, 把外部進來的封包(針對某一IP, 某一Port), 轉換成內部的IP, 進而連上Server, 當然, 若你的Server對外公部的IP不是"代表號"的話, 自然得再配合SNAT, 方可讓封包安然的回去.

不知是否能看懂????
[/code]

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #12 於: 2002-10-30 10:06 »
謝謝潛水夫的指教.

你所說的在我以住已翻閱多方面的資料, 我想我是明白這 "表面" 的運作原理, 但我就是不滿足於此, 希望在 "深入" 的原理上鑽研一番, 以 IP 由進入 NAT Server 開始深究一番, 追縱 IP 及 Port 變化, 這個才是我的目的. 現在還在等我上面所畫的圖是否正確的回覆.

Any way, thx.

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #13 於: 2002-10-30 10:52 »
引述: "小金"
現在還在等我上面所畫的圖是否正確的回覆.


若換了我,與其在等,不如自己驗證。
tips: tcpdump 是個非常好用的工具。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #14 於: 2002-10-30 10:55 »
引述: "潛水夫"
以出去來講, Source Address的IP是的, 所以若以這個IP出去話, 會找不到回來的路(因為IP是的), 所以要NAT把SA改成NAT上面的真實IP, 而當封包回來時, 再由NAT把真實IP換成原來的IP. 如此就可以讓一堆""IP上網了.


我相當不贊成用 "假 IP" 或 "虛擬 IP" 或 "非法 IP" 來稱呼 private IP 。

原因我在下面文章談過了:
http://www.study-area.org/tips/virtual_ip.htm

潛水夫

  • 可愛的小學生
  • *
  • 文章數: 21
    • 檢視個人資料
NAT 的迷思
« 回覆 #15 於: 2002-10-30 11:32 »
netman:
謝謝指教, 因為我不是很在乎這些名詞, 只是很單純的想, 真實IP對應的不就是假IP, 或許這在名詞統一上會有問題, 以後會注意的(英文不是很好, 背不起來那個單字).

我猜想一下你那個圖的"動作", 一個遠端電腦, 連線到你的Web 主機, 但這台Web主機的IP僅是對外的IP, 真正的Web Server是在NAT內的一台機器, 對嗎??
若對!!我以以下例子再來說明一下.
遠端主機IP : 1.2.3.4
對外Web IP : 2.2.3.4
NAT上對內IP : 3.4.5.6
真正Web IP : 3.4.5.7
網路封包內容我就不講了, 只大概以Dest Address|Source Address這個方式來表示.
當遠端主機發出一個需求, 其封包後 : 2.2.3.4|1.2.3.4
當NAT收到後, 會把封包做更動如後 : 3.4.5.7|1.2.3.4 往網內丟到真正的Web Server
當Web Server做出回應, 會回個封包給遠端主機, 其封包如後 : 1.2.3.4|3.4.5.7
而這個封包在經過NAT時, 會把這個封包做處理, 結果如後 : 1.2.3.4|2.2.3.4

講得很粗略, 若有錯誤, 請指教!!!!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #16 於: 2002-10-30 11:44 »
您或許連 "真實 IP" 都誤解了吧,請重新參考我給您的文章。若不想讀那麼長, 就只看 "網中人" 的回文部份就好。

請將完整的 socket pair 列出來,一個單一封包有:
Source Address
Source Port
Destination Address
Destination Port

因此,您的 2.2.3.4|1.2.3.4 不很充份,或改為 2.2.3.4:1025->1.2.3.4:80 ,這樣才好理解。

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
NAT 的迷思
« 回覆 #17 於: 2002-10-30 11:56 »
Dear:小金兄
如果是要了解流程及變化,下個的資料或許可以幫上忙!! ^^
http://www.ncu.edu.tw/~center5/livecd/ipnat/
字有點小,可能要用力看一下^^

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #18 於: 2002-10-30 14:49 »
潛水夫
你所描述的資料流向正是我的意思. 謝謝.


ericshei
謝謝 ericshei 提供的資料, 我會細心閱讀的 ^^.


netman
我是希望自己驗證的, 但我對所驗證的方法不太清楚, 所以一直不能實作. 很感謝你所提供的方法 (tcpdump), 但我對這工真的運用不太了解, 我想, 用這工具我還需揣摸使用的方法, 相信也要好一段時間. 而且實作上也有一點困難, 我必須找來三部機, 這點卻有點問題.....我不是躲懶, 只是這樣會越搞越複雜. 只想對 NAT 這方面有深入了解的朋友們相助. 事實上經過大家的幫助之後, 我幾乎可以肯定我上面所表達的圖是正確的, 但就是不安心, 希望得到一個肯定的答案. 至於 tcpdump 的方法我也會想辨法的.

謝謝各位

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #19 於: 2002-10-30 14:58 »
嗯!好學不倦正是我們最欣賞的態度,給你加油!

用 tcpdump 不會難,也不需要在 3 台機器上跑,
基本上在 nat 上跑就好了,比方:
tcpdump -i eth0 > /tmp/tcpd.eth0
過一會按 ctrl+c 就可結束,然後慢慢看(搜索) /tmp/tcpd.eth0
就知道進出 eth0 的封包 sockets 的資料了。
若將 eth0 改為 eth1 ,那就知到 eth1 的。
若懂得用 grep 更方便....

以你的例子:

外部 client : 4.3.2.1:1025
NAT 外: 8.7.6.5
NAT 內: 1.2.3.4
內部 server :1.2.3.5:80
請將如下 socket pair 寫好:
1) 外部 client -> NAT 外 (sa:4.3.2.1 sp:1025 da:8.7.6.5 dp:80)
2) NAT 內 -> 內部 server (sa:4.3.2.1 sp:1025 da:1.2.3.5 dp:80)
3) 內部 server -> NAT 內 (sa:1.2.3.5 sp:80 da:4.3.2.1 dp:1025)
4) NAT 外 -> 外部 client (sa:8.7.6.5 sp:80 da:4.3.2.1 dp:1025)

注:4.3.2.1 在經過 NAT 並沒被修改。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #20 於: 2002-10-30 15:03 »
在如下網頁:
http://www.study-area.org/linux/servers/linux_nat.htm

一早我就要求你要將下面概念搞定:
* IP subneting 與 IP routing 的概念﹔
* TCP 與 IP 封包 header 的各個欄位之名稱與意義﹔
* Socket Pair (Source Socket 與 Destination Socket) 的定義﹔
* TCP 封包之 Sequence Number 與 Acknowledgement Number 的關係﹔
* IP fragment 與 MTU/MRU 的關係﹔
* ICMP 協定的 type & error code 之名稱與意義﹔
* Three-way Handshake 的過程與 SYNC 封包的意義﹔
* TCP/IP 連線的不同連線狀態(例如 NEW﹑WAITED﹑ESTABLISEHED﹑等)
* 各種服務的連線特征(尤以 FTP 服務為代表)。

不知道您解決哪些了?
若這些都通了,NAT? piece of cake!
若不懂,那,就努力囉....

有空多看書:
http://www.study-area.org/tips/net_books.htm

p.s.
還有,來這討論問題,最好關心自己是否能學到知識。若然,就別計較別人的語氣了。(抱歉:我是超級兇的學長)

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #21 於: 2002-10-30 15:58 »
netman :
多謝讚賞. 我就是一幅這樣的性格, 查根問底 (很多人覺得討厭啊 ^^).

照你所說, 我的推論正確的了 (真相大白 ^^), 繞了這樣大的圈子還是值得的, 謝謝.

關於你提供的工具 tcpdump 還有一點使用上的問題, 在我最初發問的問題上, 似乎應該要同時間 Capture eth0 及 eth1 的有關資料才能比對完整的流向數據, 在你描述的方法中好像同時間只能搜集一張 Network Interface 的資料, 那麼同時 Capture 兩邊 NIC 的方法為何?

謝謝

P.S. 我指的 3 部電腦, 是在測試當中份演 "遠端主機", "NAT 主機" 以及 "內部主機" 這一點才能摸擬這情況會有點困難.

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17480
    • 檢視個人資料
    • http://www.study-area.org
NAT 的迷思
« 回覆 #22 於: 2002-10-30 16:06 »
tcpdump 不指定 -i 就是全部界面了。

現在,您可能需要看 man 的用法。

小金

  • 可愛的小學生
  • *
  • 文章數: 23
    • 檢視個人資料
NAT 的迷思
« 回覆 #23 於: 2002-10-30 16:17 »
明白了.

感謝大家的幫助, 實在得益不少. ^^