设置
- Banana Pi m2U 运行 raspbian,(
uname -r
给出“3.10.108-BPI-M2U-Kernel”) - 在上述 bPi 上运行的 ssh 服务器(附有下面的 ssh 配置),监听端口 22,仅允许使用少数选定密钥进行公钥身份验证
- 运行 wsl2 的 Windows 10 笔记本电脑
Ubuntu 21.10
(并且 uname 给出5.10.16.3-microsoft-standard-WSL2
) - ISP 提供的路由器,bPi 的 22 端口转发到外部端口 2222
- duckdns 动态 dns,由 bPi 上的程序更新(据我所知,也执行 ipv4 和 ipv6)
什么有效/无效
我尝试过以下场景来连接到bPi:
- 从我的 WSL 实例连接到 bPi 的本地 ip 和端口 22 即可。
- 从我的 WSL 实例连接到路由器的公共 IP 或动态 DNS 和端口 2222不起作用,具体细节如下
- 从我的 Windows 实例(使用 powershell 或 putty 中的 ssh 命令)连接到公共 IP 或动态 DNS 地址和端口 2222不工作(挂起/超时)
- 从我的 Windows 实例(使用 powershell 或 putty 中的 ssh 命令)连接到本地 ip 和端口 22 确实有效
- 从我朋友的本地 Ubuntu 安装连接到公共 IP 或动态 DNS 和端口 2222 是可行的。
- 从 bPi 连接到公共 IP 或主机名和端口 2222 也是可行的。
目标
目标显然是能够从我的电脑连接到 bPi 的公共主机名/端口,以便我可以从家庭网络之外访问它。
过去的
重要提示:所有方案(包括不起作用的方案)都有之前已经工作过,但由于某种原因,其中一些在一段时间前(不到两个月)停止工作。我不确定是否有任何更新,但这肯定是可能的。
疑似原因
最后两种情况表明问题不在于路由器或 rPi,而在于我的电脑在 windows10 上设置的 WSL2。
确切的错误详细信息
ssh -v -v -v -p 2222 pi@hostname
在 powershell 或 wsl 上运行时,我得到一个正常的日志debug1: SSH2_MSG_KEXINIT sent
,直到它挂起一段时间,然后退出debug3: recv - from CB ERROR:10060, io:00000229C830EF10 \ ssh_dispatch_run_fatal: Connection to <IP> port 2222: Connection timed out
搜索/找到答案
我已经尝试搜索“debug1:SSH2_MSG_KEXINIT 已发送”和“ssh 仅在本地工作”,但没有找到任何可行的解决方案。
大多数答案都是修复问题,防止任何随时随地进行连接。
其中一个反复出现的主题是错误的 MTU 设置。我确实尝试将 WSL 中的客户端 MTU(不确定 Windows 是否支持)降低到 1000 或以下,但这根本没有帮助。我无法在 bPi 上设置 mtu,因为它报告“设备或资源繁忙”,但由于它已经与其他设备一起工作,我认为问题不在于 bPi 或路由器。
额外细节
附加 ssh 设置(/etc/ssh/sshd_config
):
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
#Port 22
AddressFamily any
ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
PubkeyAuthentication yes
# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM no
#AllowAgentForwarding yes
AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation sandbox
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
PermitTunnel yes
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
如果需要,我还可以使用 wireshark 捕获数据包。