基于SSH隧道实现内网穿透

借助SSH隧道进行内网穿透,需要有一台公网机器,通过公网的端口,将内网的机器的端口进行对外暴露,从而实现内网穿透的功能。 内网穿透的服务,就取决于云服务器的带宽和内网的带宽,一般内网的带宽都足够,起码是100M以上,但是云服务器的带宽比较小,比如云服务器的带宽是5Mbps,那么就意味着,内网穿透的最

借助SSH隧道进行内网穿透,需要有一台公网机器,通过公网的端口,将内网的机器的端口进行对外暴露,从而实现内网穿透的功能。

内网穿透的服务,就取决于云服务器的带宽和内网的带宽,一般内网的带宽都足够,起码是100M以上,但是云服务器的带宽比较小,比如云服务器的带宽是5Mbps,那么就意味着,内网穿透的最大速率,只能达到5Mbps,也就是625KB/s的速率。

1. 在云服务器上进行操作

编辑sshd的配置文件:

vim /etc/ssh/sshd_config

GatewayPorts开关打开:

GatewayPorts yes

重启sshd服务。

systemctl restart sshd

2. 在本机进行操作实现内网穿透

使用如下的命令去配置SSH隧道转发,我想要通过外网IP的机器(internet-ip)的31233端口,去访问局域网内的本机的9999端口,我们可以使用如下的命令:

ssh -R 0.0.0.0:32133:127.0.0.1:9999 root@{internet-ip}

在输入上面的命令之后,会让你输入目标服务器的root用户的登录密码。

如果不需要进入目标服务器,只是需要使用SSH的隧道转发功能的话,那么我们直接使用如下的命令即可。

ssh -f -N -R 0.0.0.0:32133:127.0.0.1:9999 root@{internet-ip}

如果需要SSH服务希望可以长期运行,并且希望在连接断开时自动重连,可以使用 autossh工具。

# 更新
sudo apt update
# 安装autossh
sudo apt install autossh

接着我们使用如下的命令,去启动一个支持自动重连的SSH服务。

autossh -f -N -R 0.0.0.0:32133:127.0.0.1:9999 root@{internet-ip}

可以使用ps命令查看已经启动的SSH服务的情况。

ps aux | grep ssh

3. 配置SSH免密登录(A机器登录B机器)

我们下面举例,都是在A机器上需要通过SSH去登录B机器。

3.1 在A机器上执行的操作

首先我们使用如下的命令,查看SSH的公钥/私钥是否已经被创建。

cat ~/.ssh/id_rsa.pub 

如果不存在的话,那么我们使用如下的命令进行生成SSH的公私钥文件。

ssh-keygen

接着进入到下面这样的页面,按Enter确认即可。

Enter file in which to save the key (/home/lvyun/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/lvyun/.ssh/id_rsa
Your public key has been saved in /home/lvyun/.ssh/id_rsa.pub
The key fingerprint is:

接着,再次使用如下的命令,查看SSH的公钥文件是否已经生成成功。

cat ~/.ssh/id_rsa.pub 

我们将该文件的内容拷贝出来,粘贴到目标服务器(B)上。

3.2 在B机器上执行的操作

使用如下的命令,编辑允许授权的SSH公钥文件。

vim ~/.ssh/authorized_keys

我们将3.1当中的~/.ssh/id_rsa.pub 文件当中的内容,粘贴到~/.ssh/authorized_keys文件当中。

接着,我们再次执行SSH隧道命令。

ssh -R 0.0.0.0:32133:127.0.0.1:9999 root@{internet-ip}

# autossh
autossh -R 0.0.0.0:32133:127.0.0.1:9999 root@{internet-ip}

接着,正常情况就应该能成功免密登录上目标机器。

如果出现类似如下的这样的问题,说我们给的~/.ssh/id_rsa文件的权限太高了,需要我们降低一下权限。

Permissions 0777 for '/path/to/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/path/to/.ssh/id_rsa": bad permissions

可以使用chmod 600 ~/.ssh/id_rsa命令将该文件的权限,设置为仅当前用户可以读写,其他人不允许读写。

Comment