将协议 41(6to4)转发到 Linux 机器?

将协议 41(6to4)转发到 Linux 机器?

我有一个没有 ipv6 堆栈的 Linux 路由器和一个位于 NAT 内的 Linux 主机。如何使用 iptables 在 NAT 路由器和主机之间来回转发 6to4 流量,然后使用路由器的公共 IPv4 地址在主机上配置 6to4 隧道?

此配方(在路由器上)会向主机的 eth0 发送 ipv6 ping,但无法进入 tun6to4 接口。Wireshark 会将“ICMP 目标无法访问(端口无法访问)”作为对 6to4 ping 的 ipv4 响应。

# inbound destination NAT for IPv6 tunnel. ppp0 is router's WAN interface.
iptables -t nat -A PREROUTING -i ppp0 -p 41 -j DNAT --to 192.168.1.100
# inbound forwarding for IPv6 tunnel
iptables -t filter -A FORWARD -i ppp0 -p 41 -d 192.168.1.100 -j ACCEPT

我在 Linux 主机上使用这个脚本,传递路由器的公共 IP:

#!/bin/bash

### Get the global IPv4 address for your host from the command line:
GLOB_IP4=$1

### Compute the 6TO4 tunnel IPv6 address:
GLOB_IP6TO4=$(printf "2002:%02x%02x:%02x%02x::1" $(echo $GLOB_IP4 | tr . ' '))

### Setup the tunnel
ip tunnel add tun6to4 mode sit remote any local $GLOB_IP4 ttl 64
ip link set dev tun6to4 up
ip addr add $GLOB_IP6TO4/16 dev tun6to4
ip route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1

答案1

iptables -t nat -A PREROUTING -d 192.0.2.75 -p 41 -j DNAT --to 10.0.0.2假设所有流量都是从外部发起到您的 IP 地址(如本例所示),那么路由器上的规则应该可以解决问题192.0.2.75。如果您的支持 IPv6 的盒子启动了,那么常规的 catch-all SNAT 规则应该可以解决问题。

答案2

秘密武器

我认为本地隧道地址会影响 6to4 封装,并且必须是我的全局 IPv4 地址。

ip tunnel add tun6to4 mode sit remote any local $GLOB_IP4 ttl 64

它必须是主机的地址,在我的情况下是 192.168.1.100。其他一切保持不变,它就可以正常工作!

相关内容