使用 ssh 能够访问远程服务器,但是,对于办公室的电脑只有内网 ip 而无法在家直接通过 ssh 访问,有时候不是很方便,然而像 frp 等都被公司禁止使用。本篇介绍 ssh 转发解决上面的问题。

公网服务器设置

首先需要购买一个具有公网 ip 的服务器,这里推荐阿里云,腾讯云等,服务器地址选择当地的就好,比如上海等。然后,对服务器进行配置,开放一个转发的端口,比如,2222。最后,需要对 sshd 的配置文件进行修改。

1
2
3
4
5
sudo vim /etc/ssh/sshd_config
# 添加如下内容
GatewayPorts yes
# 重启 sshd
sudo systemctl restart sshd.service

为什么设置 GatewayPorts yes 呢?这是因为,默认情况下,OpenSSH 只允许从服务器主机连接到远程转发端口。GatewayPorts no 能够防止从服务器计算机外部连接到转发端口。也就是说,只能服务器自己连接自己的端口实现访问内网的端口,而外部的服务器不能连接。其实,查看端口占用(sudo netstat -tunlp | grep 2222)时可以发现 2222 端口前面的 IP 地址是 127.0.0.1,而不是 0.0.0.0。要想外部(在家访问远程服务器的端口2222来实现访问公司内网服务器)访问,有两种方法:

  1. 按照上面的设置在远程服务器上的 /etc/ssh/sshd_config 设置 GatewayPorts yes
  2. 在远程服务器上进行本地端口转发,把 127.0.0.1:2222 转发成 0.0.0.0:2222,具体可参考SSH 转发知识汇总

其实,除了上面两种,还有一种方式,就是指定访问者的 IP,设置如下:

1
GatewayPorts clientspecified

此时,内网服务器设置(详细见下一段)应该如下:

1
ssh -T -f -N -g -R 1.2.3.Y:2222:127.0.0.1:22 jinzhongxu@1.2.3.x

这时候,只运行外网 IP:1.2.3.Y 访问 1.2.3.x 的 2222 端口。

OpenSSH 还允许将转发的远程端口指定为 0。这种情况下,服务器会动态分配一个端口并报告给客户端。当与 -O forward 选项一起使用时,客户端会将分配的端口号打印到标准输出。

内网服务器设置

假设公网服务器的 ip 地址是: 1.2.3.x,有用户 jinzhongxu,内网服务器有用户 jinzhongxu, 那么只需要一行命令,就可以实现 ssh 转发:

1
ssh -T -f -N -g -R 2222:127.0.0.1:22 jinzhongxu@1.2.3.x
  • T:不分配伪终端 tty;
  • f:使 ssh 进程在用户输入密码之后转入后台运行;
  • N:只连接远程主机,不打开远程shell。(不执行远程指令,即代理服务器不需执行指令,只作端口转发);
  • g:允许代理服务器连接到本地转发端口;
  • R:将代理服务器指定端口上的连接转发到本机端口;
  • jinzhongxu@1.2.3.x: 表示使用代理服务器的用户来连接;
  • 2222:127.0.0.1:22:表示本机回环接口 (127.0.0.1,也可使用本机其他网络接口的地址,比如以太网 IP 或 WiFi IP) 的 22 端口连接到远程主机的 2222 接口,因远程主机 2222 绑定的地址为空,所以远程主机会监听其所有网络接口的 2222 端口。

常常,我喜欢配置 systemd service 服务,能够更好的管理转换命令。具体命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
cd

# 创建脚本
vim ssh-forwarding.sh

# 添加如下代码
#! /bin/sh

ssh -T -N -g -R 2222:127.0.0.1:22 jinzhongxu@1.2.3.x

# 添加执行权限
chmod +x ssh-forwarding.sh

# 添加 service
sudo vim /etc/systemd/system/ssh-forwarding.service

# 添加如下代码
[Unit]
Description=SSH forwarding service
After=syslog.target network.target

[Service]
Type=simple
User=jinzhongxu
ExecStart=/bin/bash /home/jinzhongxu/ssh-forwarding.sh
WorkingDirectory=/home/jinzhongxu/
Restart=always

[Install]
WantedBy=multi-user.target

# 添加到 systemd
sudo systemctl daemon-reload
sudo systemctl status ssh-forwarding.service
sudo systemctl start ssh-forwarding.service
sudo systemctl status ssh-forwarding.service
sudo systemctl enable ssh-forwarding.service

此时,就可以在其他能够访问公网服务器的电脑上访问内网服务器了。命令如下

1
ssh -p 2222 jinzhongxu@1.2.3.x

如果将公网 ip 绑定到域名了,也可以使用将上面的设置中的公网 ip 切换为域名地址。

参考链接

1.SSH隧道穿越内网访问局域网内主机