Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wireguard内核监听的udp端口打洞失败 #1

Closed
kwxiaozhu opened this issue Oct 21, 2022 · 20 comments
Closed

wireguard内核监听的udp端口打洞失败 #1

kwxiaozhu opened this issue Oct 21, 2022 · 20 comments

Comments

@kwxiaozhu
Copy link

N2N 用户态的程序监听的udp端口可以用natmap打洞成功,但是wireguard内核监听的端口打洞失败。
image
看报错似乎是hev_reuse_port 失败

@heiher
Copy link
Owner

heiher commented Oct 21, 2022

内核监听的端口没有办法远程打开reuse port,使用防火墙的DNAT或natmap的应用层转发。

@heiher
Copy link
Owner

heiher commented Oct 21, 2022

或者试试先跑natmap打洞,然后再启动wireguard。

@kwxiaozhu
Copy link
Author

或者试试先跑natmap打洞,然后再启动wireguard。

不行,先打洞,再启动wireguard提示端口占用,启动不了,只能试试用户态的wireguard-go看看吧,再不行就只能用转发了

很好用的软件,我现在用的笨办法,通过调用脚本把IP和端口发到远程服务器,访问远程服务器获取IP和端口,再配置到应用里面,如果能有更好的办法就好了。

@heiher
Copy link
Owner

heiher commented Oct 21, 2022

或者试试先跑natmap打洞,然后再启动wireguard。

不行,先打洞,再启动wireguard提示端口占用,启动不了,只能试试用户态的wireguard-go看看吧,再不行就只能用转发了

优先用防火墙的端口转发(DNAT),几乎是零开销的,实在不行再用应用层转发。

很好用的软件,我现在用的笨办法,通过调用脚本把IP和端口发到远程服务器,访问远程服务器获取IP和端口,再配置到应用里面,如果能有更好的办法就好了。

我是使用域名通过DNS分发IP和端口的,脚本参数[3]给出了IP4P的值,在脚本中写到域名的AAAA记录里。客户端侧试试修改代码增加IP4P的支持(可参考 [1])。或者写个脚本启动器先解析域名得到AAAA地址再转换为IPv4和端口,启动客户端。

[1] https://github.com/heiher/hev-fsh/blob/master/src/hev-fsh-config.c#L433-L444

@kwxiaozhu
Copy link
Author

或者试试先跑natmap打洞,然后再启动wireguard。

不行,先打洞,再启动wireguard提示端口占用,启动不了,只能试试用户态的wireguard-go看看吧,再不行就只能用转发了

优先用防火墙的端口转发(DNAT),几乎是零开销的,实在不行再用应用层转发。

很好用的软件,我现在用的笨办法,通过调用脚本把IP和端口发到远程服务器,访问远程服务器获取IP和端口,再配置到应用里面,如果能有更好的办法就好了。

我是使用域名通过DNS分发IP和端口的,脚本参数[3]给出了IP4P的值,在脚本中写到域名的AAAA记录里。客户端侧试试修改代码增加IP4P的支持(可参考 [1])。或者写个脚本启动器先解析域名得到AAAA地址再转换为IPv4和端口,启动客户端。

[1] https://github.com/heiher/hev-fsh/blob/master/src/hev-fsh-config.c#L433-L444

谢谢回复,我现在在用手机端的wireguard客户端,暂时没有能力修改代码或写个前置的启动器解析域名获取IP和端口,先暂时这样用了,试用这几天只要PPPOE不断开重新拨号,IP和端口基本是固定的,设置一次可以用个几天

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

增加了IP4P地址格式支持的WireGuard Android客户端: https://github.com/heiher/wireguard-android/releases

在natmap的脚本中将UDP映射后的IP4P地址更新到DDNS域名的AAAA记录中后,使用这个WireGuard Android客户端,Peer地址写为 domain:0

@kwxiaozhu
Copy link
Author

增加了IP4P地址格式支持的WireGuard Android客户端: https://github.com/heiher/wireguard-android/releases

在natmap的脚本中将UDP映射后的IP4P地址更新到DDNS域名的AAAA记录中后,使用这个WireGuard Android客户端,Peer地址写为 domain:0

太6了!不过似乎有点小BUG,填写解析IP4P的DDNS域名:0 后,貌似解析的端口出错了,IPv4地址解析正确,端口解析为-48了,另外是否可以支持直接输入IP4P地址,方便调试,谢谢大佬!!!

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

哈哈,Java不合格,我改一下,把byte当成unsigned了。 😵‍💫

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

@kwxiaozhu
Copy link
Author

经过测试完全正常使用,感谢大佬极速的响应,这个工具又多了一个实用的方案👍因为无法打洞wireguard内核监听的端口,也就没法直接在软路由上部署wireguard,所以目前的方案是用pve开了个小虚拟机上跑wireguard设置好防火墙,再在软路由上用natmap打洞转发,测试正常,再次感谢大佬👍👍

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

感觉有更简便的方法:

方法一:软路由上端口50001跑内核监听的wireguard,端口50002跑natmap打洞(绑定模式),软路由上配置防火墙端口转发,把wan口上目的端口50002转至软路由lan口ip的50001。

方法二:软路由上端口50001跑内核监听的wireguard,端口50002跑natmap打洞(转发模式),并通过参数 -t 127.0.0.1 -p 50001,应用层转发。

方法一开销比方法二小,方法二不用配防火墙灵活。

@kwxiaozhu
Copy link
Author

确实,没想到这个办法,试试方法一,之前设置防火墙DNAT转发没成功,目前用的都是natmap应用层转发,再找找原因,感谢

@kwxiaozhu
Copy link
Author

发现一个尴尬的问题,我的目标是在任何有外网的环境下通过wireguard连回家,但是有些路由器的DNS服务器不支持解析AAAA记录,也就是说不能解析IP4P的域名了,并且一般支持解析IPV6域名的一般都支持IPV6通信,这样我不如直接用IPV6连接了。要解决可能需要直接查询支持AAAA的DNS服务器,不用系统默认DNS ,我看了您魔改的Wireguard客户端,要实现可能稍微有点麻烦,https://github.com/heiher/wireguard-android/blob/b14d7d9557cdd8a029a3419d5b2a4d50a77fdb6f/tunnel/src/main/java/com/wireguard/config/InetEndpoint.java#L100
final InetAddress[] candidates = InetAddress.getAllByName(host);
这里不用系统默认DNS解析,改成内置固定支持AAAA解析的DNS服务器解析,我不会JAVA,不知道实现起来麻烦不。

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

什么DNS不支持解析AAAA记录?我这无IPv6的环境也可以正常使用的,技术原理上解析AAAA记录也没有要求系统必须配置了IPv6。

@kwxiaozhu
Copy link
Author

是的,一些比较老的不支持IPV6的路由器,用路由器默认DNS比如192.168.1.1之类的,nslookup 解析不到AAAA的记录,我明天再找环境试试,刚才试了邻居的网络TL-WR886N路由器,不支持IPV6,DNS解析不到AAAA记录,可能环境比较小众,我再测试看看吧

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

好的,看看有没有自定义DNS的方法。目前明确公共DNS,比如114.114.114.114、223.5.5.5、8.8.8.8都是支持的。

@kwxiaozhu
Copy link
Author

可以了,刚才可能是手机有问题,VPN关掉重新打开可以了,可能是刚才连接失败后VPN的状态一直没变过来。不过确实有些路由器的DNS不支持解析AAAA,比如DNSMASQ就可以设置丢弃IPv6的解析记录,如果能自定义DNS就更好了,环境比较小众,如果麻烦就不用费劲了,感谢

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

运营商的4G、5G网络的DNS肯定是支持的;如果WIFI网络遇到不支持的,不如改一下网络连接里的DNS地址简单一些。

@kwxiaozhu
Copy link
Author

是的,我也发现了,如果用WiFi连不上,就切到流量连接后再开启WiFi就行了,这样更简单

@heiher
Copy link
Owner

heiher commented Oct 22, 2022

哈哈,机智~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants