我有一个家庭客户端,我想通过 SSH 从我的远程 Ubuntu 服务器连接到它。目前,我创建了一个 cron 作业,它会持续从我的家庭客户端调用到我的远程服务器。
到目前为止我已经尝试过:ssh -R 2222:localhost:22 root@<server-ip> -p 2222
并ssh -L 2222:localhost:22 root@<server-ip> -p 2222
在 cron 作业中尝试过。
我使用服务器监听nc -lvnp 2222
并收到一条连接消息Connection received on 104.136.5.228 63119 SSH-2.0-OpenSSH_8.8p1 Debian-1
我也尝试过使用我的服务器的私钥通过 SSH 登录。从客户端:ssh-copy-id root@<server-ip>
和ssh -i id_rsa root@<server-ip>
。
服务器响应:root@<server-ip>: Permission denied (publickey).
但反向 shell 并没有出现。任何正确的帮助都将不胜感激。
答案1
下面是我维护的其中一台服务器的配置。该配置使用在客户端创建的 systemd 服务。它还使用autossh
,所以第一步我们需要安装它。
sudo apt install autossh
然后创建 SSH 配置文件。
sudo nano /etc/ssh/ssh_config.d/auto-ssh-systemd-hosts.conf
Host reverse.server-name.com
HostName 192.168.1.199
IdentityFile /root/.ssh/server-name.com/id_rsa
User User
Port 2222
LocalForward 22 127.0.0.1:2222
RemoteForward 2222 127.0.0.1:22
GatewayPorts yes
Compression yes
- 请注意,SSH 密钥由 root 用户拥有,因为它将是该服务的所有者。
- 不要忘记更改参数主持人,主机名和身份文件。
- 这里假设两个系统的 ssh 服务器都监听自定义端口 2222。
在此阶段您应该能够:
sudo ssh reverse.server-name.com # or
sudo autossh reverse.server-name.com
最后创建服务。
sudo nano /etc/systemd/system/autossh-reverse-server-name.service
[Unit]
Description=Keeps an SSH tunnel to 'server-name.com' open
After=network-online.target
[Service]
User=root
ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" reverse.server-name.com
ExecStop=/usr/bin/killall -s KILL autossh
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
- 代替服务器名称.com和reverse.server-name.com与实际值一致。
现在启用并启动该服务。
sudo systemctl daemon-reload
sudo systemctl enable autossh-reverse-server-name.service
sudo systemctl start autossh-reverse-server-name.service
为了停止和禁用该服务。
sudo systemctl stop autossh-reverse-server-name.service
sudo systemctl disable autossh-reverse-server-name.service
您可以通过以下命令获取状态或重新启动服务。
sudo systemctl status autossh-reverse-server-name.service
sudo systemctl restart autossh-reverse-server-name.service
如果服务挂起,将自动重新启动。另一方面,autossh
它将比 保持活动时间更长ssh
,因为它还会自动检测连接故障。
参考:
- https://www.freedesktop.org/software/systemd/man/systemd.service.html
- https://gist.github.com/thomasfr/9707568
一旦服务启动,您应该能够:
[email protected]:~$ ssh localhost -p 22 # connect to the local-machine
user@local-machine:~$ ssh localhost -p 22 # connect to server-name.com
当然,您需要向命令提供正确的身份验证数据。
答案2
如果您想与您的家庭主机建立 ssh 连接,您需要在其上运行一个 ssh 守护程序:
# assuming that ssh server is already installed on home-host
home-host $ sudo systemctl start sshd
您可以使用以下命令在主主机和远程主机之间创建持久的反向 ssh 隧道:
home-host $ ssh -Nf -R 2222:localhost:22 remote-host
-Nf
将把 ssh 客户端置于后台,而不在服务器上执行任何命令。
-R 2222:localhost:22
将分配一个套接字来监听远程主机上的 localhost:2222/tcp。此套接字将通过已建立的安全连接将所有数据包转发到 home-host:22/tcp。
现在,连接到远程主机上的终端,您可以使用以下命令连接到主主机上运行的 ssh 守护程序:
remote-host $ ssh localhost -p 2222
请注意,您可以使用此技术连接到主主机上运行的任何网络服务,而不仅仅是 sshd。例如,如果您在主主机上的 80/tcp 上运行一个 Web 服务器,则可以使用以下方式建立隧道:
home-host $ ssh -Nf -R 8080:localhost:80 remote-host
因此,在远程主机上,奇迹发生了:
remote-host $ wget http://localhost:8080