WireGuard组建大内网

Background

  • 受疫情影响,大家线上办公的需求空前膨胀,像向日葵、Todesk等这类远程工具炙手可热。
  • 这类商业产品,对个人用户虽免费,但也有诸多限制,那我们能不能自己搭建个像向日葵那样的服务端,然后我们自己使用呢。
  • 当然可以。这里介绍几种实现方案。

WireGuard组建大内网_第1张图片

WireGuard组建大内网_第2张图片

1、Frp

Frp端口转发:比如说我们把Linux的22端口或window的3389端口转发到公网服务器的一个端口,我们就可以实现远程登录Linux系统或window系统,但如果用到的端口较多,那一个一个配置也挺麻烦的,这种方式这里就不再赘述了。

2、OpenV

OpenV:这种方式比较古老了,性能上可能稍逊色点,但我的使用体验还行,比向日葵稳定,具体实现方式请参考【Centos7使用docke搭建openV】,IPsec也是几十年前的解决方案了,这里也不详细介绍了。

3、ZeroTier

这个也是商业软件,不过源码开源,可以自己搭建服务端,这个我自己也试验过了。
具体操作步骤可参考文章:【一分钟自建zerotier-plant】

4、Tailscale

介绍这个之前不得不说下WireGuard,一句话:2020年1月28日,Linux之父Linus Torvalds正式将WireGuard merge到Linux 5.6版本内核主线,其他信息可以网上查下看看;关于WireGuard 协议实现的工具有用户态实现的Tailscale内核态实现的Netmaker,Netmaker这里就不介绍了,Tailscale呢,服务端不开源,对免费用户有诸多限制,而Headscale是一款开源实现,就是我们的主角了,这里详细记录搭建过程。搭建是基于docker的,如果拉镜像网不好,可以采用其他方式,请参考【Tailscale 基础教程:Headscale 的部署方法和使用教程】

客户端

Headscale 目前适配情况如下:
WireGuard组建大内网_第3张图片

docker 部署服务端
  • 创建headscale目录
mkdir -p /opt/headscale/
mkdir -p /opt/headscale/config
cd /opt/headscale/
  • 创建 docker-compose.yml
version: '3.5'
services:
  headscale:
    image: headscale/headscale:latest-alpine
    container_name: headscale
    volumes:
      - ./config:/etc/headscale
      - ./data/data:/var/lib/headscale
    ports:
      - 7080:7080
    command: headscale serve
    restart: unless-stopped
  • 创建配置文件
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O ./config/config.yaml
  • 修改配置文件
  • server_url:server_url 这个东西是一个简单的「HTTP 设备认证页面」,后面需要暴露在公网上,其他设备如果想加入到你的网络里面,需要访问这个地址,拿到一个 Token。有域名的话推荐用域名+nginx/caddy 反向代理没域名的话用 ip+端口。
  • ip_prefixes 可以根据自己控制客户端分配IP的网段。

WireGuard组建大内网_第4张图片

  • 然后创建一个虚拟网络空间。进到 headscale 的 docker 里面
docker exec -it 容器id /bin/sh

然后执行

headscale namespaces create wlf
windows客户端

简单说明下,服务端我们用headscale搭建的,客户端用的tailscale。

  • 官网下载客户端:【Windows客户端下载地址】
    WireGuard组建大内网_第5张图片
  • 下载好安装
    安装成功任务栏图标如下图所示
    WireGuard组建大内网_第6张图片
  • 然后修改注册表
    Win + R,然后输入regedit打开注册表编辑器,新建字符串值【UnattendedMode】=【always】和【LoginURL】=【你刚搭建的服务端的地址,即上面配置的server_url】
    WireGuard组建大内网_第7张图片
    WireGuard组建大内网_第8张图片
  • 重启tailscale客户端,双击图标登录,会自动打开一个网页如下图,即在服务端执行命令授权(还是需要进入到容器中执行),注意修改NAMESPACE。
# 第一种方法:通过服务端授权客户端,下面结合Linux客户端再介绍第二种方法:通过 Pre-Authkeys 授权客户端
headscale -n wlf nodes register --key 905cf165204800247fbd33989dbc22be95c987286c45aac3033937041150d846

WireGuard组建大内网_第9张图片

  • 授权成功后客户端图标如下图所示
    WireGuard组建大内网_第10张图片
  • 查看客户端IP已经分配了虚拟IP 110.10.0.1,是我们指定的网段
    WireGuard组建大内网_第11张图片
  • 同样的操作在另一台Windows上安装配置好客户端,分配虚拟IP 110.10.0.2
    WireGuard组建大内网_第12张图片
  • 网络互通了,我的本就是局域网内的,所以延迟贼低
    WireGuard组建大内网_第13张图片
Linux客户端
  • 一行命令安装
curl -fsSL https://tailscale.com/install.sh | sh
  • docker-compose安装
# docker-compose.yml
version: '3.3'
services:
    tailscaled:
        container_name: tailscaled
        image: tailscale/tailscale
        network_mode: host
        privileged: true
        restart: always
        cap_add: 
            - net_admin
            - sys_module
        volumes:
            - ./lib:/var/lib
            - /dev/net/tun:/dev/net/tun
        command: sh -c "mkdir -p /var/run/tailscale && ln -s /tmp/tailscaled.sock /var/run/tailscale/tailscaled.sock && tailscaled"
# 启动tailscale客户端容器
docker-compose up -d
  • 安装好通过第二种授权方法 Pre-Authkeys 加入到服务端创建的虚拟局域网wlf
# 首先在服务端进入容器,创建preauthkeys,指定24h有效期,--reusable参数代表可以重复使用,不加的话用一次就废了
headscale preauthkeys create -e 24h --reusable -n wlf
# 查看创建的preauthkeys,第一个我已经把它失效了
headscale preauthkeys list -n wlf

在这里插入图片描述

# 然后在Linux客户端执行(如果是docker安装的需要进到容器内再执行)
# 这里推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS。如果你对 DNS 有需求,可自己研究官方文档,这里不再赘述。
tailscale up --login-server=http://<服务端headscale的IP>:7080 --accept-routes=true --accept-dns=false --authkey 275a973c61f5ae7bb63955a648e7c3b38ac015552fe60ec1
# 最后在服务端进入容器,查看已加入的节点
headscale nodes list -n wlf

在这里插入图片描述

headscale-ui

github地址:【https://github.com/gurucomputing/headscale-ui】

  • docker安装
# docker-compose.yml
version: '3.5'
services:
  headscale-ui:
    image: ghcr.io/gurucomputing/headscale-ui:latest
    restart: unless-stopped
    container_name: headscale-ui
    ports:
      - 9443:443

WireGuard组建大内网_第14张图片

你可能感兴趣的:(Linux,Docker,服务器,linux,网络)