使用 iptables 建立 1:1 NAT

使用 iptables 建立 1:1 NAT

我正在嘗試了解一些關於 Linux 中 NAT 轉換的知識,但我還沒有看到任何可以歸結為盡可能基本的概念驗證。

反正。這是我的設定圖:

具有兩個子網的簡單網絡

我有一個非常基本的網路路由器。它基本上只能做兩件事:

  • 連接到網際網路。
  • 單獨分發 1 個子網路上的 IP 位址。

不能根本不做靜態路由。

……而且它甚至不知道 IPv6 位址是什麼樣的! (別開玩笑!)

我想要的是能夠連接到互聯網Raspberry 3,但也能夠連接My ComputerRaspberry 3其他子網路上的任何其他設備。

這給了我在我的 上實現 1:1 NAT 的想法Raspberry 4,其中 192.168.10.x/24 範圍內的所有 IP 位址都會轉換為 192.168.1.x/24 範圍。

這樣,至少從我的路由器的角度來看,網路上的所有主機都屬於同一子網,因為 192.168.0.0/23 的位址池是從 192.168.0.0 到 192.168.1.255。

但該怎麼辦呢?

只需在樹莓派 4 上的 iptables 中加入兩條規則就足夠了,例如:

iptables -t nat -A PREROUTING -d 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

或者我需要更明確地了解 ip 套件的方向嗎?

更新:

為了幫助排除故障,我可以告知 Raspberry 4 充當我的兩個子網路的 DHCP 伺服器。

當在任一網路上從任何電腦到網際網路進行追蹤路由時,它會將自己通告為第一跳。

My computer假設 Google 的追蹤路由會顯示以下內容:

  • 1:樹莓4
  • 2:原始路由器
  • 3:ISP網關
  • 4:...
  • n: 谷歌.com

然而,從我的 .traceroute 完成後,traceroute 會變壞Raspberry 3

第一個跳轉將是Raspberry 4,所以沒有什麼奇怪的,但路由不會在 ping 上給出答复,因為它不知道如何到達 192.168.10.0/24 子網路。

供您參考,我Raspberry 4已經充當了站點2 站點VPN 用戶端,因此如果所有其他操作都失敗,那麼我可以執行基於來源的路由並透過我的VPN 連接發送所有流量,儘管速度會受到顯著的損失(大約70% 的速度)降低)。

更新2:

Raspberry 4 的輸出:

# ip rule show

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

# ip route show table main

default via 192.168.0.1 dev eth0 src 192.168.0.136 metric 202
192.168.0.0/23 dev eth0 proto dhcp scope link src 192.168.0.136 metric 202
192.168.100.0/24 dev tun-ipv6 proto kernel scope link src 192.168.100.10
  • 路由器位於 192.168.0.1。
  • 子網路 192.168.100.0/24 在我的 VPN 內。

這部分工作正常,因為我無意透過我的 VPN 發送所有流量。

對我來說,建立一個新的路由表以透過 VPN 從 192.168.10.0/24 重定向是微不足道的,因為我之前已經做過一次這種特殊的技巧,以便在本地 LAN 上使用 IPv6。 :-)

然而 Tom Yan 的解決方案看起來很符合我的目標,特別是他關於「AnyIP」的暗示。 :-)

我需要做一些測試,但我會接受他的回答。 :-)

答案1

首先,源NAT應該是:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24

POSTROUTING-s火柴)

目標 NAT 應該是:

iptables -t nat -A PREROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

PREROUTING-d火柴)

注意:據我所知,只有「新」流量(來自 LAN 內)才需要目標 NAT 規則。來源 NAT 規則對於回傳流量來說足夠了,因為其中任何一個的目標 NAT 都是由它「隱含」的。

但接下來的問題是:如何My Computer知道(「實際上」 )Primitive Router的流量應該進行進一步的路由?192.168.1.0/24192.168.10.0/24Raspberry Pi 4

答案是,您需要Raspberry Pi 4回應 ARP 請求192.168.1.0/24

實現這一目標的方法之一是建立一個名為「AnyIP」的東西(至少這是我聽說過的術語)。本質上,這意味著添加以下類型的子網路local路由192.168.1.0/24

ip r add local 192.168.1.0/24 dev eth0

注意:我不太記得這是否適用於arp_ignoresysctl 設定為 eg 的情況1

確保您使用 sysctl 啟用了 IP(v4) 轉發,並且沒有防火牆阻止Raspberry Pi 4轉發您想要的流量(根據規則或鏈策略)。

答案2

我正在嘗試了解一些關於 Linux 中 NAT 轉換的知識,但我還沒有看到任何可以歸結為盡可能基本的概念驗證。

這是我在桌上型電腦上使用的盡可能基本的腳本,當我透過 LAN 將另一台裝置連接到它時,它會「共享網路」:

#!/bin/bash

# masquerade $1 (e.g. eth0, ppp0) as $2 (default wlan0)

INTIF="$1"
EXTIF=${2:-wlan0}

echo $INTIF $EXTIF

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

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -t nat -F
iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

您需要使用「內部」介面(具有需要 NAT 的用戶端的網路)和「外部」介面(面向網際網路)來呼叫它。不包括內部介面和 DHCP 等的設定(您只是詢問 NAT)。

這給了我在 Raspberry 4 上實現 1:1 NAT 的想法,其中 192.168.10.x/24 範圍內的所有 IP 位址都會轉換為 192.168.1.x/24 範圍。

這比「基本 NAT」困難得多。

但您不必這樣做,事實上,它不能很好地與您的原始路由器/Raspberry Pi 4 組合配合使用。相反,只需在 Raspberry Pi 4 上執行基本 NAT。

(在現實生活中,您只需連接兩個交換機,並從您的路由器提供一個子網路。順便說一句,如果您的原始路由器可以使用 OpenWRT 等重新刷新,它也將能夠做到,好吧,路由)。

答案3

不,僅添加 NAT 規則是不夠的。因為本地網路(廣播網段)上的 IPv4 主機的發現是使用 ARP 進行的。 ARP 的廣播流量不會穿過您的內部 NAT 盒,NAT 盒也不會回應。為了讓它響應你的需要proxy_arp

然而,目前尚不清楚這種設​​定會實現什麼目的。只需將所有內容放在一個網路中或添加到 PC(而不是路由器)的路由,然後僅偽裝到外部路由器。

相關內容