启用 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.

完工

阿里云 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 命令。

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'
#

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后,会自动重启。

Ubuntu/Debian 修改任意 Mac 地址

有个叫做 macchanger 的软件包, 直接 apt install 即可

其实这个也是然并卵, ethtool -P eth0 就可以查看到物理 Mac 地址

有另外一篇文章说用 ethtool 就可以修改 eeprom 从而直接修改 Mac 地址。

然而, 这个需要 supports-eeprom-access = yes (运行 ethtool -i eth0), 如果网卡不支持的话,其实还是无解的。

至于其他办法用 dmidecode 等来获取 Mac 地址, 或许有效, 但是还不如 ethtool 直接。

结论, 要真的修改 Mac 地址,需要网卡支持,其他情况下,只是意淫修改一下 Mac 而已, 一条 ethtool -P 命令就能得到真实的 Mac 地址。(ethtool 是从 eeprom 里读取的)

用 qemu-nbd 命令 rescue Proxmox 下的 vm

一台 Ubuntu VM 修改了 vgname,启动不了了。 在 Proxmox 主机上,用以下命令挂接 VM 的磁盘:

# qm show 122 --pretty|grep drive // 查看 vmid=122 的磁盘路径
# modprobe nbd
# qemu-nbd -c /dev/nbd0 /mnt/pve/vmpool/images/122/vm-122-disk-0.qcow2
# fdisk -l // 验证 nbd 盘已经可以看到
# mount /dev/mapper/xingyun02-root /mnt
# chroot /mnt 

以上步骤就进入虚拟机根文件系统,直接可以对虚拟机操作了。 之后 umount , qemu-nbd -d ,然后 qm restart 120 就可以启动虚拟机了。

[How to] 怎样把 Proxmox 主机上的 USB 设备映射到虚拟机内

参考: https://pve.proxmox.com/wiki/USB_physical_port_mapping

把 USB 设备插入 PVE 主机后, dmesg 可以看到

假定虚拟机 ID 为 120,修改虚拟机配置文件: /etc/pve/qemu-server/120.conf,添加:

usb0: host=1-1.1.4

主机上 # qm stop 120; sleep 3; qm start 120 // 不是 qm restart
Ubuntu 的虚拟机内,默认 Kernel 没有 usbserial 模块,需要

sudo apt-get install linux-image-extra-virtual
sudo reboot
lsmod|grep usbserial
ls -al /dev/ttyUSB0

定制 curl 支持 –dns-servers 也就是 c-ares 异步 DNS 解析

操作系统默认安装的 curl 是不支持指定自定义的 DNS 服务器的。我们在一台有域名过滤的服务器上, 需要跑 curl ,要绕过系统默认的 DNS 解析器,所以,需要在命令行下指定自己的 DNS 解析服务器,这个需要 c-ares 支持。

# ./configure --enable-ares --enable-https --with-nghttp2  --with-librtmp=/usr/lib/x86_64-linux-gnu --with-gssapi --with-zlib --with-libssh2
如果不想删除原先的 curl 包的话,运行一下:
# ln -s /usr/local/lib/libcurl.so.4.6.0 /usr/lib/x86_64-linux-gnu/libcurl.so.4

跑 configure 之前,当然要先安装相关的 dev 包:
libnghttp2-dev, libc-ares-dev, libssh2-1-dev, librtmp-dev

接下来我们就可以用 curl 来分析网页的 title 来大概知道某个域名是做什么的:

# /usr/local/bin/curl -sS --dns-servers "114.114.114.114" http://www.tuchong.com/|xmllint --html --nowarning --xpath '//title' - 2>/dev/null|tr -d 'a-z<>'