Linux

高級 NAT - 將 PAT 與 NAT 混合使用

  • September 16, 2013

我剛剛將 Ubuntu 伺服器配置為具有 NAT/PAT 的路由器,並且我正在嘗試執行以下操作:

我為一所學校工作,該學校將其網路劃分為由路由器連接的較小網路。我需要在一個房間的內部網路上創建一個可見的 IP 地址,它將所有流量轉發到外部 IP 地址。

解釋一下,這是配置:

NAT 外部:eth1 - 192.168.1.254/24

NAT inside:br0 - 192.168.2.10,啟用偽裝

我需要為 br0 創建一個類似 192.168.2.1 的地址,它將所有流量轉發到 ip 192.168.1.1,並且看起來好像該 IP 直接連接到網路,但不會啟用偽裝.

基本構想是將路由器的br0地址設置為192.168.2.10,同時br0設置另一個不偽裝的地址,將所有流量轉發到192.168.1.1,也就是主路由器的地址。這樣做的原因是 br0 是物理網路和 VPN 之間的橋樑,可以從路由器後面訪問,該路由器的地址與目標 NAT IP 地址相同 - 192.168.1.1。因為我不能保證客戶總是可以發出“路由添加”命令,所以我需要一種方法來規避這個問題。

我發現瞭如何為 br0 配置輔助 IP 地址,並且我已將 br0:1 配置為 192.168.2.1,但我似乎無法將所有流量轉發到 192.168.1.1。

我提前感謝您的幫助。

如果我對您的理解正確,您正在嘗試做的實際上是一種涉及一些 NAT 的策略路由形式。聽起來您只是想為該子網上的特定路由子網之外的某個主機創建別名。

您可以在沒有相應 SNAT(或偽裝)的情況下創建 DNAT 規則。沒有這樣做的原因僅僅是大多數 NAT 旨在解決連接問題,即 NAT“內部”的地址無法從“外部”路由。如果事實上主機 192.168.1.1 有一條回到 192.168.2.0/24 或其他任何地方的路由,如果我記得的話,你確實可以設置一個 DNAT 規則:

iptables -t nat -A PREROUTING -s 192.168.2.0/24 -d 192.168.2.1 -j DNAT --to 192.168.1.1

現在,停下來,暫時不要這樣做。

這在 192.168.2.1 是目標地址時有效(並產生了一個奇怪的怪癖,即回复流量的地址與原始目標不同)。根據您的描述,我認為這不是您想要做的,儘管老實說我不確定。如果 192.168.2.1 主機應該充當路由器而不是目的地,那麼執行 DNAT 將毫無幫助。如果它應該充當路由器,NAT(或 PAT)將毫無幫助。

聽起來你有 VPN 流量進來,如果我沒看錯的話,最終會橋接到這個子網 192.168.2.0/24它通過這個網關 192.168.1.1。在這種情況下,要做的就是簡單地將 192.168.2.1/24(我想您已將其設置為 VPN 客戶端上的預設網關)分配給您的路由器,確保已啟用轉發,一切順利 - VPN 客戶端無需擔心下一跳是 192.168.1.1,就像它們原來的預設非 VPN 網關(家庭網關?)一樣;當數據包傳輸時,他們完全沒有意識到這一點。ISP 一直使用這種帶有 RFC1918 地址的方案,以避免浪費意外稀缺的可路由地址;並不要求路徑上的所有路由器都具有唯一的地址(儘管它們確實具有,它使故障排除變得容易得多)。這裡的技巧是 TCP 連接的端點除了下一跳的 IP 地址之外不需要知道任何東西。

如果您已經在執行此操作並且遇到問題,請檢查返迴路徑。很有可能您在 192.168.1.1 的網關在將它們的流量發送到您的 NAT 之外時沒有對這些地址進行 NAT(它仍將顯示為 192.168.2.0/24),正在為它們設置防火牆,或者沒有適當的路由返回到 192.168.2.0/24。

如果我在這兩個方面都誤解了您的意圖,那麼第三件事可能會對您有所幫助。在 iptables 中指定網關的唯一方法是使用 TEE 目標,它複製數據包並將複製原封不動地路由到某個任意主機。不過,您需要以某種方式處理未複製的數據包。該目標可以添加到 mangle PREROUTING 鏈中:

iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -j TEE --gateway 192.168.1.1

這是一件很奇怪的事情。這是為記錄流量而設計的,而不是路由它。我想你可以在 iptables 的某個後期階段處理原始數據包,儘管這只是一團糟,我真的不推薦它。

ip addr add作為一個隨機點,您可以使用該命令向介面添加額外的 IP 地址。不要使用網路工具(ifconfig);它很古老並且缺少許多功能,從長遠來看只會讓您頭疼。

引用自:https://serverfault.com/questions/538594