我正在尝试学习一些有关 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。
但该如何做呢?
只需在 raspberry 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:...
- ...
- 名词:Google.com
然而,当从我的 进行跟踪路由时,情况就变糟了Raspberry 3
。
第一次跳转将是Raspberry 4
,因此没有什么意外,但是路由不会对 ping 做出答复,因为它不知道如何到达 192.168.10.0/24 子网。
供您参考,我Raspberry 4
已经充当站点到站点的 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 重定向是小事一桩,因为我之前已经使用过这个技巧,以便在本地局域网上使用 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
火柴)
注意:据我所知,目标 NAT 规则仅适用于“新”流量(来自 LAN 内部)。源 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。这意味着 192.168.10.*/24 上的所有内容都将 NAT 到 192.168.0.0,路由器会很好地理解这一点。
(在现实生活中,您只需连接两个交换机,并从路由器获得一个子网。顺便说一句,如果您的原始路由器可以使用 OpenWRT 等重新刷新,那么它也能进行路由)。
答案3
不,添加 NAT 规则是不够的。因为本地网络(广播段)上的 IPv4 主机发现使用 ARP 进行。ARP 的广播流量不会穿过您的内部 NAT 盒,NAT 盒也不会响应。要使其响应,您需要proxy_arp
。
但是,这种设置能达到什么效果还不清楚。只需将所有东西放在一个网络中,或将路由添加到 PC(而不是路由器),然后仅将 MASQUERADE 到外部路由器即可。