wangyu- / tinyfecVPN

A VPN Designed for Lossy Links, with Build-in Forward Error Correction(FEC) Support. Improves your Network Quality on a High-latency Lossy Link.
MIT License
2.33k stars 459 forks source link

配置 ipv6 vpn 问题反馈 #69

Closed shNanChen closed 6 years ago

shNanChen commented 6 years ago

网络环境是ipv4+ipv6双栈运行,openwrt 18.06.01,bandwagonhost VPS tinyfecVPN 通过 ipv6 连接成功, 按 wiki ipv6 VPN advanced 手工给 tun 接口设置ipv6地址, ip -6 addr add 2607:8700:aabb:ccdd::128 dev tun200

设置后, ping6 2600:: ping6 2700:: 全都显示 ping6: sendto: Permission denied, 像是直接在把 2600::/7 网段给短路了?

Permission denied

 


另外,2个 ipv6 wiki 在我这 OPENVZ 的 VPS上都不能正常配置, wiki ipv6 inside vpn 配置,因为OPENVZ 的 VPS 内核太低,没有 ipv6 nat; wiki ipv6 VPN advanced 配置又没办法让路由下面的客户端用自己的ipv6地址翻墙, 最终我只能在 openwrt client side 配置 ipv6 nat。

wangyu- commented 6 years ago

环境按照wiki ipv6 VPN advanced 配置,经过测试:

ping6 2600::无问题:

[root@tplink-wdr4310:~]
$ ping6 2600::
PING 2600:: (2600::): 56 data bytes
64 bytes from 2600::: seq=0 ttl=50 time=309.170 ms
64 bytes from 2600::: seq=1 ttl=50 time=309.138 ms
64 bytes from 2600::: seq=2 ttl=50 time=309.425 ms

ping6 2700::ping不通,VPS上一样不通,应该是这个IP地址自己的问题。

全都显示 ping6: sendto: Permission denied, 像是直接在把 2600::/7 网段给短路了?

你自己用ip -6 route检查下是不是忘加路由表了。

另外,2个 ipv6 wiki 在我这 OPENVZ 的 VPS上都不能正常配置,

搬瓦工按照wiki ipv6 VPN advanced 可以正常配置。

wiki ipv6 VPN advanced 配置又没办法让路由下面的客户端用自己的ipv6地址翻墙, 最终我只能在 openwrt client side 配置 ipv6 nat。

教程本身是为电脑作为客户端写的,如果你想运行在路由器上并把ipv6分配给路由器后面的机器,需要自己在教程基础上做改动,ipv6 nat不是必须的。

shNanChen commented 6 years ago

ip -6 route 没有路由表就应该是timeout,而不是直接ping6: sendto: Permission denied ip -6 addr del 2607:8700:****:****:abcd::2/80 dev tun200 删除接口地址后就可以ping6了 也奇怪的是路由器下面的电脑ping6 2600::却一直是正常的,traceroute6 也一直是正常走的ISP的ipv6网络

root@WDR4310:~# ifconfig tun200
tun200    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:192.168.17.2  P-t-P:192.168.17.1  Mask:255.255.255.255
          inet6 addr: fe80::e293:****:****:3a42/64 Scope:Link
          inet6 addr: 2607:8700:****:****:abcd::2/80 Scope:Global
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:7042 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5710 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:2346366 (2.2 MiB)  TX bytes:1119438 (1.0 MiB)

root@WDR4310:~# ping6 2600::
PING 2600:: (2600::): 56 data bytes
ping6: sendto: Permission denied
root@WDR4310:~# 
root@WDR4310:~# ip -6 addr del 2607:8700:****:****:abcd::2/80 dev tun200
root@WDR4310:~# 
root@WDR4310:~# ping6 2600::
PING 2600:: (2600::): 56 data bytes
64 bytes from 2600::: seq=0 ttl=43 time=354.391 ms
64 bytes from 2600::: seq=1 ttl=43 time=354.762 ms
64 bytes from 2600::: seq=2 ttl=43 time=355.739 ms

如果没有ipv6 nat,纯 ipv6 路由,策略路由该如何绕过G*F*W呢, ipv4的透明代理很好用,国内直连,国外绕行,ipv6下咋实现呢?

wangyu- commented 6 years ago

ip -6 route 没有路由表就应该是timeout,而不是直接ping6: sendto: Permission denie

[root@tplink-wdr4310:~]
$ ping6 2600::
PING 2600:: (2600::): 56 data bytes
64 bytes from 2600::: seq=0 ttl=50 time=309.255 ms
64 bytes from 2600::: seq=1 ttl=50 time=308.635 ms
^C
--- 2600:: ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 308.635/308.945/309.255 ms

[root@tplink-wdr4310:~]
$ ip -6 route del default via fd48::1 dev tun100

[root@tplink-wdr4310:~]
$ ping6 2600::
PING 2600:: (2600::): 56 data bytes
ping6: sendto: Permission denied
shNanChen commented 6 years ago

这个,有点理解不了,默认路由本来就存在啊

root@WDR4310:~# ip -6 route 
default from 2409:8a1e:****:****::/64 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium
default from 2409:8a1e:****:****::/60 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium
2409:8a1e:****:****::/64 dev pppoe-cmcc1 proto static metric 256 pref medium
2409:8a1e:****:****::/64 dev br-lan proto static metric 1024 pref medium
unreachable 2409:8a1e:****:****::/60 dev lo proto static metric 2147483647 error -148 pref medium
2607:8700:****:****:abcd::/80 dev tun200 proto kernel metric 256 pref medium
2607:8700:****:****::/64 dev pppoe-cmcc1 metric 1024 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0.3 proto kernel metric 256 pref medium
fe80::/64 dev macvlan1 proto kernel metric 256 pref medium
fe80::/64 dev macvlan2 proto kernel metric 256 pref medium
fe80::/64 dev macvlan3 proto kernel metric 256 pref medium
fe80::/64 dev eth0.2 proto kernel metric 256 pref medium
fe80::/64 dev br-lan proto kernel metric 256 pref medium
fe80::/64 dev tun200 proto kernel metric 256 pref medium
fe80::/10 dev pppoe-cmcc1 metric 1 pref medium
fe80::/10 dev pppoe-cmcc1 proto kernel metric 256 pref medium
shNanChen commented 6 years ago

而且 traceroute6 2800:: 不存在Permission denied, 感觉在哪隐含了2600::/7 路由表不存在一样

root@WDR4310:~# traceroute6 2600::
traceroute6: can't connect to remote host: Permission denied
root@WDR4310:~# 
root@WDR4310:~# traceroute6 2700::
traceroute6: can't connect to remote host: Permission denied
root@WDR4310:~# 
root@WDR4310:~# traceroute6 2800::
traceroute to 2800:: (2800::), 30 hops max, 64 byte packets
 1  2409:8084:8000::5c (2409:8084:8000::5c)  3.365 ms  2.914 ms  2.728 ms
 2  2409:8084:8000:1::148 (2409:8084:8000:1::148)  2.550 ms  2.901 ms  3.009 ms
 3  2409:8080:0:2:204:272:: (2409:8080:0:2:204:272::)  3.271 ms  5.653 ms  3.647 ms
shNanChen commented 6 years ago

ip -6 route add 2600::/7 dev tun200 添加路由后,确实可以 ping6 2600:: 了, 感觉强行vpn啊

wangyu- commented 6 years ago

ip -6 route add 2600::/7 dev tun200 添加路由后,确实可以 ping6 2600:: 了, 感觉强行vpn啊

啥叫强行VPN

从你发的路邮表看,跟本就没执行过教程里的ip -6 route add default via 2001:19f0:aabb:ccdd::10这一步操作。你还是重新看一遍教程吧。

shNanChen commented 6 years ago

可能我没有说清楚, 我的最终目的是默认走本地isp的ipv6网络, 特定被屏蔽的ipv6地址才走tinyfecvpn,

目前遇到的情况是,tun接口一但配置2607:aaaa:bbbb:ffff::/64 等类似地址, 路由上 ping6 2600::/7 网段 网络就会Permission denied 删除接口地址后ping6 2600::/7 网段 就正常。

按路由表default规则,2600::/7 网段 都应该从本地isp路由出去呀? 或者我哪个地方理解错了?

除了2600::/7 网段,其它ipv6地址段都能被正常路由。

anyway,谢谢你的耐心回复。

wangyu- commented 6 years ago

目前遇到的情况是,tun接口一但配置2607:aaaa:bbbb:ffff::/64 等类似地址, 路由上 ping6 2600::/7 网段 网络就会Permission denied 删除接口地址后ping6 2600::/7 网段 就正常。

你观察一下添加ipv6地址前后ip -6 route输出有没有区别

再试一下ping6 -I <interface>强制指定接口是否能ping通

按路由表default规则,2600::/7 网段 都应该从本地isp路由出去呀? 或者我哪个地方理解错了?

我看不出来你这个路由表里的default是不是没问题的:

default from 2409:8a1e:****:****::/64 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium
default from 2409:8a1e:****:****::/60 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium
shNanChen commented 6 years ago

你观察一下添加ipv6地址前后ip -6 route输出有没有区别

这个是原始的 ip -6 route

root@WDR4310:~# ip -6 route
default from 2409:8a1e:****:****::/64 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium
default from 2409:8a1e:****:****::/60 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium
2409:8a1e:****:****::/64 dev pppoe-cmcc1 proto static metric 256 pref medium
2409:8a1e:****:****::/64 dev br-lan proto static metric 1024 pref medium
unreachable 2409:8a1e:****:*****::/60 dev lo proto static metric 2147483647 error -148 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0.3 proto kernel metric 256 pref medium
fe80::/64 dev macvlan1 proto kernel metric 256 pref medium
fe80::/64 dev macvlan2 proto kernel metric 256 pref medium
fe80::/64 dev macvlan3 proto kernel metric 256 pref medium
fe80::/64 dev eth0.2 proto kernel metric 256 pref medium
fe80::/64 dev br-lan proto kernel metric 256 pref medium
fe80::/10 dev pppoe-cmcc1 metric 1 pref medium
fe80::/10 dev pppoe-cmcc1 proto kernel metric 256 pref medium

tinyfecVPN 是ipv6连接服务器的 tinyvpn_mips24kc_be -c -r [2607:8700:****:****::]:3000 --sub-net 192.168.17.0 --tun-dev tun200

添加ipv6地址 ip -6 addr add 2607:8700:****:****:abcd::2/80 dev tun200 路由表会自动增加1条 2607:8700:****:****:abcd::/80 dev tun200 proto kernel metric 256 pref medium

此时ping6 服务端地址都Permission denied

root@WDR4310:~# ping6 2607:8700:****:****::
PING 2607:8700:****:****:: (2607:8700:****:****::): 56 data bytes
ping6: sendto: Permission denied

但奇怪的是tinyfecVPN sub-net 192.168.17.0 ipv4接口还能通

root@WDR4310:~# ping 192.168.17.1
PING 192.168.17.1 (192.168.17.1): 56 data bytes
64 bytes from 192.168.17.1: seq=0 ttl=64 time=285.916 ms
64 bytes from 192.168.17.1: seq=1 ttl=64 time=284.776 ms

1531462027757170 或许这还是可能和 路由表里的default 有些许关系, 但是Permission denied 仅发生在 路由器上, 路由器lan中的电脑都可以正常通讯,ping6 2600:: 从头到尾都能ping 通。

最后的办法就是ip -6 route add default dev pppoe-cmcc1

shNanChen commented 6 years ago

从这篇文章有所理解,Openwrt / LEDE路由器上的IPv6 NAT

default from 2409:8a1e:****:****::/64 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium
default from 2409:8a1e:****:****::/60 via fe80::769d:8fff:****:**** dev pppoe-cmcc1 proto static metric 512 pref medium

默认路由中的from限定,限制了只有源地址为 2409:8a1e:****:****::/60 的数据可以通过网关流出路由器, 为的是防止 fe80:: 的本地地址向外路由,限定fe80::只能在本地通讯。

ip -6 addr add 2607:8700:****:****:abcd::2/80 dev tun200 在接口获得2607:8700:****:****前缀地址后, 在 ping6 2600::/7 网段内地址时,系统会优先选用2607:8700:****:****:abcd::2做为源地址2607:8700:****:****:abcd::2源地址不存在任何路由表,就会发生Permission denied

于此同时,路由器lan中设备都是2409:8a1e:****:****::/60的源地址,都从默认路由走。

wangyu- commented 6 years ago

ip -6 addr add 2607:8700:::abcd::2/80 dev tun200 在接口获得2607:8700::前缀地址后, 在 ping6 2600::/7 网段内地址时,系统会优先选用2607:8700:::abcd::2做为源地址, 2607:8700:::abcd::2源地址不存在任何路由表,就会发生Permission denied

我之前也怀疑过这个,所以在前面建议再试一下ping6 -I <interface>强制指定接口是否能ping通,强制了pppoe接口后,ping会从ppoe接口上获得源ip。

在 ping6 2600::/7 网段内地址时,系统会优先选用2607:8700:::abcd::2做为源地址

题外话,你有没有试过用ping以外的其他程序去连接2600::/7这个地址,会不会提示Permission deniedno route to host。 ping底层是用raw socket实现的,在源ip选择上可能跟其他程序不一样。

shNanChen commented 6 years ago

题外话,你有没有试过用ping以外的其他程序去连接2600::/7这个地址

root@WDR4310:~# dig @2600:: google.com

; <<>> DiG 9.11.2-P1 <<>> @2600:: google.com
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached

tcpdump host 2600:: 抓不到任何数据包

lan的电脑dig @2600:: google.comtcpdump host 2600:: 是可以看到数据包的, 估计是一样的情况。