借助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
命令将该文件的权限,设置为仅当前用户可以读写,其他人不允许读写。