万能连接

2025-01-03

把本地服务暴露到公网服务器

比如在调试微信接口的时候,需要通过白名单 IP 访问。

  1. 在本地启动服务,比如 python -m http.server 8001
  2. 用 ssh 打一个 tunnel,ssh -R 0.0.0.0:8001:localhost:8001 root@your-server-ip
  3. 登录服务器以后,用 socat 转发端口,socat -d -d TCP-LISTEN:80,fork,reuseaddr TCP:localhost:8001

访问远端服务器中的内网应用

比如远端服务器 6379 端口运行着内网可见的 Redis:

ssh -L 0.0.0.0:6379:0.0.0.0:6379 root@47.92.245.237

此时直接访问本地 6379 端口即可访问远端服务器的 Redis。

把远端服务器作为代理出口

比如本地需要临时连接微信 API 调试,但是请求必须来自已指定的 IP 白名单。

ssh -D [local_port] [user]@[server_ip] -p [port]
  • -D [local_port]: 指定 SOCKS 端口,比如 1080
  • [user]: SSH 用户名
  • [server_ip]: SSH 服务器 IP
  • -p [port]: SSH 服务器端口,默认 22

举例:

ssh -D 1080 root@47.100.36.133 -p 22 -N -f
  • -N: 不执行远程命令
  • -f: 后台运行 ⚠️ 注意!慎用这个命令,因为后台运行的进程不容易被发现和关闭,如果不小心忘记关闭线上代理,可能会导致非常严重的安全问题。

然后就可以通过 SOCKS 代理访问外网了:

curl --socks5 localhost:1080 http://ipinfo.io/json

输出:

{
  "ip": "xxx.xxx.xxx.xxx",
  "city": "Shanghai",
  "region": "Shanghai",
  "country": "CN",
  "loc": "xxxxxx",
  "org": "AS37963 Hangzhou Alibaba Advertising Co.,Ltd.",
  "postal": "200000",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}

这个时候只需要在代码中加上 socks5 配置,或者在本地的 VPN 中设置全局代理即可,下面是具体操作步骤。

ClashX + SSH 配置简易 VPN

比如:

  • 微信 api.weixin.qq.com 需要通过白名单服务器 A 访问
  • 阿里云 rds.aliyuncs.com 需要通过白名单服务器 B 访问
  • IP 服务 ipinfo.io 需要通过白名单服务器 C 访问

我的目标是能够在本地机器上直接访问:

curl https://api.weixin.qq.com/

此时可以 ClashX Pro 配置路由规则,再通过 SSH 代理到白名单服务器即可。

配置 ClashX 路由规则

打开当前 ClashX Pro 的配置文件
打开当前 ClashX Pro 的配置文件

ipinfo.io 为例:


proxies:
  - name: "C_Socks5"
    type: socks5
    server: 127.0.0.1
    port: 1080
    udp: true

proxy-groups:
  - name: 国外流量
    type: select
    proxies:
      - ehd-vmess
      - k8s-cjh
  - name: 国内流量
    type: select
    proxies:
      - DIRECT
  - name: C
    type: select
    proxies:
      - C_Socks5

rules:
  - DOMAIN-SUFFIX,smtp,DIRECT
  - DOMAIN-KEYWORD,aria2,DIRECT
  - DOMAIN-SUFFIX,uniin.cn,国外流量

  # 自定义路由规则
  - DOMAIN-SUFFIX,ipinfo.io,C

SSH 代理到白名单服务器

ssh -D 1080 root@xxx.xxx.xxx.xxx -p 22 -N -f

测试

此时使用浏览器访问 ipinfo.io,可见其反馈的请求 IP 已变为公网 IP:

浏览器访问 ipinfo.io 的结果
浏览器访问 ipinfo.io 的结果