ip6tables - IPv6 DNAT 到本地主机

ip6tables - IPv6 DNAT 到本地主机

我有以下 IPv4 规则:

  1. iptables -t nat -A PREROUTING -d "server ipv4" -p tcp -m tcp --dport 80 -i eth0 - j DNAT --to-destination 127.0.0.1:55555

  2. iptables -P INPUT ACCEPT

另外,我有一个简单的代理,监听地址localhost:127.0.0.1:55555

在 IPv4 中它运行良好。

当我尝试在 IPv6 中执行相同操作时:

  1. iptables -t nat -A PREROUTING -d "server ipv6 " -p tcp -m tcp --dport 80 -i eth0 -j DNAT --to-destination [::1]:55555

  2. ip6tables -P INPUT ACCEPT

我无法让它工作!

我能够让它工作:

  1. --to-destination ["link-local IPv6"]:55555
  2. --to-destination ["Server IPv6"]:55555

当我打开转发并在过滤表、转发链中添加一些日志行时。

  1. echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

  2. ip6tables -I FORWARD -j LOG --log-prefix='[filter FORWARD] '

我可以看到数据包。

[268332.372177] [过滤转发] IN=eth0 OUT=eth0 MAC=be:69:fd:2a:9e:bd:0a:08:f1:46:19:a1:86:df SRC= DST=0000:0000: 0000:0000:0000:0000:0000:0001 LEN=80 TC=0 HOPLIMIT=63 FLOWLBL=0 协议=TCP SPT=42082 DPT=55555 窗口=28800 RES=0x00 SYN URGP=0

我可以看到 OUT 接口是“eth0”而不是“lo”,内核认为该数据包不是用于该服务器的。

我有 centOS 7,我也在 Ubuntu 16 中尝试过这个。

答案1

我建议添加一个 fwmark 到你正在做的事情中,并添加一个 ip 规则来使用特殊的路由表。在该表中,您只需输入:route to dev lo。 dnat 将负责重写,fwmark 将负责到 lo 的路由,以便您的代理可以应答。

相关内容