做内网需要用的Linux服务器(A)ubuntu系统,只分配了内网IP,可以连接外网(通过手机热点wifi或者有线网口),没有办法设置路由器。
A的用户名:nameA@192.168.109.11,
现在用家里的电脑C通过ssh连接到A上,当然有TeamViewer,向日葵等桌面连接软件,但传输画面比较卡,故想ssh连接。网络上有花生壳、net123等提供穿墙服务,可以实现ssh,但都比较贵。
自己在腾讯云上申请了虚拟服务器B,A、C可以通过B直接实现访问。具体过程如下:
step1:申请腾讯云服务器 https://cloud.tencent.com/act/seckill?from=13338
买了一个99元一年的虚拟服务器。
用户名 ubuntu,端口22,IP:123.123.123.123,密码
在个人电脑C上可以通过ssh终端实现访问
ssh -p 22 ubuntu@123.123.123.123
step2:配置云服务器B,使其端口访问开放
1>.修改B服务器的sshd设置 #vi /etc/ssh/sshd_config
2>把GatewayPorts打开(去掉前面的#号注释): GatewayPorts yes
3>存盘后退出,并重新启动sshd ,#service sshd restart
step3: 配置内网服务器A,建立A到B的ssh方向代理,使用autossh实现更好,在A上操作,参考https://www.cnblogs.com/kwongtai/p/6903420.html
建立A机器到B机器的反向代理,具体指令为
1>安装autossh, sudo apt install autossh
2>B到A的ssh代理命令,需要输入
ssh -fCNR 7290:localhost:22 ubuntu@123.123.123.123
autossh -M 7291 -fCNR 7290:localhost:22 ubuntu@123.123.123.123
autossh
的参数与ssh的参数是一致的,但是不同的是,在隧道断开的时候,autossh会自动重新连接而ssh不会。另外不同的是我们需要指出的-M参数,这个参数指定一个端口,这个端口是外网的B机器用来接收内网A机器的信息,如果隧道不正常而返回给A机器让他实现重新连接。
step4:建立从B到A的ssh正向代理,在B上操作
建立B机器的正向代理,用来做转发,具体指令为
ssh -fCNL [A机器IP或省略]:[A机器端口]:[B机器的IP]:[B机器端口] [登陆B机器的用户名@B机器的IP]
这里的B机器的端口和上面的B机器的端口是一致的,端口1234的也是B机器的。
ssh -fCNL *:1234:localhost:7290 localhost
在B服务器上尝试以下命令:netstat -a |grep 7290,如果有返回如下界面,则证明成功
在B服务器上,执行以下命令,则能ssh访问A服务器 ,1234 为B上的端口,7290也是B的端口。
这一步主要实现了云服务器B上自己的端口转发,及将B的1234端口转发到B的7290端口。没有这一步,后面直接ssh -p 7290 nameA@B的IP,也是一样。
ssh -p 1234 nameA@123.123.123.123 ,输入nameA在内网的密码
step5:个人电脑C测试
完成之后就可以,实现在通过云服务器端口1234,映射到内网服务器的端口7290。
在个人电脑C上执行以下命令,
ssh -p 1234 A的用户名@B的公网IP地址。即
ssh -p 1234 nameA@123.123.123.123,输入nameA的密码
step6:内网服务器A免密登录
建立A到B的反向代理时需要输入密码,为此,要建立A到B的免密码ssh访问。
1>在A操作,在A上生成密钥文件, ssh
-keygen -t rsa
将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub(如果用dsa则生成id_dsa,id_dsa.pub)
生成位置在/home/user/.ssh/文件夹下(我用的是user用户所以在root下,生成过程会有提示文件位置),.ssh 是隐藏文件夹 使用 ls -a查看
2>在A操作,将公钥放到服务器指定位置
将公钥复制到云服务器B的root用户下的.ssh文件夹(用哪个用户登录就复制到哪个用户下的.ssh文件夹下)
scp
/home/user/
.
ssh
/id_rsa
.pub ubuntu@123.123.123.123:
/home/ubuntu/
.
ssh
/
3>
在B操作,安装公钥
登录到云服务器B上 cd /home/ubuntu/.ssh/
cat
id_rsa.pub >> authorized_keys
step7:实现内网服务器A开机自启反向代理。
1>要在内网服务器A开机自启执行如下命令:autossh -M 7291 -fCNR 7290:localhost:22 ubuntu@123.123.123.123
A的系统是ubuntu18.04,为此,要新建/etc/rc.local,参考:
https://blog.csdn.net/wuspeng/article/details/108462529
第一步:sudo vi /lib/systemd/system/rc.local.service, 文本末端添加以下内容
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
第二步:ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/rc.local.service
第三步:sudo chmod 0755 /etc/rc.local
第四步:sudo vi /etc/rc.local,添加需要的开启执行的命令/或脚本
autossh -M 7291 -fCNR 7290:localhost:22 ubuntu@123.123.123.123
这个方法不稳定,发现另外一个更简单的方法。
vim /etc/profile ,把autossh -M 7291 -fCNR 7290:localhost:22 ubuntu@123.123.123.123,添加到最后一行,记得在行尾加上“空格”及“&”。
参考
https://blog.csdn.net/weixin_42451919/article/details/88971503?spm=1001.2014.3001.5501
2>使内网服务器A的root用户能后无密码访问,copy user下面相关密钥文件到root下面
参考https://blog.csdn.net/xiao_huocai/article/details/103192258
cp /home/user/.ssh/id_rsa.pub /root/.ssh/id_rsa.pub
cp /home/user/.ssh/id_rsa /root/.ssh/id_rsa
step8:重启内容内网服务器A
ps aux |grep autossh ,看是否自动反向ssh到B
在个人电脑C上,连接A
ssh -p 1234 nameA@123.123.123.123,,输入nameA的密码,成功。