我正在尝试使用我的公共 IP 地址从外部源通过 ssh 进入我的计算机。但一直收到错误消息ssh: connect to host <public_ip> port 2222: Connection refused
。
失败之处
如果我尝试从外部 IP 通过 ssh 进入本地计算机,则
ssh -p 2222 <user_name>@<public_ip>
此命令将挂起。如果我尝试从我的计算机本身通过 ssh 进入我的计算机,
ssh -p 2222 <user_name>@<public_ip>
那么我会收到错误消息ssh: connect to host <public_ip> port 2222: Connection refused
。
什么有效
我可以从我的电脑进入我自己的电脑
ssh -p 2222 <user_name>@<internal_ip>
我可以通过同一网络内的 Mac 访问自己的电脑
ssh -p 2222 <user_name>@<internal_ip>
我可以从我的网络外部的计算机 ping 我的公共 IP 地址。
以下是我所做的:
我已经登录 routerlogin.net 上的 netgear genie,并将端口转发到指向我计算机的内部 IP 地址的端口 2222。
systemctl status sshd
返回
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-10-23 14:44:09 PDT; 19min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 305357 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 305359 (sshd)
Tasks: 1 (limit: 38023)
Memory: 1.7M
CPU: 23ms
CGroup: /system.slice/ssh.service
└─305359 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
Oct 23 14:44:09 lenovo systemd[1]: Starting OpenBSD Secure Shell server...
Oct 23 14:44:09 lenovo sshd[305359]: Server listening on 0.0.0.0 port 2222.
Oct 23 14:44:09 lenovo sshd[305359]: Server listening on 0.0.0.0 port 22.
Oct 23 14:44:09 lenovo systemd[1]: Started OpenBSD Secure Shell server.
所以我的电脑正在监听端口 2222
systemctl status ufw
● ufw.service - Uncomplicated firewall
Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
Active: active (exited) since Sun 2023-10-22 20:48:44 PDT; 18h ago
Docs: man:ufw(8)
Process: 725 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
Main PID: 725 (code=exited, status=0/SUCCESS)
CPU: 36ms
Oct 22 20:48:43 lenovo systemd[1]: Starting Uncomplicated firewall...
Oct 22 20:48:44 lenovo systemd[1]: Finished Uncomplicated firewall.
- 我已经跑了
sudo ufw allow 2222/tcp
又ufw stats
回来了
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22 ALLOW Anywhere
8080/tcp ALLOW Anywhere
2222/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
22 (v6) ALLOW Anywhere (v6)
8080/tcp (v6) ALLOW Anywhere (v6)
2222/tcp (v6) ALLOW Anywhere (v6)
我已经添加
Port 2222
到/etc/ssh/sshd_config
nmap -O -v <your public_IP>
返回以下内容
PORT STATE SERVICE
22/tcp filtered ssh
23/tcp filtered telnet
80/tcp filtered http
111/tcp filtered rpcbind
443/tcp filtered https
2222/tcp filtered EtherNetIP-1
8080/tcp filtered http-proxy
8181/tcp filtered intermapper
9000/tcp filtered cslistener
我还遗漏了什么?
解决方案
所以我找到了问题所在。我的网络有双重 NAT,需要在路由器和调制解调器上设置端口转发。在我的调制解调器上,我必须将端口转发到路由器,在路由器上,我必须将端口转发到设备。我设置了这些并重新启动了调制解调器,现在我可以从外部 IP 地址 ssh 进入我的设备。我认为另一件让我感到困惑的事情是,我没有静态内部 IP 地址,所以我需要将路由器的端口转发更改为我的设备,因为在某些调制解调器重新启动期间,我的内部 IP 地址发生了变化。
答案1
从收到连接被拒绝错误的终端运行
nmap -O -v <your public_IP>
这将告诉您哪些端口已打开并正在响应。结果应该会告诉您如何继续解决问题。如果端口 22 和 2222 响应,请查看 openssh 服务器上的 ssh 配置文件。您还应该考虑专注于让端口 22 正常工作,并暂时放弃转发到端口 2222 的步骤。
在配置文件中/etc/ssh/sshd_config.d/sshd_config.conf
,设置loglevel INFO
,然后tail -f /var/log/syslog
在服务器上的 shell 中查看是否记录了有关登录尝试的任何信息。请注意(这可能是您的问题),您需要在此配置文件中为端口 2222 创建类似的条目。请注意,ListenAddress 需要通过 NAT 或分配的公共 IP 地址从 Internet 访问(出于您的目的)。
为了进行故障排除,请考虑设置ListenAddress 0.0.0.0
使用 AllowUsers 和 DenyUsers 是一项值得利用的出色安全功能。此功能和您正在执行的端口转发将真正减少被黑客入侵的机会。
样本:
Port 22
ListenAddress 192.168.1.1
HostKey /etc/ssh/ssh_host_key
ServerKeyBits 1024
LoginGraceTime 600
KeyRegenerationInterval 3600
PermitRootLogin no
IgnoreRhosts yes
IgnoreUserKnownHosts yes
StrictModes yes
X11Forwarding no
PrintMotd yes
SyslogFacility AUTH
LogLevel INFO
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
AllowUsers your_username
根据您的症状,我怀疑您是否能走到这一步,但请检查/清除$HOME/.ssh/known_hosts
您用于 ssh 进入服务器的客户端,看看是否正在交换密钥。同样,我会修改 openssh 服务器和路由器,使其仅使用端口 22 进行 ssh。一旦您使其正常工作,您就可以使用其他端口来增加额外的安全性。您还应该禁用 telnet/ftp,只允许ssh
和sftp
以获得更好的安全性。
答案2
所以我找到了问题所在。我的网络有双重 NAT,需要在路由器和调制解调器上设置端口转发。在我的调制解调器上,我必须将端口转发到路由器,在路由器上,我必须将端口转发到我的设备。我设置了这一点并重新启动了调制解调器,现在我能够从外部 IP 地址 ssh 进入我的设备。我认为另一件让我感到困惑的事情是,我没有静态内部 IP 地址,所以我需要将路由器的端口转发更改为我的设备,因为在某些调制解调器重新启动期间,我的内部 IP 地址发生了变化