启用 TCP BBR 提高 Linux 的网速

BBR 全称是 Bottleneck Bandwidth and RRT ,是谷歌开发的用于控制 TCP 阻塞的一种算法 Congestion Control Algorithm (CCA) 。

它克服了当前 Reno 和 CUBIC (默认 CCA) 中的诸多问题, 新算法不仅在带宽使用上有了重大的提升,在降低延时上也有重大改进。内核版本 4.9 以后的Linux 操作系统都支持 BBR。

检查当前的 CCA 算法:

sysctl net.ipv4.tcp_available_congestion_control

应该报告:

net.ipv4.tcp_available_congestion_control = cubic reno

如果内核没有更新的话,在 Ubuntu 上可以用下面的命令更新内核:

sudo apt update
sudo apt install --install-recommends linux-generic-hwe-16.04

设置 BBR

修改 /etc/sysctl.conf 文件,添加以下两行:

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

运行:
sudo sysctl -p.

完工

GOLANG 的交叉编译以及 strip

交叉编译需要知道支持的 GOOS 以及 GOARCH,我们运行 go tool dist list 就可以得到支持的OS 以及硬件平台的组合

$ go tool dist list|paste - - - - -
aix/ppc64       android/386     android/amd64   android/arm     android/arm64
darwin/386      darwin/amd64    darwin/arm      darwin/arm64    dragonfly/amd64
freebsd/386     freebsd/amd64   freebsd/arm     js/wasm linux/386
linux/amd64     linux/arm       linux/arm64     linux/mips      linux/mips64
linux/mips64le  linux/mipsle    linux/ppc64     linux/ppc64le   linux/s390x
nacl/386        nacl/amd64p32   nacl/arm        netbsd/386      netbsd/amd64
netbsd/arm      openbsd/386     openbsd/amd64   openbsd/arm     plan9/386
plan9/amd64     plan9/arm       solaris/amd64   windows/386     windows/amd64
windows/arm

检查当前的环境变量设置:

$ go env GOOS GOARCH

编译时把 -s -w 传递进 ldflags 我们就可以得到 strip 的二进制文件,以下是 aliyun-cli 项目的编译

$ go build -ldflags "-s -w -X 'github.com/aliyun/aliyun-cli/cli.Version=3.0.37'" -o out/aliyun main/main.go

香橙派上,只要 export GOARCH=arm64 就可以编译成功 aliyun cli 了。 然后就可以通过命令行来自动注册香橙派的 DNS 了。

阿里云 DDNS 脚本

周末写了一个脚本, 可以把当前 IP 自动更新到阿里云上的 DNS 记录里面。
Github 地址

如果没有用过 aliyun cli,需要先去阿里云官网,下载 ,解压后,放到 /usr/bin 之类的。 然后设置 profile 。当然建议是 RAM 账户设置一个不能登录的 API 使用的子账户,然后生成 Access KeyID/Secret,就可以设置到这个 profile 里。
# aliyun configure –profile=”name”

脚本需要 jq 命令,如果没有安装过, 那当然是 yum/apt install jq 就可以。

需要重新编译 aliyun cli 到 ARM CPU 的路由器上, 编译一直报告https 错误,解决办法是:
export GOPROXY=https://goproxy.io
oh, 当然编译前,还有个开关要设置为: GO111MODULE=on

编译中待解决问题:
go version go1.12.10 linux/amd64

go get -u github.com/aliyun/aliyun-openapi-meta
go: finding github.com/aliyun/aliyun-openapi-meta latest
go get -u github.com/jteeuwen/go-bindata/...
go: finding github.com/jteeuwen/go-bindata/... latest
go get github.com/jteeuwen/go-bindata/...: no matching versions for query "latest"
make: *** [Makefile:9: deps] Error 1

以上问题已经解决, 采用官方办法,而不是 github 上的 make 命令。

certbot 基于 DNS 验证的自动证书更新

我们之前写过关于通配符域名的证书申请办法,但是没有写怎样自动化更新证书。有人已经写过一个这样的脚本,可以应用于阿里云,腾讯云以及 GoDaddy 的 DNS。 我们以 阿里云为例子,讲一个大概的流程。

把脚本 git clone 到本地,进入克隆目录后:
#  /usr/local/bin/certbot renew --cert-name 证书名 --manual --preferred-challenges dns --manual-auth-hook "`pwd`/au.sh php aly add" --manual-cleanup-hook "`pwd`/au.sh php aly clean"

简单来说,就是以上这句话,如果有问题, 就检查运行目录下的 cerbot.log 文件, 一般会遇到的就是 API Key 的权限有问题。 在阿里云上设置的 RAM 子账户确保有 DNSFullAccess 的权限。

当然, 相信你首先已经创建了这个账户的 AccessKey 以及 Secret 然后更新到 dns.cfg 文件。

我在上面的命令行里, 使用了 –cert-name 通过证书的名称,你当然也可以用 -d 直接指定域名来使用。

有了这个 au.sh 脚本,就等于可以自动化通配符证书的 renew 了, 不用像以前那样,每三个月,需要手工去跑,然后手工去更新 DNS 里的 TXT 记录。

感谢 Let’s Encrypt!

OpenWrt 命令行设置 WireGuard 配置

昨天在微信上发了一个视频教程,都是基于浏览器配置的。 原先的私钥已经泄露,所以,今天要修改一下演示里面的私钥。 我们直接在命令行里修改即可。

# 生成 key
# umask 077; wg genkey|tee privatekey|wg pubkey >publickey
# uci set network.wg0.private_key=$(cat privatekey)
# uci commit network
# /etc/init.d/network restart

# 如果是纯粹修改私钥,在 OpenWrt 端就做以上修改即可,如果需要修改其他 network 参数:
network.@wireguard_wg0[0]=wireguard_wg0
network.@wireguard_wg0[0].public_key='xxxx'
network.@wireguard_wg0[0].allowed_ips='0.0.0.0/0'
network.@wireguard_wg0[0].endpoint_host='endpoint.mydomain.com'
network.@wireguard_wg0[0].endpoint_port='51820'
network.@wireguard_wg0[0].persistent_keepalive='25'
network.@wireguard_wg0[0].route_allowed_ips='1'
network.wg0=interface
network.wg0.proto='wireguard'
network.wg0.private_key='private-key'
network.wg0.addresses='10.1.1.111/24'
#

把 OVA 虚拟机迁移到 Proxmox KVM 上

把 ova 解压,创建空虚拟机(不含磁盘),转换 .vmdk 格式为 qcow2,图形界面把磁盘绑定到虚拟机

# tar xvf xxxx.ova
设 vm ID 为 104, 虚拟机名称为 vpn-02,虚拟机类型为 Linux 
# qm create 104 --memory 1024 --net0 virtio,bridge=vmbr0 --name vpn-02 --serial0 socket  --bootdisk scsi0 --scsihw virtio-scsi-pci --ostype l26
设 导入的存储为  vmpool (名称), .vmdk 文件为 ova 文件解压后的虚拟机映像
# qm importdisk  104 ./VeeamPN-2.1.0.461-disk1.vmdk vmpool -format qcow2

这个虚拟机是 Veeam Power Network ,免费的 VPN 连接软件,但是导入到 Proxmox 后,Ubutu DHCP 不能自动起来,手工配置 IP 可以。 是因为 netplan 里的网卡配置的网卡硬件名写错了, 用 sed 修改后, DHCP 的 IP 就能自动启动了。
默认的 root 密码是 VeeamPN 。
然后 systemctl enable ssh 就可以开启 ssh , 进入 Web 界面按照用户手册来配置了。

WireGuard Ubuntu 上安装

$ sudo add-apt-repository ppa:wireguard/wireguard (Ubuntu 1910 之后不需要运行)
$ sudo apt install wireguard
$ sudo modprobe wireguard
$ sudo wg show

# 创建 Key Pair 
$ sudo -s
# cd /etc/wireguard; umask 077; wg genkey | tee privatekey | wg pubkey > publickey

服务器端,创建 /etc/wireguard/wg0.conf

[Interface]
PrivateKey = 私钥文本内容
# 服务器端 VPN VLAN 的 IP 地址,带掩码
# 确保 iptable 里面的 eth0 和自己使用的 网卡界面名一致
Address = 10.0.0.1/24, fd86:ea04:1115::1/64
ListenPort = 51820
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
SaveConfig = true

用 ufw 管理防火墙 ,并打开包转发

$ sudo ufw allow 22/tcp
$ sudo ufw allow 51820/udp
$ sudo ufw enable
$ sudo ufw status verbose
$ sudo wg-quick up wg0
$ sudo systemctl enable wg-quick@wg0
$ sudo wg show
$ cat << EOF >> /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
EOF
$ sysctl -p

以上为服务器配置完成,下面为客户端(可以是 Windows/Mac/iOS/Android等)创建配置文件:

先安装 qrencode 软件包, apt -y install qrencode,生成 png 文件发送给客户端扫码即可配置。

Todo: 部署客户端脚本

命令行下升级 Ubuntu 1904 到 1910

图形界面的升级就略过了,一台 kvm 虚拟机,之前跑 1904

$ lsb_release -a
$ sudo apt update && sudo apt dist-upgrade
$ sudo apt install update-manager-core
$ vim /etc/update-manager/release-upgrades
  修改 lts 为 Prompt=normal
$ sudo do-release-upgrade

中间会有一些交互问题,Yes/No,大概 半小时到一小时左右,升级就可以完成。最后一个 yes后,会自动重启。