「捯饬记录」尝试为Padavan交叉编译一个wireguard-go和wireguard-tools

记录时间:2020 年 1 月 26 日

关键词:Padavan golang 交叉编译 wireguard

注意这是一次失败记录,虽然成功地编译出了wireguard-go和 tools,但是编译出的文件体积太大装不进K2路由器,不能测试其是否可用,也不想搞了,因为OpenWrt体积更小使用也简单,稳定性方面也超出我的预期,所以之后换用OpenWrt了。另外再说一下,wg体积小性能稳,对于家庭的组网来说很好用。

注:本记录仅为学习!关于使用请遵守相关规定!

在Ubuntu编译

  1. 准备编译环境

编译系统为 Ubuntu 18.04,首先安装必要的软件包

1
2
3
4
5
6
7
8
9
sudo apt update
sudo apt-get install build-essential pkg-config cmake autoconf automake libtool wget git
#编译libmnl
cd /tmp
git clone git://git.netfilter.org/libmnl
cd /tmp/libmnl/
./autogen.sh --disable-shared --host=mipsel-linux-uclibc
./configure
make
  1. 编译wireguard-tools
    1
    2
    3
    4
    cd ~
    git clone https://github.com/WireGuard/wireguard-tools.git
    cd wireguard-tools/src/
    env CFLAGS=-I/tmp/libmnl/include LDFLAGS=-L/tmp/libmnl/src/.libs make
  2. 安装go
    1
    2
    3
    4
    5
    6
    #这里安装了golang版本为1.13.7
    wget -O /tmp/golang.tar.gz https://dl.google.com/go/go1.13.7.linux-amd64.tar.gz
    tar -C /usr/local -xvzf /tmp/golang.tar.gz
    export PATH=$PATH:/usr/local/go/bin
    #启用阿里云go镜像加速下载
    export GOPROXY="https://mirrors.aliyun.com/goproxy/"
  3. 编译wireguard-go
    1
    2
    3
    4
    5
    mkdir -p $HOME/gobuild/ && cd $HOME/gobuild/
    git clone https://github.com/WireGuard/wireguard-go.git
    cd wireguard-go
    export GOPATH="$HOME/gobuild/"
    env GOOS=linux GOARCH=mipsle go build -v -o "wireguard-go"
  4. 复制wg和wireguard-go到主目录,就可以在主目录中找到了
    1
    2
    cp $HOME/wireguard-tools/src/wg $HOME
    cp $HOME/gobuild/wireguard-go/wireguard-go $HOME

    直接用github actions自动编译(特别推荐)

    贼省事,不多解释了,直接上脚本。由于没有仔细了解脚本语法,因此这个脚本是简单修改来的可能有不合理的地方,另外要注意一下随着源码的不断更新,脚本可能会在未来失效。关于使用可以参考一下前面的捯饬记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
name: Build wireguard-go for Padavan

on: 
  push:
    branches: 
      - master

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: 初始化
      env:
        DEBIAN_FRONTEND: noninteractive
      run: |
        #sudo apt-get update
        wget -O /tmp/golang.tar.gz https://dl.google.com/go/go1.13.7.linux-amd64.tar.gz
        sudo tar -C /usr/local -xvzf /tmp/golang.tar.gz
        export PATH=$PATH:/usr/local/go/bin
    - name: 编译wireguard-go
      run: |
        mkdir -p /tmp/gobuild/ && cd /tmp/gobuild/
        git clone https://git.zx2c4.com/wireguard-go
        cd wireguard-go
        export GOPATH="/tmp/gobuild/"
        env GOOS=linux GOARCH=mipsle go build -v -o "wireguard-go"
    - name : 上传wireguard-go
      uses: actions/upload-artifact@master
      with:
        name: wireguard-go
        path: /tmp/gobuild/wireguard-go/wireguard-go
    - name: 编译wireguard-tools
      run: |
        cd /tmp
        git clone https://git.zx2c4.com/wireguard-tools
        git clone git://git.netfilter.org/libmnl
        cd /tmp/libmnl/
        ./autogen.sh --disable-shared --host=mipsel-linux-uclibc
        ./configure
        make
        cd /tmp/wireguard-tools/src/
        env CFLAGS=-I/tmp/libmnl/include LDFLAGS=-L/tmp/libmnl/src/.libs make        
    - name : 上传wireguard-tools
      uses: actions/upload-artifact@master
      with:
        name: wireguard-tools
        path: /tmp/wireguard-tools/src/wg

关于wg文件的使用

因为不能测试,也就没有做进一步的了解。官方的简单说明中关于wireguard-tools都是直接编译安装,对单个wg的使用可能需要啃一下官方的文档,或者了解一下make install来手动配置,应该也挺麻烦的吧。

简单记录一下使用docker来编译的过程

在docker容器中编译(前提是安装了docker),因为我的Ubuntu里装了很多乱七八糟的东西,为了保持干净还是选择用docker来编译,但是没有特地做新的镜像,所以容器里的环境是从头开始搭的。

  1. 启动一个docker ubuntu容器
    1
    sudo docker run -it --rm ubuntu
  2. 安装必要的软件,切换软件源加速后续下载
    1
    2
    3
    4
    apt update
    apt install -y apt-transport-https ca-certificates
    sed -i 's#http://archive.ubuntu.com#https://mirrors.huaweicloud.com#' /etc/apt/sources.list
    sed -i 's#http://security.ubuntu.com#https://mirrors.huaweicloud.com#' /etc/apt/sources.list
  3. 中间编译步骤和上边 在ubuntu编译 是一样的
  4. 编译完成后另开一个终端窗口,执行以下命令复制wg和wireguard-go到本机
    1
    2
    sudo docker cp <container>:/root/wireguard-tools/src/wg wg
    sudo docker cp <container>:/root/gobuild/wireguard-go/wireguard-go wireguard-go
    使用完毕后ctrl + d退出容器,不留痕迹!

    END

    经过这次捯饬才发现Padavan的缺点:Linux版本有点低(3.4),而且模块化程度低,真想捯饬还得是OpenWrt。另外一个wireguard-go体积达到了4M,这K2就很吃力啊,由于这些原因还是转向了OpenWrt。经过短暂的试用感觉官方版OpenWrt 19.07的稳定性表现超出了我的预期,所以Padavan的内容到这里应该就告一段落了,哎希望给能看到这些个记录的带来一点点启发。不说了,IPv6我来了!

参考

Compiling the Kernel Module from Source:https://www.wireguard.com/compilation/

Installing WireGuard on ASUS RT-N56U (Padavan):https://medium.com/@yjwong/installing-wireguard-on-asus-rt-n56u-731c22f1f5bd

Go 语言跨平台路由器编译:https://blog.lutty.me/code/2017-04/golang-cross-compile-openwrt-ddwrt-build.html