利用ssh转发功能做端口映射,实现内网穿透

场景

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上的步骤

  1. 安装ssh服务端
apt install ssh
  1. 生成密钥文件,避免后续不断的输密码
ssh-keygen

可以使用默认值

  1. 把公钥提交给服务器S
ssh-copy-id -i ~/.ssh/id_rsa.pub -p portS [email protected]
  1. 利用ssh向服务器S建立一条反向隧道
ssh -CNR 12345:localhost:22 [email protected] -p portS

意思是服务器S上的12345端口映射到内网机N的22端口,这种方法会出现断线无法连接的情况
利用autossh,断线后会自动连接,更加可靠

  1. 安装autossh软件
apt install autossh
  1. 利用autossh建立隧道
autossh -M 5678 -CNR 12345:localhost:22 [email protected] -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 [email protected] -p portS

[Install]
WantedBy=multi-user.target

启用开机自启动

systemctl enable autossh

立即启动

systemctl start autossh

你可能感兴趣的:(利用ssh转发功能做端口映射,实现内网穿透)