<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 9.5 NAT 服務器的設定 呼呼!終于來到這個地方了!我們準備要架設一個[路由器](http://linux.vbird.org/linux_server/0230router.php)的延伸服務器,就稱之為 NAT 服務器。 NAT 是什么呢?簡單的說,你可以稱他為內部 LAN 主機的『 IP 分享器』啦! NAT 的全名是 Network Address Translation,字面上的意思是『網絡地址的轉換』。由字面上的意思我們來想一想, TCP/IP 的網絡封包不是有 IP 地址嗎?那 IP 地址不是有來源與目的嗎?我們的 iptables 指令就能夠修改 IP 封包的表頭數據, 嘿嘿!連目標或來源的 IP 地址都可以修改呢!甚至連 TCP 封包表頭的 port number 也能修改!真是有趣! NAT 服務器的功能可以達到類似[圖 9.1-2](#fig9.1-2)所介紹的類似 IP 分享的功能之外, 還可以達到類似[圖 9.1-4](#fig9.1-4)所介紹的 DMZ (非軍事區) 的功能!這完全取決于我們的 NAT 是修改: (1)來源 IP 還是 (2)目標 IP !底下我們就來聊一聊吧! ^_^ * * * ### 9.5.1 什么是 NAT? SNAT? DNAT? 在談到 NAT 的實際運作之前,讓我們再來看一下比較簡單的封包透過 iptables 而傳送到后端主機的表格與鏈流程(請往前參考[圖 9.3-4](#fig9.3-4))。 當網絡布線如[圖 9.1-2](#fig9.1-2)的架構,若內部 LAN 有任何一部主機想要傳送封包出去時, 那么這個封包要如何透過 Linux 主機而傳送出去?他是這樣的: 1. 先經過 NAT table 的 PREROUTING 鏈; 2. 經由路由判斷確定這個封包是要進入本機與否,若不進入本機,則下一步; 3. 再經過 Filter table 的 FORWARD 鏈; 4. 通過 NAT table 的 POSTROUTING 鏈,最后傳送出去。 NAT 服務器的重點就在于上面流程的第 1,4 步驟,也就是 NAT table 的兩條重要的鏈:PREROUTING 與 POSTROUTING。 那這兩條鏈有什么重要的功能呢?重點在于修改 IP 嘛!但是這兩條鏈修改的 IP 是不一樣的! POSTROUTING 在修改來源 IP ,PREROUTING 則在修改目標 IP 。 由于修改的 IP 不一樣,所以就稱為來源 NAT (Source NAT, SNAT) 及目標 NAT (Destination NAT, DNAT)。我們先來談一談 IP 分享器功能的 SNAT 吧! * 來源 NAT, SNAT:修改封包表頭的『來源』項目 你應該有聽說過 IP 分享器這個玩意兒,他可以讓你家庭里的好幾部主機同時透過一條 ADSL 網絡聯機到 Internet 上面, 例如[圖 9.1-2](#fig9.1-2)聯機的方式來說,那個 Linux 主機就是 IP 分享器啦!那么他是如何達到 IP 分享的功能?就是透過 NAT 表格的 POSTROUTING 來處理的。假設你的網絡布線如[圖 9.1-2](#fig9.1-2)所示, 那么 NAT 服務器是如何處理這個封包的呢? ![](https://box.kancloud.cn/2016-05-13_5735da5294f64.png) 圖 9.5-1、SNAT 封包傳送出去的示意圖 如上圖所示,在客戶端 192.168.1.100 這部主機要聯機到 http://tw.yahoo.com 去時,他的封包表頭會如何變化? 1. 客戶端所發出的封包表頭中,來源會是 192.168.1.100 ,然后傳送到 NAT 這部主機; 2. NAT 這部主機的內部接口 (192.168.1.2) 接收到這個封包后,會主動分析表頭數據, 因為表頭數據顯示目的并非 Linux 本機,所以開始經過路由, 將此封包轉到可以連接到 Internet 的 Public IP 處; 3. 由于 private IP 與 public IP 不能互通,所以 Linux 主機透過 iptables 的 NAT table 內的 Postrouting 鏈將封包表頭的來源偽裝成為 Linux 的 Public IP ,并且將兩個不同來源 (192.168.1.100 及 public IP) 的封包對應寫入暫存內存當中, 然后將此封包傳送出去了; 此時 Internet 上面看到這個封包時,都只會知道這個封包來自那個 Public IP 而不知道其實是來自內部啦。 好了,那么如果 Internet 回傳封包呢?又會怎么作? ![](https://box.kancloud.cn/2016-05-13_5735da53074ac.png) 圖 9.5-2、SNAT 封包接收的示意圖 1. 在 Internet 上面的主機接到這個封包時,會將響應數據傳送給那個 Public IP 的主機; 2. 當 Linux NAT 服務器收到來自 Internet 的回應封包后,會分析該封包的序號,并比對剛剛記錄到內存當中的數據, 由于發現該封包為后端主機之前傳送出去的,因此在 NAT Prerouting 鏈中,會將目標 IP 修改成為后端主機,亦即那部 192.168.1.100,然后發現目標已經不是本機 (public IP), 所以開始透過路由分析封包流向; 3. 封包會傳送到 192.168.1.2 這個內部接口,然后再傳送到最終目標 192.168.1.100 機器上去! 經過這個流程,你就可以發現到,所有內部 LAN 的主機都可以透過這部 NAT 服務器聯機出去, 而大家在 Internet 上面看到的都是同一個 IP (就是 NAT 那部主機的 public IP 啦!), 所以,如果內部 LAN 主機沒有連上不明網站的話,那么內部主機其實是具有一定程度的安全性的啦! 因為 Internet 上的其他主機沒有辦法主動攻擊你的 LAN 內的 PC 嘛!所以我們才會說, NAT 最簡單的功能就是類似 IP 分享器啦!那也是 SNAT 的一種。 **Tips:** NAT 服務器與路由器有啥不同?基本上,NAT 服務器一定是路由器,不過, NAT 服務器由于會修改 IP 表頭數據, 因此與單純轉遞封包的路由器不同。最常見的 IP 分享器就是一個路由器,但是這個 IP 分享器一定會有一個 Public IP 與一個 Private IP,讓 LAN 內的 Private IP 可以透過 IP 分享器的 Public IP 傳送出去喔! 至于路由器通常兩邊都是 Public IP 或同時為 Private IP。 ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) * 目標 NAT, DNAT:修改封包表頭的『目標』項目 SNAT 主要是應付內部 LAN 連接到 Internet 的使用方式,至于 DNAT 則主要用在內部主機想要架設可以讓 Internet 存取的服務器啦! 就有點類似[圖 9.1-4](#fig9.1-4)的 DMZ 內的服務器啊!底下也先來談一談 DNAT 的運作吧! ![](https://box.kancloud.cn/2016-05-13_5735da54666b6.png) 圖 9.5-3、DNAT 的封包傳送示意圖 如上圖所示,假設我的內部主機 192.168.1.210 啟動了 WWW 服務,這個服務的 port 開啟在 port 80 , 那么 Internet 上面的主機 (61.xx.xx.xx) 要如何連接到我的內部服務器呢?當然啦, 還是得要透過 Linux NAT 服務器嘛!所以這部 Internet 上面的機器必須要連接到我們的 NAT 的 public IP 才行。 1. 外部主機想要連接到目的端的 WWW 服務,則必須要連接到我們的 NAT 服務器上頭; 2. 我們的 NAT 服務器已經設定好要分析出 port 80 的封包,所以當 NAT 服務器接到這個封包后, 會將目標 IP 由 public IP 改成 192.168.1.210 ,且將該封包相關信息記錄下來,等待內部服務器的響應; 3. 上述的封包在經過路由后,來到 private 接口處,然后透過內部的 LAN 傳送到 192.168.1.210 上頭! 4. 192.186.1.210 會響應數據給 61.xx.xx.xx ,這個回應當然會傳送到 192.168.1.2 上頭去; 5. 經過路由判斷后,來到 NAT Postrouting 的鏈,然后透過剛剛第二步驟的記錄,將來源 IP 由 192.168.1.210 改為 public IP 后,就可以傳送出去了! 其實整個步驟幾乎就等于 SNAT 的反向傳送哩!這就是 DNAT 啰!很簡單吧! * * * ### 9.5.2 最陽春 NAT 服務器: IP 分享功能 在 Linux 的 NAT 服務器服務當中,最常見的就是類似[圖 9.1-2](#fig9.1-2)的 IP 分享器功能了。 而由剛剛的介紹你也該知道,這個 IP 分享器的功能其實就是 SNAT 啦!作用就只是在 iptables 內的 NAT 表格當中,那個路由后的 POSTROUTING 鏈進行 IP 的偽裝就是了。另外, 你也必須要了解,你的 NAT 服務器必須要有一個 public IP 接口,以及一個內部 LAN 連接的 private IP 界面才行。底下的范例中,鳥哥的假設是這樣的: * 外部接口使用 eth0 ,這個接口具有 public IP 喔; * 內部接口使用 eth1 ,假設這個 IP 為 192.168.100.254 ; 記住!當你利用前面幾章談到的數據來設定你的網絡參數后,務必要進行路由的檢測, 因為在 NAT 服務器的設定方面,最容易出錯的地方就是路由了!尤其是在撥接產生 ppp0 這個對外接口的環境下, 這個問題最嚴重。反正你要記得:『如果你的 public IP 取得的方式是撥接或 cable modem 時,你的配置文件 /etc/sysconfig/network, ifcfg-eth0, ifcfg-eth1 等檔案,千萬不要設定 GATEWAY 啦!』否則就會出現兩個 default gateway ,反而會造成問題。 如果你剛剛已經下載了 [iptables.rule](#iptables.rule) ,那么該檔案內已經含有 NAT 的腳本了! 你可以看到該檔案的[第二部份關于 NAT 服務器的部分](#script_part2),應該有看到底下這幾行: ``` iptables -A INPUT -i $INIF -j ACCEPT # 這一行為非必要的,主要的目的是讓內網 LAN 能夠完全的使用 NAT 服務器資源。 # 其中 $INIF 在本例中為 eth1 接口 echo "1" &gt; /proc/sys/net/ipv4/ip_forward # 上頭這一行則是在讓你的 Linux 具有 router 的能力 iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE # 這一行最關鍵!就是加入 nat table 封包偽裝!本例中 $innet 是 192.168.100.0/24 # 而 $EXTIF 則是對外界面,本例中為 eth0 ``` 重點在那個『 MASQUERADE 』!這個設定值就是『 IP 偽裝成為封包出去 (-o) 的那塊裝置上的 IP 』!以上面的例子來說,就是 $EXTIF ,也就是 eth0 啦! 所以封包來源只要來自 $innet (也就是內部 LAN 的其他主機) ,只要該封包可透過 eth0 傳送出去, 那就會自動的修改 IP 的來源表頭成為 eth0 的 public IP 啦!就這么簡單! 你只要將 [iptables.rule](#iptables.rule) 下載后,并設定好你的內、外網絡接口, 執行 iptables.rule 后,你的 Linux 就擁有主機防火墻以及 NAT 服務器的功能了! 例題:如同上面所述的案例,那么你的 LAN 內的其他 PC 應該要如何設定相關的網絡參數?答:答案其實很簡單啊,將 NAT 服務器作為 PC 的 GATEWAY 即可!只要記得底下的參數值: * NETWORK 為 192.168.100.0 * NETMASK 為 255.255.255.0 * BROADCAST 為 192.168.100.255 * IP 可以設定 192.168.100.1 ~ 192.168.100.254 間,不可重復! * 通訊閘 (Gateway) 需要設定為 192.168.100.254 (NAT 服務器的 Private IP) * DNS (/etc/resolv.conf) 需設定為 168.95.1.1 (Hinet) 或 139.175.10.20 (Seed Net),這個請依你的 ISP 而定; 事實上,除了 IP 偽裝 (MASQUERADE) 之外,我們還可以直接指定修改 IP 封包表頭的來源 IP 呢! 舉例來說,如下面這個例子: 例題:假設對外的 IP 固定為 192.168.1.100 ,若不想使用偽裝,該如何處理?答: ``` iptables -t nat -A POSTROUTING -o eth0 -j SNAT \ --to-source 192.168.1.100 ``` 例題:假設你的 NAT 服務器對外 IP 有好幾個,那你想要輪流使用不同的 IP 時,又該如何設定?舉例來說,你的 IP 范圍為 192.168.1.210~192.168.1.220答: ``` iptables -t nat -A POSTROUTING -o eth0 -j SNAT \ --to-source 192.168.1.210-192.168.1.220 ``` 這樣也可以修改網絡封包的來源 IP 資料喔!不過,除非你使用的是固定 IP ,且有多個 IP 可以對外聯機,否則一般使用 IP 偽裝即可,不需要使用到這個 SNAT 啦!當然,你也可能有自己的獨特的環境啦! ^_^ * * * ### 9.5.3 iptables 的額外核心模塊功能 如果你剛剛在 [iptables.rule](#iptables.rule) 內的[第二部分](#script_part2)有仔細看的話, 那有沒有覺得很奇怪,為何我們需要加載一些有用的模塊?舉例來說, ip_nat_ftp 及 ip_nat_irc ? 這是因為很多通訊協議使用的封包傳輸比較特殊,尤其是 FTP 文件傳輸使用到兩個 port 來處理數據! 這個部分我們會在 FTP 章節再來詳談,在這里你要先知道,我們的 iptables 提供很多好用的模塊, 這些模塊可以輔助封包的過濾用途,讓我們可以節省很多 iptables 的規則擬定,好棒的吶! ^_^ * * * ### 9.5.4 在防火墻后端之網絡服務器 DNAT 設定 既然可以做 SNAT 的 IP 分享功能,我們當然可以使用 iptables 做出 DMZ 啦! 但是再次重申,不同的服務器封包傳輸的方式可能有點差異,因此,建議新手不要玩這個咚咚! 否則很容易導致某些服務無法順利對 Internet 提供的問題。 先來談一談,如果我想要處理 DNAT 的功能時, iptables 要如何下達指令? 另外,你必須要知道的是, DNAT 用到的是 nat table 的 Prerouting 鏈喔!不要搞錯了。 例題:假設內網有部主機 IP 為 192.168.100.10 ,該主機是可對 Internet 開放的 WWW 服務器。你該如何透過 NAT 機制,將 WWW 封包傳到該主機上?答:假設 public IP 所在的接口為 eth0 ,那么你的規則就是: ``` iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \ -j DNAT --to-destination 192.168.100.10:80 ``` 那個『 -j DNAT --to-destination IP[:port] 』就是精髓啦!代表從 eth0 這個接口傳入的,且想要使用 port 80 的服務時, 將該封包重新傳導到 192.168.100.10:80 的 IP 及 port 上面!可以同時修改 IP 與 port 呢!真方便。 其他還有一些較進階的 iptables 使用方式,如下所示: ``` -j REDIRECT --to-ports &lt;port number&gt; # 這個也挺常見的,基本上,就是進行本機上面 port 的轉換就是了! # 不過,特別留意的是,這個動作僅能夠在 nat table 的 PREROUTING 以及 # OUTPUT 鏈上面實行而已喔! 范例:將要求與 80 聯機的封包轉遞到 8080 這個 port [root@www ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 \ &gt; -j REDIRECT --to-ports 8080 # 這玩意最容易在你使用了非正規的 port 來進行某些 well known 的協議, # 例如使用 8080 這個 port 來啟動 WWW ,但是別人都以 port 80 來聯機, # 所以,你就可以使用上面的方式來將對方對你主機的聯機傳遞到 8080 啰! ``` 至于更多的用途,那就有待你自己的發掘啰! ^_^ * * *
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看