使用 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。

但该如何做呢?

只需在 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/24192.168.10.0/24Raspberry Pi 4

答案是,你需要Raspberry Pi 4响应 的 ARP 请求192.168.1.0/24

实现此目的的方法之一是设置所谓的“AnyIP”(至少这是我听说过的术语)。本质上,这意味着添加以下类型的子网路local192.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 到外部路由器即可。

相关内容