创建从远程服务器到家庭客户端的持久反向 SSH 连接

创建从远程服务器到家庭客户端的持久反向 SSH 连接

我有一个家庭客户端,我想通过 SSH 从我的远程 Ubuntu 服务器连接到它。目前,我创建了一个 cron 作业,它会持续从我的家庭客户端调用到我的远程服务器。

到目前为止我已经尝试过:ssh -R 2222:localhost:22 root@<server-ip> -p 2222ssh -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
  • 代替服务器名称.comreverse.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,因为它还会自动检测连接故障。

参考:


一旦服务启动,您应该能够:

[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

相关内容