IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用Gost实现简单而高效的局域网方案

    chancel发表于 2023-05-25 00:00:00
    love 0
    <![CDATA[

    在公司想要使用家里的网络时,Frp和Ngrok是不错的选择。然而,这两者的更新配置相对繁琐,并且只能实现点到点的穿透功能

    相比于Frp和Ngrok,虚拟组网具有以下优势:

    • 点对点的网络连接(P2P)
    • 随时访问局域网内的所有设备
    • 更安全的传输协议

    有许多工具可以实现VPN虚拟组网,例如Zeroiter、Tailscale和WireGuard等,它们都是非常出色的选择

    对于我来说,我只需要实现公司/家庭的联网,因为我拥有公网服务器,所以对NAT穿透没有需求

    在这种情况下,Gost是满足我需求的理想选择。

    如果需要NAT穿透功能,建议考虑Zeroiter、Tailscale等工具

    以下是我基于Gost实现虚拟组网的实践记录

    1. 实践

    1.1. 网络信息

    以下是我的基础网络情况

    • 家庭PC的IP:192.168.100.100
    • 公司PC的IP:192.168.200.200
    • 私人的公网服务器IP:1.2.3.4

    我希望在公司的PC上访问家庭内的所有媒体服务,如

    • 家庭路由器:192.168.100.1
    • 家庭NAS服务:192.168.100.2

    在什么都不做的情况下,我在公司PC上ping一下家庭路由器

    ~❯ ping 192.168.100.1
    PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
    ^C
    --- 192.168.100.1 ping statistics 39 packets transmitted, 0 received, 100% packet loss, time 38511ms
    

    显然目前是不可行的,但通过Gost组网将可以实现上面的网络PING通

    1.2. Gost服务端

    在服务器1.2.3.4上面下载Gost

    • https://github.com/go-gost/gost/releases/tag/v3.0.0-rc8

    解压后目录如下

    chancel@Tencent-Lighthouse ~/apps/gost$ tree                          
    .
    ├── gost_3.0.0-rc8_linux_amd64v3.tar.gz
    ├── gost
    ├── LICENSE
    ├── README_en.md
    └── README.md
    

    在目录下创建config.yml配置文件

    services:
    
    - name: tls-tun
      addr: :28443 # 监听端口(客户端连接端口)
      handler:
        type: relay # 转发协议
      listener:
        type: tls # 加密数据通道
    
    - name: tun
      addr: 127.0.0.1:18421 # 绑定本地端口(不暴露此端口)
      handler:
        type: tun
        auther: tun
      listener:
        type: tun
        metadata:
          net: 172.16.16.1/24
          routes:
          - "192.168.100.0/24 172.16.16.100" # PC-A所在网络
          - "192.168.200.0/24 172.16.16.200" # PC-B所在网络
    

    这个配置文件监听了2个端口,1个是对外的端口:28443,1个是我们的tun设备监听端口127.0.0.1:18421

    无论是家里的PC还是公司的PC,都会通过访问28443来转而访问18421,这样做的原因是可以实现tls加密,如果直连18421也是可以的,但那样将是明文传输所有数据

    因创建tun设备需要root权限,使用sudo运行此配置,并检查对应日志输出,没有看到error信息即可

    sudo gost -C config.yml
    

    检查网卡信息,检查tun0设备信息,如下

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        ...
    8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1350 qdisc fq_codel state UNKNOWN group default qlen 500
        link/none 
        inet 172.16.16.1/24 brd 172.16.16.255 scope global tun0
           valid_lft forever preferred_lft forever
        inet6 fe80::dc8:d8db:4086:9b3b/64 scope link stable-privacy 
           valid_lft forever preferred_lft forever
    

    到这里服务器部署完成了

    1.3. Gost客户端

    紧接着,我们在家庭的PC(192.168.100.100)上也下载Gost程序

    • https://github.com/go-gost/gost/releases/tag/v3.0.0-rc8

    解压后目录如下

    chancel@Tencent-Lighthouse ~/apps/gost$ tree
    .
    ├── gost_3.0.0-rc8_linux_amd64v3.tar.gz
    ├── gost
    ├── LICENSE
    ├── README_en.md
    └── README.md
    

    同样在目录下创建config.yml配置文件,内容如下

    services:
    - name: tun
      addr: :0
      handler:
        type: tun
        chain: chain-tls-tun # 对应chains中的 chain-tls-tun 节点
        metadata:
          keepAlive: true
          ttl: 10s
      listener:
        type: tun
        metadata:
          net: 172.16.16.100/24 # 对应服务器配置中的 metadata 配置
          route: 192.168.200.0/24 # 需要访问的网络,所以这里填PC-B的网段,如果有多个网段,则写成数组形式
      forwarder:
        nodes:
        - name: target-0
          addr: ":18421"
    
    chains:
    - name: chain-tls-tun
      hops:
      - name: hop-0
        nodes:
        - name: node-0
          addr: 1.2.3.4:28443 # 对应服务器配置的tls+relay监听端口
          connector:
            type: relay
          dialer:
            type: tls
    

    这个配置文件services中的tun部分是连接18421端口,但没有写明ip,是因为服务器上的18421端口并不对外开放,需要通过配置文件下面的chains中的chain-tls-tun部分来访问28443来转而访问18421

    创建tun设备需要root权限,运行此配置,并检查输出,没有看到error信息即可

    sudo gost -C config.yml
    

    同样的,公司的PC(192.168.200.200)下载Gost并在目录下创建config.yml配置文件,内容如下

    services:
    - name: tun
      addr: :0
      handler:
        type: tun
        chain: chain-tls-tun # 对应chains中的 chain-tls-tun 节点
        metadata:
          keepAlive: true
          ttl: 10s
      listener:
        type: tun
        metadata:
          net: 172.16.16.200/24  # 对应服务器配置中的 metadata 配置
          route: 192.168.100.0/24 # 需要访问的网络,所以这里填PC-A的网段,如果有多个网段,则写成数组形式
      forwarder:
        nodes:
        - name: target-0
          addr: ":18421"
    
    chains:
    - name: chain-tls-tun
      hops:
      - name: hop-0
        nodes:
        - name: node-0
          addr: 1.2.3.4:28443 # 对应服务器配置的tls+relay监听端口
          connector:
            type: relay
          dialer:
            type: tls
    

    因创建tun设备需要root权限,使用sudo运行此配置,并检查输出,没有看到error信息即可

    sudo gost -C config.yml
    

    以上设置完毕后,在公司PC(192.168.200.200)上尝试访问家里PC(192.168.100.100)

    chancel@nuc8i5 ~$ ping 192.168.100.100  
    PING 192.168.100.100(192.168.100.100) 56(84) bytes of data.
    64 bytes from 192.168.100.100: icmp_seq=1 ttl=63 time=13.8 ms
    64 bytes from 192.168.100.100: icmp_seq=2 ttl=63 time=12.3 ms
    64 bytes from 192.168.100.100: icmp_seq=3 ttl=63 time=12.5 ms
    ...
    

    查看一下公司PC的当前路由规则,可以看到192.168.100.0的数据包默认发送到设备tun0

    default via 192.168.31.1 dev wlp3s0 proto dhcp src 192.168.31.50 metric 600 
    172.16.16.0/24 dev tun0 proto kernel scope link src 172.16.16.3 
    172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
    192.168.100.0/24 dev tun0
    

    2. iptables设置

    到上一步组网就完成了,但我们在PC(192.168.200.200)上尝试一下Ping网络A的路由器,发现无法连接

    chancel@nuc8i5 ~$ ping 192.168.100.1
    PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
    --- 192.168.100.1 ping statistics 13 packets transmitted, 0 received, 100% packet loss, time 12282ms
    

    这是因为数据包虽然被家里PC(192.168.100.100)接收了,但私有网络的数据包无法正常转发到其他设备上,需要在家里PC上添加NAT规则才能转发数据包出去

    sudo iptables -t nat -A POSTROUTING -s 172.16.16.0/24 ! -o tun0 -j MASQUERADE
    

    3. 结束

    到这里虚拟组网的设置就结束了,相较于原作者的博文补充了一些实践上的信息,关于更多信息如认证、采用tcp连接可以参考作者的博文

    参考资料

    • https://gost.run/blog/2022/tun/
    • https://juejin.cn/post/7214378356685684797



沪ICP备19023445号-2号
友情链接