
我正在嘗試了解一些關於 Linux 中 NAT 轉換的知識,但我還沒有看到任何可以歸結為盡可能基本的概念驗證。
反正。這是我的設定圖:
我有一個非常基本的網路路由器。它基本上只能做兩件事:
- 連接到網際網路。
- 單獨分發 1 個子網路上的 IP 位址。
它不能根本不做靜態路由。
……而且它甚至不知道 IPv6 位址是什麼樣的! (別開玩笑!)
我想要的是能夠連接到互聯網Raspberry 3
,但也能夠連接My Computer
到Raspberry 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/24
192.168.10.0/24
Raspberry 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_ignore
sysctl 設定為 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(而不是路由器)的路由,然後僅偽裝到外部路由器。