我們由 網路基礎 當中知道,要能夠連接上 Internet 必須要具有『公共 IP (Public IP)』才行,內部私有 IP (Private IP) 是不能直接與 Internet 進行資料溝通的。好了,今天假設您是一家公司的主管,或者是一間學校的資訊主任,而且您所負責的單位內有 20 部電腦好了,這 20 部電腦都需要能夠連上 Internet ,並可以進行任何 Internet 的服務要求,請問您是否需要具備有 20 個公共 IP 呢?如果真的要提供 20 個公共 IP 的話,以最經濟的價格來說,我們可以申請 Seednet 的 512/64 (下載/上傳) 撥接制 ADSL ,每個專線都可以具有五個 IP ,因為我們有 20 部主機,所以就需要四條電話線?呵呵!怕了吧!光是接線與申請 ADSL 的流程就會讓人崩潰,更不用說申請到之後還需要在每一部電腦上面設定撥接、管制電腦使用性、進行防毒等等的工作,光是用想的,就已經很頭大了,更不用說實際去作.....
那麼應該要怎麼辦呢?比較聰明的朋友已經想到要去買 IP 分享器來分享網路頻寬了!那麼 Linux 是否能夠達到 IP 分享器的弁遄I?當然可以啦!那就是 NAT 主機的能力之一囉!我們在之前的 Router 設定當中,提過路由的概念了,封包的傳送主要是透過路由的資訊,但是,私有路由是不能直接與 Internet 溝通的啊!因此用 Linux 作為 Router 時,如果 Linux 主機本身就是僅有私有 IP ,自然也就無法直接連接到 Internet 上面去了。
到底該如何是好?呵呵!這個時候就得要回頭談一談 TCP 封包的概念咯。由網路基礎 章節裡面提到的 TCP 封包的架構圖,我們可以發現 TCP 封包裡頭有來源與目的地的 IP 及 port 的資訊在 Header 裡面,那麼如果透過某些技術,來改變 TCP 封包的 header 呢?如果能夠將 TCP 封包的來源 IP 由本來的 Private IP 變成 Public IP 的話,不就可以連接到 Internet 了嗎?!呵呵!沒錯沒錯!談到重點了!就是這樣啦!NAT 主機的重要弁鄐坐@就是將來自內部 Client 端電腦封包的 Header 的 IP 『偽裝』成公共 IP ,而提供 Client 端連上 Internet 的一個方法!(註:當然啦, IP 分享器也是使用同樣的道理!)。那麼 Linux 是用什麼機制達到這樣的弁遄H還記得簡易防火牆設定當中提到的 iptables 吧?!iptables 可以進行封包的分析,當然,他還可以進行封包資訊的修改呢!那麼整個流程是如何呢?如下圖所示,當我的區域內的具有 192.168.1.100 的 client 要對外連線的時候:
這個 client 的 gateway 設定為 NAT 主機,所以當要連上 Internet 的時候,該封包就會被送到 NAT 主機啦,這個時候的封包 Header 之 source IP 為 192.168.1.100 喔;
而透過這個 NAT 主機,她會將 client 的對外連線封包的 source IP ( 192.168.1.100 ) 偽裝成 ppp0 ( 假設為撥接情況 )這個介面所具有的公共 IP 囉,因為是公共 IP 了,所以這個封包就可以連上 Internet 了!同時 NAT 主機並且會記憶這個連線的封包是由哪一個 ( 192.168.1.100 ) client 端傳送來的;
由 Internet 傳送回來的封包,當然由 NAT 主機來接收了,這個時候, NAT 主機會去查詢原本記錄的路由資訊,並將目標 IP 由 ppp0 上面的公共 IP 改回原來的 192.168.1.100 ;
最後則由 NAT 主機將該封包傳送給原先發送封包的 Client 囉!
如果是在 iptables 的內建 table 當中,與 NAT 有關的就是 nat table 的 POSTROUTING 那個鏈了!就是簡易防火牆當中的圖九的示意圖喔!也就是說,整個封包其實只有經過 NAT 主機的 iptables 機制在偽裝 IP 與修改路由資訊而已,並沒有進入 NAT 主機內部啦! ^_^!由上面的資訊我們可以知道一件事,那就是:『您的 NAT 主機至少需要有一個私有 IP 與一個公共 IP 才行』喔!而且,『NAT 主機,一般來說,也是一部 Router 喔!』如果 Router 兩邊都是私有 IP 或都是公共 IP 時,Linux 主機只要有 Router 的弁鄑Y可,若是兩邊分別為公共與私有 IP 時,才需要以 iptables 來啟動 NAT 的弁遄C
頻寬分享:我想,架設 NAT 的朋友大部分都是希望可以達到頻寬分享的目的的!這畢竟是 NAT 主機的最大弁鉣o!
安全防護:咦!關安全防護什麼事呀!?別忘了, NAT 之內的 PC 連線到 Internet 上面時,他所顯示的 IP 是 NAT 主機的公共 IP ,所以 Client 端的 PC 當然就具有一定程度的安全了!最起碼人家在進行 port scan 的時候,就偵測不到您的 Client 端的 PC 啦!安全多了!
剛剛上面我們已經提過了,要架設 NAT 的話,只要『兩塊網路介面』就夠了,倒不一定需要兩塊『實體網路卡( NIC )』,是的!所以鳥哥先以較為便宜的方式(因為少了一塊網路卡呀!)來介紹 NAT 的架設!底下是我們介紹的安裝步驟:
關閉一些系統服務的 port :
為了安全起見,還是檢查一下吧!首先,我們需要先來瞭解一下我的 Linux 主機的孕峎隻鞳H!如果只是單純的要作為 NAT 的話,那麼 Linux 主機所開放的 port 是越少越好!鳥哥可不希望您開機了大約一個星期,就開始苦苦哀嚎說自己的主機無法以 root 登入了......。關閉 port 的方法與選擇『系統一定需要的服務』的介紹在 限制連線的埠口 裡面已經說的很清楚了!我以 Red Hat 9 來說明: 1. 使用 ntsysv 設定開機時啟動的服務項目:
[root@test root]# ntsysv
只要選擇底下幾個服務即可:
atd, cron, iptables, keytables, network, random, syslog, xinetd
2. 重新開機讓設定生效:
[root@test root]# reboot
3. 觀察目前的 port 開啟多少個?
[root@test root]# netstat -an | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 7 [ ] DGRAM 944 /dev/log
unix 2 [ ] DGRAM 3162963
unix 2 [ ] DGRAM 739227
unix 2 [ ] DGRAM 739189
unix 2 [ ] DGRAM 1070
unix 2 [ ] DGRAM 953
unix 2 [ ] STREAM CONNECTED 690
# 注意:盡量不要看到有 LISTEN 的咚咚!最多就是有 ssh 就好了!除非您有其他的服務!
實體線路配置圖:
怎麼安裝連線呢?趕快買線材來架設吧!由於 Linux 主機只有一張網路卡,所以所有的裝置(包括 Linux 主機, client 端電腦, 數據機等等)都需要接在 Hub/Switch 上面,有點像底下的樣子:
圖二、一塊網路卡的 NAT 主機配置
這個時候請特別留意啦!如果是使用 ADSL 撥接制的話,那麼在 Linux 主機上應該會有安裝 rp-pppoe 這個東西,並且在撥接之後會產生 ppp0 這個網路介面,同時不要忘了,啟動網路卡的時候不是就已經有 eth0 這個實體網路界面的設定嗎?,嘿嘿!那麼我們不是就有兩個網路介面了嗎?!沒錯!就是這樣!但是,如果是 Cable 或者是其他的固定制的方法的話,那麼跟這個也差不多啦!不過由於 Cable 的方式沒有自動產生兩個以上的網路界面,所以就需要設定 IP Alias 囉,也就是 eth0:0 啦!亦即就是以 eth0 跟 eth0:0 這兩個介面來連線囉!反正,只有一張網路卡,也可以進行 NAT 的啦! ^_^""
設定網路介面:
我們分別以撥接、 Cable 及固定 IP 為例啦!
ADSL撥接制 :
在進入 Linux 並啟動網路卡之後,我們會得到 eth0 這個界面,再加上撥接之後的 ppp0 界面,所以我們就已經會有個兩網路介面,分別是 ppp0, eth0!此外,我預計的私有網域的 IP 選用 192.168.1.0/24 這個 C Class 的網域,其中, Linux NAT 主機的私有 IP 選擇為 192.168.1.2 這一個!
第一個網路介面 -- ppp0 -- 的設定:這個東西應該不難吧!就是我們在 連上 Internet 一文裡頭提到的關於 rp-pppoe 的撥接上網方式。
--------------------------------------------------------------------------------
客戶端的設定:
在 Client 端的設定真是簡單的可以了!由於我們上面的網域設定的是 192.168.1.0/24 這個 C Class 的私有網域,所以您只要記得幾件事情:
network 設定需要為: 192.168.1.0
broadcast 設定需要為: 192.168.1.255
netmask 設定需要為 255.255.255.0
IP 設定需要為 192.168.1.1 ~ 192.168.1.254 之一,且『不能重複』
Gateway 或者說是 通訊閘 需要設定為您的 Linux 的對內 IP ,以我的例子來說,就是 192.168.1.2 !
DNS 的設定:這個最容易出錯了,您的 DNS 設定需要是您的 ISP 給您的 DNS IP,如果您不知道的話,可以填入 168.95.1.1 這一個中華電信的 DNS 或者是 139.175.10.20 這一個 SeedNet 的 DNS 即可!千萬不要設定為 192.168.1.2 呦!會連不出去!
大致上就是這樣啦!至於 Client 端通常是 Windows ,相關的設定可以前往參考一下區域網路設定一文說!至於 Linux 端則需要查看一下 連上 Internet 裡面的固定 IP 的設定啦!
--------------------------------------------------------------------------------
安全性:
請注意,在這個例子當中,我們並沒有使用到封包分析的動作,有的只有 IP 偽裝而已,所以:
對於 Client 端來說,由於已經經過了 IP 偽裝的弁遄A所以基本上,您通過 NAT 主機連出去的封包的 IP 都會是『 NAT 主機對外的公共 IP 』,因此對於內部 Client 端而言,由於網路 Cracker 幾乎都是根據 IP 來進行破壞,而因為您連出去的封包 IP 是 NAT 主機的公共 IP ,自然您的 Client 端就比較安全多了!基本上, Client 端在 NAT 之內,沒有安裝防火牆軟體也還好,但是『防毒軟體一定要安裝!』因為您畢竟會接收電子郵件呀等等的,所以還是可能會中毒啦!!
對於 Server 端來說,我們僅僅設定一些簡單的防火牆規則,而且在原本的 iptables.rule 當中還預設開啟了釵h的埠口,所以其實這樣的一個主機並不是十分的安全的,因此,您最好還是自行將 iptables.rule 內的最後面的幾個開放的埠口給他註解掉才好吶!(如果您的 NAT 主機僅想要負責頻寬分享的弁鄋爾隉I)