![在路由 IPv6 的同时对 IPv4 进行 NAT](https://linux22.com/image/587776/%E5%9C%A8%E8%B7%AF%E7%94%B1%20IPv6%20%E7%9A%84%E5%90%8C%E6%97%B6%E5%AF%B9%20IPv4%20%E8%BF%9B%E8%A1%8C%20NAT.png)
我有以下设置:
client(s) <---> (eth0) router (eth1) <---> wan
我有一个静态 IPv4 地址和一个 /48 IPv6 地址块。我需要将所有客户端连接到 (wan)。每个客户端都有自己的公共 IPv6。同时,我需要将这些相同的客户端通过 NAT 转移到 (wan)。
所有与 IPv4 相关的东西和 NAT 都运行良好。往返于 (eth0)<->(clients)> 的 IPv6 通信运行良好,往返于 (eth1)<->(wan) 的 IPv6 通信也运行良好。
为了向所有客户提供 IPv6,我考虑了两个选择:
将路由器作为网关,每个接口上的 IP 不同。这听起来像是我需要告诉我的 ISP 通过该单个 IP 路由整个块,所以这实际上不是一个选择。
透明地将 IPv6 数据包传递到/从 eth0<->eth1,以便所有客户端都可以与上游网关通信(如果不是因为需要保持 IPv4 兼容,我实际上会在这里有一个交换机)。
因此,由于我选择了第二种选择,所以我很怀疑:如何将所有 IPv6 流量从 eth0 透明地传递到 eth1?我需要的是 3 级桥接,但 linux 的 bridgeutils 创建了 2 级桥接(它也会桥接 ipv4,而我无法拥有它)。
这是一个 DD-WRT 设备,但它几乎是一个嵌入式 Linux,因此欢迎大多数适用于 Linux 的建议。
谢谢。
答案1
你可以用代理 ARP 来实现这一点,如果我试图伪桥接 ipv4,我会这样做:
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp
echo 1 > /proc/sys/net/ipv4/ip_forward
您需要使用完全相同的信息(ip_address、netmask 和 gateway)设置两个 NIC,不确定 DD-WRT 是否允许这样做,当然它不会在 Web UI 上进行,但它可能允许您从控制台执行此操作,然后重新检查您的网关,确保您只有指向 ISP 接口的网关,如下所示:
ip route del default dev eth0
ip route del default dev eth1
ip route del $LAN_NETWORK dev eth0
ip route del $LAN_NETWORK dev eth1
ip route add $DEFAULT_GATEWAY dev eth0
ip route add $LAN_NETWORK dev eth1
ip route add default via $DEFAULT_GATEWAY dev eth0
这是使用代理 ARP 的 IPv4 伪桥,我想您可以使用 IPv6 执行相同的操作。
另一方面,正如我在另一个问题中所说的那样,即使它在第 2 层桥接,您仍然可以 NAT IPv4。
您需要在 BR0 接口上设置 IPv4 公网地址和 IPv4 局域网地址,然后按照我之前说的进行 NAT 处理
iptables -t nat -A POSTROUTING -j SNAT -s $LAN_NETWORK --to-source $WAN_IP_ADDRESS
这样可以解决你们两个的问题,而且无需代理 arp 的麻烦。问题是,这些功能中的大多数都无法通过 DD-WRT 界面运行。
作为一个更好、更简洁的替代方案,你可以在网桥上向 LAN 端添加一个子接口,例如
ifconfig br0:1 192.168.1.1 netmask 255.255.255.0
并使用我上面提到的相同 NAT 线路
答案2
您是否尝试对 ipv6 连接进行 NAT?如果是,那么 IPv6 NAT 的动机是什么?您确实有 /48 块,这已经足够了。
如果您的路由器支持 IPv6,那么只需设置正确的 IPv6 路由即可。IPv6 路由与 IPv4 是分开的,因此不会与您在 IPv4 上已有的路由发生冲突。