如何使用本地链路IPv6实现SSH访问?
如何使用本地链路IPv6实现SSH访问?
我完全懂你的困扰——明明本地链路IPv6是永久有效的,用来局域网SSH访问本该比临时公网IPv6更省心,结果却连ping都不通,还改了一堆配置越搞越头大对吧?咱们一步步来排查解决:
第一步:先确认Ubuntu端的基础配置是否正确
首先得确保Ubuntu的本地链路IPv6地址正常,而且SSH服务确实在监听IPv6:
- 查看网卡的IPv6地址,执行命令:
找到开头为ip -6 addr show wlp4s0 # 这里替换成你的实际网卡名,比如wlp4sfe80:的本地链路地址,确认它是基于MAC生成的EUI-64格式(正常情况下应该是这样,你之前设置了addr-gen-mode=eui64)。 - 检查SSH服务是否监听IPv6端口:
如果输出里看不到ss -tulpn | grep ssh:::22或者包含fe80的条目,说明SSH只监听了IPv4。这时候需要编辑/etc/ssh/sshd_config文件:- 找到
AddressFamily选项,改成AddressFamily any;或者添加ListenAddress :: - 保存后重启SSH服务:
sudo systemctl restart sshd
- 找到
第二步:检查Ubuntu防火墙是否放行IPv6的SSH流量
很多时候连不上都是防火墙挡了,尤其是IPv6的规则容易被忽略:
- 先查看UFW防火墙状态:
如果看不到sudo ufw statusssh (v6)相关的允许规则,执行命令放行:sudo ufw allow ssh/ipv6 sudo ufw reload
第三步:修正Windows端的接口指定方式
你之前用的是接口编号%14,有时候编号会变动,试试用接口名称代替更靠谱:
- 在Windows里,先确认当前Wi-Fi的接口名称(比如“Wi-Fi”),可以通过「设置-网络和Internet-Wi-Fi」查看,或者执行命令:
netsh interface ipv6 show interfaces - 然后把SSH命令改成:
比如:ssh -6 <你的Ubuntu用户名>@<fe80开头的本地链路地址>%Wi-Fi -p <你的SSH端口>ssh -6 john@fe80::abcd:1234:wxyz:5678%Wi-Fi -p 22
第四步:排查IPv6路由和配置冲突(重点!你之前改了很多隐私配置)
你之前调整了nmcli、sysctl、netplan的多个IPv6设置,很可能导致配置冲突或者路由异常:
- 先修正sysctl里的
accept_ra设置:编辑/etc/sysctl.d/10-ipv6-privacy.conf,把net.ipv6.conf.<你的网卡名>.accept_ra = 0改成1,然后执行:
因为本地链路的路由依赖路由器通告,关闭sudo sysctl -p /etc/sysctl.d/10-ipv6-privacy.confaccept_ra会导致路由失效。 - 统一网络配置管理:你同时改了netplan和NetworkManager的配置,容易冲突。建议把netplan配置文件里对应无线网卡的部分注释掉,然后执行:
sudo netplan generate && sudo netplan apply sudo systemctl restart NetworkManager - 确认本地链路路由存在:执行
ip -6 route,应该能看到类似fe80::/64 dev wlp4s0 proto kernel metric 100的条目,没有的话重启网卡试试:sudo nmcli connection down <你的网络名> && sudo nmcli connection up <你的网络名>
第五步:测试连通性
先从ping开始排查:
- 在Windows端执行:
ping -6 <Ubuntu的fe80地址>%Wi-Fi,如果能通再试SSH; - 如果还是不通,在Ubuntu上ping自己的本地链路地址,再ping Windows的本地链路地址(Windows用
ipconfig找fe80开头的地址),双向测试定位问题点。
备注:内容来源于stack exchange,提问作者hamagust




