工作上我需要建立一个新的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 [email protected]
> Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]
# 从系统控制台启动wireguard的命令为
systemctl start [email protected]
> [email protected] - WireGuard via wg-quick(8) for wg0
> Loaded: loaded (/lib/systemd/system/[email protected]; 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' [email protected]
# 本地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