搬家导致公网 IP 无了之后,我琢磨出的公司办公机搭配 Clash,访问家庭网络的方案

有什么优势

  • 通过家里的局域网 IP 访问设备
  • 解决公司内部网络,内部 DNS 问题
  • 直连网络,流量不需要经过服务器中转
  • 和 Clash 配合,不需要再装其它 VPN 软件
  • 相比于 zerotier tailscale ,没有 QoS 的问题
  • 安全,不需要对外暴露端口
  • 适合多对一的情况

前提:搞清楚 NAT 类型,确定能够打洞穿透才行

pFXNYiF.png

1. 准备

  • Clash.Verge
  • FRP
  • 一台云服务器
    • frps 负责 P2P 打洞,失败也可以作为降级,Frp 提供穿透失败走中转的策略
  • 家里
    • frpc
    • socks-server
  • 公司
    • frpc
    • clash

2. Frp 配置

2.1 云服务器 Frps 配置

frps.toml

bindPort = 7000

docker-compose.yml

version: '3.5'

services: frps: image: snowdreamtech/frps:0.56.0 networks:

  • cluster environment:
  • TZ=Asia/Shanghai volumes:
  • /etc/timezone:/etc/timezone:ro
  • /etc/localtime:/etc/localtime:ro configs:
  • source: frps_config target: /etc/frp/frps.toml ports:
  • target: 7000 published: 7000 configs: frps_config: file: ./frps.toml

2.2 家里

  • 部署 socks 服务
    • 我是用的 openwrt passwall 自带的

frpc.toml

# frps 部署地址
serverAddr = "xxxx"
serverPort = 7000


[[proxies]] name = "socks-proxies"

frp xtcp 才支持 p2p 打洞穿透

type = "xtcp"

秘钥,公司的 frpc 会用到

secretKey = "xxxx"

填你的 socks 所在设备的 ip port

localIP = "192.168.5.2" localPort = 10080

2.3 公司

frpc.toml

# frps 部署地址
serverAddr = "xxxx"
serverPort = 7000

[[visitors]]

随便取

name = "socks_visitor"

和家里保持一致

type = "xtcp" serverName = "socks-proxies" secretKey = "xxxx"

绑定到本地的端口

bindAddr = "0.0.0.0" bindPort = 10080

定时轮询,保持连接

keepTunnelOpen = true

运行

 docker run --restart=always -p 10080:10080 -d -v ./frpc.toml:/etc/frp/frpc.toml --name frpc snowdreamtech/frpc

3. Clash 配置

在 Clash-Verge 中开启 Tun 模式:这样可以创建一个网卡,接管电脑所有网络,否则只能浏览器,或者支持代理的软件访问

Clash 基础配置可以看: https://github.com/juzisang/Rules/blob/main/clash.yaml

添加如下配置

clash-config.yaml

# 添加节点
proxies:
  - {
      name: HomeProxy,
      server: 127.0.0.1,
      port: 10080,
      type: socks5,
      username: xxx,
      password: xxx,
    }

...

proxy-groups:

  • name: 🏠 家庭网络 type: select proxies:
    • HomeProxy

...

rules:

自定义规则

  • IP-CIDR,192.168.5.0/24,🏠 家庭网络

3.1 解决公司内部 DNS 问题

公司有很多内部服务,不对外开放,一般都是内部有一个私有 DNS 服务器,来负责这些内部服务的域名解析,但是 clash 接管整机网络之后,DNS 也会接管,会导致这些服务找不到 ip

添加如下配置

clash-config.yaml

dns:
enable: true
listen: :1053
enhanced-mode: fake-ip
fake-ip-filter:
- "*"
- "+.lan"
- "+.local"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
- 114.114.114.114
proxy-server-nameserver:
- https://doh.pub/dns-query
nameserver:
# 这里填公司的私有 DNS 地址
- 192.168.x.x
- 192.168.x.x
nameserver-policy:
# 被墙的域名才走这个解析
"geosite:gfw":
  - "tls://8.8.4.4#dns"
  - "tls://1.0.0.1#dns"