skip to content
Liu Yang's Blog

Gost 基于 SSH 的本地与远程端口转发

/ 3 min read

Updated:
Table of Contents

Gost 可以把 SSH 当作隧道,用一份配置同时完成两件事:

  • 本地端口转发:在本地监听端口,流量经 SSH 送到远端,访问远端服务器上的服务(例如只监听 127.0.0.1 的 MySQL)。
  • 远程端口转发:在远端监听端口,流量经 SSH 回到本地,把本地服务暴露给远端,相当于一次内网穿透。

相比直接用 ssh -L / ssh -R,好处是配置文件化、可以多条规则一起管理,还能利用 Gost 的多跳和负载均衡。

完整配置

services:
# 本地端口转发:本地 :3306 → SSH → 远端的 127.0.0.1:3306
- name: mysql
addr: ":3306"
handler:
type: tcp
chain: chain-server
listener:
type: tcp
forwarder:
nodes:
- name: target-0
addr: 127.0.0.1:3306
# 远程端口转发:远端 :9999 → SSH → 本地的 127.0.0.1:6666
# 远程监听需要 listener 走 chain,本地转发目标写在 forwarder 里
- name: local_service
addr: ":9999"
handler:
type: rtcp
listener:
type: rtcp
chain: chain-server
forwarder:
nodes:
- name: target-0
addr: 127.0.0.1:6666
# 远程服务器
chains:
- name: chain-server
hops:
# 第一跳(可以继续加 hop 实现跳板连接)
- name: hop-0
# 节点列表(可以放多个节点做负载均衡)
nodes:
- name: node-0
addr: server:22
connector:
type: sshd
dialer:
type: sshd
auth:
username: root
# password: 密码
metadata:
privateKeyFile: ~\.ssh\id_rsa # Windows 写法
# 日志
log:
output: stderr
level: error
format: text
rotation:
maxSize: 100
maxAge: 10
maxBackups: 3
localTime: true
compress: false

使用说明

  • 本地转发:启动后,本地连接 127.0.0.1:3306 就等于连接远端服务器上的 MySQL,数据库端口不需要对公网开放。
  • 远程转发:在远端服务器上访问 127.0.0.1:9999,就会到达本地的 127.0.0.1:6666。远端监听的端口注意不要和服务器上已占用的端口冲突。
  • 认证:推荐使用密钥认证(privateKeyFile),不要把密码写进配置文件。

参考