SSH 转发的一些记录
使用 ssh 能够访问远程服务器,但是,对于办公室的电脑只有内网 ip 而无法在家直接通过 ssh 访问,有时候不是很方便,然而像 frp 等都被公司禁止使用。本篇介绍 ssh 转发解决上面的问题。
公网服务器设置
首先需要购买一个具有公网 ip 的服务器,这里推荐阿里云,腾讯云等,服务器地址选择当地的就好,比如上海等。然后,对服务器进行配置,开放一个转发的端口,比如,2222。最后,需要对 sshd 的配置文件进行修改。
1 | sudo vim /etc/ssh/sshd_config |
为什么设置 GatewayPorts yes
呢?这是因为,默认情况下,OpenSSH 只允许从服务器主机连接到远程转发端口。GatewayPorts no
能够防止从服务器计算机外部连接到转发端口。也就是说,只能服务器自己连接自己的端口实现访问内网的端口,而外部的服务器不能连接。其实,查看端口占用(sudo netstat -tunlp | grep 2222
)时可以发现 2222 端口前面的 IP 地址是 127.0.0.1,而不是 0.0.0.0。要想外部(在家访问远程服务器的端口2222来实现访问公司内网服务器)访问,有两种方法:
- 按照上面的设置在远程服务器上的
/etc/ssh/sshd_config
设置GatewayPorts yes
; - 在远程服务器上进行本地端口转发,把 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 | cd |
此时,就可以在其他能够访问公网服务器的电脑上访问内网服务器了。命令如下
1 | ssh -p 2222 jinzhongxu@1.2.3.x |
如果将公网 ip 绑定到域名了,也可以使用将上面的设置中的公网 ip 切换为域名地址。