• 沒有找到結果。

NAT HOWTO

在文檔中 硬體防火牆 (頁 69-74)

第三章 Linux 核心防火牆技術

3.3 NAT HOWTO

3.3.1 什麼是 NAT

一般來說﹐在網路上封包從其來源 (如家裡的電腦) 出去﹐然後 到達目的地 (如 www.yahoo.com)﹐會經過許許多多個不同的連接 (links)。以下是從逢甲大學機房的電腦到 www.kimo.com.tw 之間所經 過的端點:

Tracing route to bbs.kimo.com.tw [210.59.145.177]

over a maximum of 30 hops:

1 1 ms <10 ms <10 ms 140.134.232.254 2 1 ms <10 ms 1 ms 140.134.6.251 3 200 ms 343 ms 239 ms 211.22.189.186 4 1 ms 1 ms 1 ms 211.22.189.186 5 2 ms 2 ms 1 ms 211.22.189.190

6 3 ms 3 ms 2 ms tc-b-c12r1.router.hinet.net 7 4 ms 5 ms 6 ms 210.65.2.2

8 5 ms 4 ms 4 ms 168.95.207.37

9 6 ms 10 ms 5 ms tp-col-r2.router.hinet.net 10 6 ms 6 ms 5 ms 211.72.249.9

11 6 ms 6 ms 5 ms bbs.kimo.com.tw Trace complete.

假如其中一個連接會做 NAT 的話﹐然後它們就會更改那些有經 過它的封包的來源或目的位址。

通常要做 NAT 的連線會記住它如何 mangled 封包﹐然後當回應封 包從另一方向過來的時候﹐然後就反過來 mangling 那個回應封包﹐

所以所有東西都開始運作了。

圖 3-7 NAT 的運作示意圖

在 Linux 可以用 iptables 這個工具來做 NAT, 我們可以用–t nat 選項選擇 nat table,nat table 有三個 chains: PREROUTING、

POSTROUTING、OUTPUT。

3.3.2 為什麼要用 NAT

一、多部電腦共用IP上網

大多數的 ISP 在您連上去的時候只會給一個單一 IP 地 址。以任何來源地址把封包送出去都行﹐但只有回應到這個來源 地址的封包可以回到您那裡。如果想用多台不同主機(例如家中 網路)透過該連接上 internet 的話﹐那就要 NAT 了。

這也就是今天 NAT 最常用之處﹐而在 Linux 世界最為人知 的就是所謂的 `masquerading(封包偽裝)' 了。稱之為 SNAT﹐

因為改變了第一個封包的 source(來源) 地址的緣故。

二、多重伺服器

有時候會想去改變那些進入網路的封包之路向。這最常是因 為(如上述)只有一個 IP 地址﹐但卻想讓別人能夠連接到 `真實 ' IP 地址後面的主機去。如果重寫這些內送封包的目的地址﹐

這樣您就可以管理它們了。

一個常見的變動是負載分擔(load-sharing)﹐也就是在一組 機器上面為封包做映對(mapping)的動作。這類型的 NAT ﹐在以 前的的 Linux 版本中也就被稱為 port-forwarding 。

三、透明代理(Transparent Proxying)

有時候﹐或許想要每一個經過 Linux 主機的封包送至主機 本身的一個程式去。這就需要進行透明代理的動作了﹕一個代理 就是一個位於我們的網路和內部網路的程式﹐為彼此雙方負起溝 通的任務。而所謂的透明﹐則是因為我們的網路甚至無須知道在 和一個代理對講﹐當然了﹐除非代理不再工作了吧。

Squid 可以配置成這樣的工作方式﹐這就是在過往的 Linux 版本中所謂的重導向(redirection)、或透明代理了。

3.3.3 SNAT 與 DNAT

NAT 分為 Source NAT (SNAT) 與 Destination NAT (DNAT) Source NAT 就是改變第一個封包的來源地址﹕例如﹐為傳入的連 線做 caching 的動作。Source NAT 永遠會在封包傳出網線之前就做 好 post-routing 的動作。封包偽裝(Masquerading) 就是一個 SNAT 特例。

Destination NAT 就是改變第一個封包的目的地地址﹕例如要為 傳出的連線做 caching 的動作。Destination NAT 永遠會在封包從網 線進入之後就馬上做好 pre-routing 的動作。Port forwarding、負 載分擔、以及透明代理﹐都屬於 DNAT。

3.3.4 NAT 與 Packet Filtering 整合

設計封包過濾的時候﹐可以完全不用理會要做怎樣的 NAT 。在封 包過濾中看到的來源與目的地﹐只會是真實的來源和目的地。舉例來 說﹐如果 NAT 要將所有連到 1.2.3.4 port 80 的連線送到 10.1.1.1 port 8080 ﹐這樣封包過濾會以為那些封包是要送到 10.1.1.1 port 8080 (真正的目的地)﹐而不是 1.2.3.4 port 80。同樣的﹐我們也可 以忽略封包偽裝,封包像是直接來自內部的 IP(例如 10.1.1.1)﹐封 包過濾會以為回應封包也是直接送回內部IP的。

還可以運用 `state' 比對延伸(match extension)而無需讓封包 過濾做額外的工作﹐因為不管怎樣,NAT 都會要求連線追蹤。以下是 一個封包偽裝的例子

# 封包偽裝後由 ppp0 出去

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# 丟棄所有來自 ppp0 界面的封包

iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP iptables -A FORWARD -i ppp0 0 -m state --state NEW,INVALID -j DROP

# 啟動 IP forward

echo 1 > /proc/sys/net/ipv4/ip_forward

Host Packet

Match(yes/no)

no

yes

在文檔中 硬體防火牆 (頁 69-74)

相關文件