![将协议 41(6to4)转发到 Linux 机器?](https://linux22.com/image/499682/%E5%B0%86%E5%8D%8F%E8%AE%AE%2041%EF%BC%886to4%EF%BC%89%E8%BD%AC%E5%8F%91%E5%88%B0%20Linux%20%E6%9C%BA%E5%99%A8%EF%BC%9F.png)
我有一个没有 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。其他一切保持不变,它就可以正常工作!