场景
1台内网机N可以上网,但是没有公网ip,用户userN,需要ssh的服务端和客户端,以及autossh软件;
1台操作机C需要通过互联网以ssh的形式主动连接内网机N,需要ssh的客户端;
1台具有公网ip的服务器S做中转,服务器S的ip为s.s.s.s,用户userS,ssh的端口为portS,需要ssh的服务端;
内网机N上的步骤
- 安装ssh服务端
apt install ssh
- 生成密钥文件,避免后续不断的输密码
ssh-keygen
可以使用默认值
- 把公钥提交给服务器S
ssh-copy-id -i ~/.ssh/id_rsa.pub -p portS userS@s.s.s.s
- 利用ssh向服务器S建立一条反向隧道
ssh -CNR 12345:localhost:22 userS@s.s.s.s -p portS
意思是服务器S上的12345端口映射到内网机N的22端口,这种方法会出现断线无法连接的情况
利用autossh,断线后会自动连接,更加可靠
- 安装autossh软件
apt install autossh
- 利用autossh建立隧道
autossh -M 5678 -CNR 12345:localhost:22 userS@s.s.s.s -p portS
autossh比ssh多了一个M参数。
更合适的方法是采用后文的自启动脚本。
服务器S上的步骤
编辑sshd_config文件
vim /etc/ssh/sshd_config
启用两个配置项,并设置为yes
GatewayPorts yes
AllowTcpForwarding yes
操作机C上的步骤
至此操作机C可以使用ssh客户端连接到服务器S的12345端口,实际上这个数据流会转发到内网机的22端口上,从而实现了内网穿透的功能。
内网机N上设置autossh为自启动
创建自启动文件/etc/systemd/system/autossh.service
内容如下
[Unit]
Description=AutoSSH tunnel service Remote port 12345 to local 22
After=network.target
[Service]
User=userN
TimeoutStartSec=30
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -o "ExitOnForwardFailure yes" -M 0 -N -R 12345:localhost:22 userS@s.s.s.s -p portS
[Install]
WantedBy=multi-user.target
启用开机自启动
systemctl enable autossh
立即启动
systemctl start autossh
网友评论