公网主机通过ssh远程访问局域网内linux主机

关键字:ssh、局域网、公网、反相连接
时间:2019年5月

原理

原理流程如下:
1、局域网主机先发起一个ssh请求登录公网主机,这个ssh登录不提供命令行输入,而是在登录的主机上打开一个tcp端口进行监听;
2、当有请求访问这个tcp端口时,数据会通过已经建立的连接转发到局域网主机上指定的端口,如果这个局域网主机上指定的端口是22端口,那么就实现了ssh登录到局域网。

准备

主机 IP
公网 1.2.3.4
局域网 192.168.1.100

公网主机

安装ssh服务端和客户端

root@www:~# apt-get install openssl-server
root@www:~# apt-get install openssl-client
root@www:~# adduser user1
...

注:由于会在局域网主机上建立免密登录,为保障公网主机安全,建议添加一个新用户用于远程登录。

局域网主机

只用ssh客户端本身是能够实现这个功能的,单次可以直接使用ssh。如果要长期保持能够远程登录,就需要用到autossh工具。

root@debian:~# apt-get install autossh
root@debian:~# ssh-keygen
...
root@debian:~# ssh-copy-id user1@1.2.3.4
...
root@debian:~# autossh -M 4567 -NR 8022:localhost:22 user1@1.2.3.4

注:
“-M 4567”是autossh监控会用到的一个端口,任意都可以只要不冲突;
“-NR 8022:localhost:22”是指在远端监听8022端口,并且8022端口来的数据转发到“localhost:22”;
“user1@1.2.3.4”是ssh访问的用户和主机

远程访问

在公网主机上

root@debian:~# ssh user1@127.0.0.1 -p 8022
password:

高级用法

主机 IP
公网 1.2.3.4
局域网X主机A 192.168.1.100
局域网Y主机B 192.168.2.110

在局域网主机A上执行脚本

root@hostA:~# autossh -M 4567 -NR 8022:localhost:22 user1@1.2.3.4

在公网主机上执行脚本

root@www:~# autossh -M 4568 -gNL 8023:localhost:8022 localhost

在局域网主机B上访问公网主机8023端口时,其实访问的是局域网主机A。

root@hostB:~# ssh root@1.2.3.4 -p 8023