Wireguard

工作上我需要建立一个新的adwords账户,由于账户设置的复杂性,我需要使用Google Adwords Editor来设置结构化的广告Campaign,之所以不用adwords的web界面是因为效率太低了。

然而最新版适用于Mac OSX EI Capitan 10.11的Google Adwords Editor 版本是 12.2.3, 如果你碰巧手贱跟我一样更新了他,抱歉你就再也回不去了,因为从12.2.3版本以上就不再支持EI Capitan版本,因此你需要Rollback。如果你回到Google的官网寻找历史版本,不好意思,没有相关的链接指向历史版本的下载地址。我第一次觉得Google如此脑残,历史版本不放出来,因此忍不住就在Google Adwords的Community上开帖吐槽, 最后Google内部的Adwords工程师Igor贴出了12.2.3的下载链接。如果你和我遇到了同样的问题,你可以在这里下载。

Rollback之后,遇到了另一个问题。以下Google Adwords Editor简称GADE。这个版本的GADE不支持Socks代理,仅支持http代理,而我这里的情况是https代理极不稳定,而留给我的选择就只剩下VPN。而目前市场上活着的VPN也是各种不稳定,所以我决定自己搭建VPN,最终了Wireguard解决方案。

远端的服务器环境是Debian 9 Stretch,可以按照官方文档apt-get直接安装。Wireguard主要有wireguard-dkms和wireguards-tools两个组件,而这两个组件依赖linux-header来运作,而安装当前系统内核相配套的linux-header则需要安装GCC6.0以上的版本。如果你的debian的GCC版本为4.0,而apt安装最新的gcc报了一堆依赖‘you have held broken packages.’不满足条件的错误,你需要检查一下你的distribution的具体版本。

# gcc版本4.0并且报依赖错误
# 先检查服务器版本,两个方法
# LSB - Linux Standard Base
lsb_release -da

No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.5 (stretch)
Release:    9.5
Codename:   stretch

# 或是读取etc目录下的系统版本os-release配置文件

cat /etc/os-release

PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/


# 这里出现依赖错误的原因是,我在更新vps的时候,误将jessie更新到了stretch,而source.list.d依然使用的是jessie版本的配置文件,自然依赖就报错了。
# 在更新了source.list和source.list.d的配置,update之后,依赖的问题解决。

# 这里贴一下stretch的Debian Official Reposity,以便以后使用
deb http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch main contrib non-free

deb http://deb.debian.org/debian-security/ stretch/updates main contrib non-free
deb-src http://deb.debian.org/debian-security/ stretch/updates main contrib non-free

deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free

# wireguards 是基于Linux内核的,所以依赖于linux-kernel-header 和 kernel模块。
# header 模块的正常编译和加载并不一定要求header版本和kernel版本一致,但是如果kernel header版本太老,
# 一些新的kernel header的特性就无法在编译是被应用
# 这里,我们建议将linux-kernel-header 是跟当前系统内核版本保持一致,这样就会少出问题
# 注意 uname -a 检查的只是内核的版本
# uname -r 返回结果含有内核的版本号和发行版的版本号
# 由于Linode vps的特殊性,在安装完新的kernel和header之后,你需要检查vps的profile是否是grub2引导方式
# 如果不是,需要在console页面修改,修改完之后需要在terminal界面运行 update-grub 命令来进行更新引导加载

# 安装linux header
# Debian 默认的kernel header安装目录为/usr/src

apt install linux-headers-$(uname -r)


# 安装 wireguard
apt-get install wireguard

# 注意安装和配置wireguard需要root权限

...
wireguard:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.9.0-3-amd64/updates/dkms/

depmod...

DKMS: install completed.

# wireguard 安装时,会根据当前的header来编译内核模块
# depmod -> 生成模块
# 编译后的内核模块位置为 /lib/modules/4.9.0-3-amd64/updates/dkms/wireguard.ko

# 检查wireguard模块是否被安装
dkms status

# 检查wireguard内核模块是否加载
# 如果没有返回任何结果,则表示模块没有被自动加载,那么wireguard就无法正常运行
lsmod | grep wireguard

# 加载激活 wireguard 内核模块
modprobe wireguard


# 配置 wireguard

# Wireguard是双向对等的VPN,这里为了方便理解,我就称公网服务器为服务端,自己的电脑为客户端

# 生成服务端公钥和私钥
# 分别会在当前目录生成 publickey 和 privatekey 文件
wg genkey | tee privatekey | wg pubkey > publickey

# 注意: 如果你不小心多次生成了密钥,而不是到当前服务端或是客户端使用的到底是哪个密钥,可以通过先启动 wireguard 服务, 使用 wg showconf 命令来打印 密钥的相关信息

# 配置/etc/wireguard/wg0.conf 文件

touch wg0.conf
vi wg0.conf


----------------------------------------------------------
[Interface]
# 服务端在VPN内网IP地址
Address = 192.168.9.1/24
# 如果动态添加客户端或是peer的信息,这里会自动保存
SaveConfig = true
# 添加流量转发的防火墙规则,如wireguard激活则转发生效,不激活则删除规则
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 服务端监听节点
ListenPort = (端口号)
# 服务端私钥
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[Peer]
# 客户端的公钥,针对我的情况,就是Mac主机上生成的公钥
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 客户端接入时,客户端在VPN内网的IP地址
AllowedIPs = 192.168.9.101/24
----------------------------------------------------------

# 更方便的方法是,不将客户端的信息写在配置文件中,采用命令的方式添加客户端信息
# 在公网服务器运行一下命令
# 由于我们设置了SaveConfig = true,因此一下命令运行后,peer信息会自动添加到wg0.conf中
wg set wg0 peer [客户端公钥] allowed-ips 192.168.9.101/24



# 激活 wireguard 服务

wg-quick up wg0


# 如果出现错误提示 resolvconf: command not found
# 则说明 resolvconf 没有安装,直接apt安装即可
# 之后重新运行命令即可激活wireguard服务,成功运行提如下
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 192.168.9.1/24 dev wg0
[#] ip link set mtu 1420 dev wg0
[#] ip link set wg0 up
[#] resolvconf -a tun.wg0 -m 0 -x

# 使用 ifconfig 命令查看wireguard的wg0网卡状态,确认一切正常

ifconfig

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 192.168.9.1  netmask 255.255.255.0  destination 192.168.9.1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 为避免由于服务器启动而造成wireguard终端,可以将wireguard添加为系统启动项
systemctl enable wg-quick@wg0

> Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.

# 从系统控制台启动wireguard的命令为

systemctl start wg-quick@wg0

> wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
>   Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
>   Active: active (exited) since ......


# 客户端安装 #
# 我的环境是 Mac,其他环境请参照官方文档 #

brew install wireguard-tools

# 配置wireguard客户端 #


# 新建配置文件

sudo mkdir /etc/wireguard && cd /etc/wireguard
sudo touch wg-mac.conf
sudo vi wg-mac.conf

----------------------------------------------------------
[Interface]
# 客户端生成的私钥
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 客户端在VPN内网的地址
Address = 192.168.9.101/24
DNS = 8.8.8.8

[Peer]
# 服务端的公钥
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 服务端的域名:端口或是IP:端口
Endpoint = domain.com:10311
AllowedIPs = 0.0.0.0/0
----------------------------------------------------------

# 在Mac上启动wireguard客户端和运行服务端一样,同样使用wg-quick命令
# 其中 up 后面跟的参数就是刚刚的配置文件名去掉conf后缀
sudo wg-quick up wg-mac

> Warning: `/private/etc/wireguard/wg-mac.conf' is world accessible
> [#] wireguard-go utun
> WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> W                                                     G
> W   This is alpha software. It will very likely not   G
> W   do what it is supposed to do, and things may go   G
> W   horribly wrong. You have been warned. Proceed     G
> W   at your own risk.                                 G
> W                                                     G
> WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> INFO: (utun0) 2018/09/05 17:02:36 Starting wireguard-go version 0.0.20180613
> [+] Interface for wg-mac is utun0
> [#] wg setconf utun0 /dev/fd/63
> [#] ifconfig utun0 inet 192.168.9.101/24 192.168.9.101 alias
> [#] ifconfig utun0 up
> [#] route -q -n add -inet 0.0.0.0/1 -interface utun0
> [#] route -q -n add -inet 128.0.0.0/1 -interface utun0
> [#] route -q -n add -inet xxx.xxx.xxx.xxx -gateway 192.168.1.1
> [#] networksetup -getdnsservers Bluetooth PAN
> [#] networksetup -getdnsservers Wi-Fi
> [#] networksetup -getdnsservers Thunderbolt Bridge
> [#] networksetup -setdnsservers Thunderbolt Bridge 8.8.8.8
> [#] networksetup -setdnsservers Wi-Fi 8.8.8.8
> [#] networksetup -setdnsservers Bluetooth PAN 8.8.8.8
> [+] Backgrounding route monitor

# 关闭Wireguard
sudo wg-quick down wg-mac

# 测试链接是否正常可以使用ping
ping 192.168.9.1

# 或是通过监控流量方式来测试
 ifstat -i utun0

 > utun0
 > KB/s in  KB/s out
 >   0.00      0.14
 >   0.44      0.13
 >   0.00      0.04
 >   0.00      0.05
 >   0.00      0.04
 >   0.00      0.04
 >   0.04      0.00
 >   0.00      0.00
 >   0.00      6.70
 >   5.73      0.61
 >   5.24      0.74
 >   0.89      1.38


免费的wireguard线路

mosh因为G/F/W被封之后的 ssh 连接服务器的解决办法


ssh -o ProxyCommand='nc -x 127.0.0.1:7081 %h %p' user@domain.com # 本地shell客户端的˙配置 # keepalive or autossh? 需要进一步测试 # 客户端针对不同主机的设置 # 针对断线的问题 # 每30秒向服务器发送在线状态提示 ServerAliveInterval 30 # 一次连续的在线状态提示发送次数,240次X30秒=7200秒=2小时 ServerAliveCountMax 240

关于netcat配合socks proxy连ssh的相关信息可以(参照链接)[https://ieevee.com/tech/2017/10/19/ssh-over-socks5.html]

关于发现rpcbind运行在底层并监听大量端口的情况

了解到当用户使用NFS系统来共享文件时,Debian发行版会默认的运行rpcbind和rpc.statd两个服务。而这不是我们所需要的,而开启的端口会降低服务器的安全性,因此需要将rpcbind服务关闭。

这里需要注意的是,rpcbind由systemctl来管理,而不是我们常用的service命令。

systemctl stop rpcbind.service
systemctl disable rpcbind.service