Bird 配置 BGP Confederation,及模拟 Confederation(2020-06-07 更新)

更新记录2020-10-01:添加警告,模拟 Confederation 时不能在内网滤掉内部 ASN2020-06-07:添加 Bird Confederation 的局限,及模拟 Confederation 方法 2020-05-17:最初版本ISP 内部 BGP 互联方案比较互联网中各个 ISP(互联网服务提供商)绝大多数都使用 BGP 协议互相交换自己的路由信息。每个 ISP 都会从所在区域的网络信息中心(NIC,例如 APNIC,RIPE)获得一个 ASN(自治域编号),例如中国电信的 ASN 是 4134。然后 ISP 之间通过物理连接(铜缆,光纤,卫星网络等)连接各自的边界路由器,然后在边界路由器上配置 BGP 协议,告诉对方:「我是 AS4134,我这里可以访问到 202.101.0.0/18 这个 IP 段」。与中国电信相连的 ISP 的路由器会接力把这条消息广播下去:「我是 ASXXXX,我距离 202.101.0.0/18 有一格距离」,以此类推。各个 ISP 的路由器就会根据到目标的距离等参数,把数据包发送到对这个路由器来说最优的目标。(注:以上内容经过简化,...

x32 ABI 及相应 Docker 容器使用

x32 架构是怎么回事呢?x86、x86_64 架构相信大家都很熟悉,但是 x32 是怎么回事呢,下面就让小编带大家一起了解吧。x32 架构,其实就是 x86 和 x86_64 架构拼在一起,大家可能会很惊讶 x86 和 x86_64 架构怎么会拼在一起呢?但事实就是这样,小编也感到非常惊讶。x86 及 x86_64 的历史,以及 x32 ABI我们现在使用的个人计算机及服务器绝大多数都使用 x86_64 架构,该架构由 AMD 于 2000 年发布规范,2003 年发布第一块处理器。x86_64 是一个 64 位的架构,意味着在 x86_64 中,CPU 的每个寄存器都能保存 64 bit 的数据(即 8 个字节)。在 x86_64 流行之前,多数电脑都使用 Intel 处理器以及相应的 x86 架构 / 指令集,这是一个 32 位的架构,每个寄存器可以保存 32 bit 的数据(即 4 个字节)。64 位架构的一个显著好处是内存寻址能力的提升。计算机在访问内存时通常按照这样一个流程:将要访问的内存地址写入寄存器,...

写一个简单的 Telegram 机器人

应 DN42 Telegram 群群友的要求,我打算给我的 Bird Looking Glass 加上 Telegram Bot 的支持,方便群友现场查询 Whois、测试网络通断、检查漏油路由泄漏源头等。这个 Bot 要能识别以斜线 / 开头的命令,然后对命令消息进行回复。我的 Looking Glass 使用 Go 语言写成,因此我一开始先查找了 Go 语言的 Telegram Bot API。但流行的 API 库无一例外都遵循了同样的请求结构:Telegram 服务器发送一个回调到自己的服务器;自己的程序处理请求,期间可能根据本地配置的 Token 向 Telegram 服务器多次主动请求;自己的程序最终主动请求 Telegram 服务器,发送回复信息。这套方案功能强大,但有点复杂,而多余的功能我根本用不上。我更希望使用 Telegram 官方提供的另一种方式,直接回复回调 HTTP 请求的方式:Telegram 服务器发送一个回调到自己的服务器;自己的程序处理请求后,直接以 HTTP Response 方式回复回调请求,执行操作。...

去除 OpenVPN 的 Stable-privacy IPv6 地址

在我的 VPS 上,OpenVPN 创建的 TAP 网络界面 / 虚拟网卡会带有一个随机生成的 IPv6 地址,scope 为 stable-privacy。这个地址本身是随机生成、用于防止根据 IPv6 地址追踪用户的,但在 DN42 组网时,BGP 握手可能会从这个地址发出(而非设置的 Link-local 地址),然后因为来源地址不符而握手失败。解决方法是对这些 TAP 网络界面通过 sysctl 设置,关闭可能会自动产生地址的几项。可以设置 OpenVPN 让它在创建网络界面时自动运行 sysctl:# 在 OpenVPN 的 conf 文件里加上script-security 2up "/bin/sh -c '/sbin/sysctl -w net.ipv6.conf.$dev.autoconf=0 && /sbin/sysctl -w net.ipv6.conf.$dev.accept_ra=0 && /sbin/sysctl -w net.ipv6.conf.$dev.addr_gen_mode=1'"根据你的 Linux 发行版不同,可能需要调整 /bin/sh 和 /sbin/sysctl 的路径。...

在 OpenVZ 6 上安装 / 升级到 Debian 10

2020 年了,你怎么还在用 OpenVZ 6 的 VPS?因为它(们)只要一刀一年。因为 OpenVZ 6 的内核非常老旧(Linux 2.6.32),较新的系统无法在旧内核上正常运行,因此之前我的 OpenVZ VPS 只能用 Debian 8。但我在 GitHub 发现了一个修改版的 glibc(C 语言运行库),可以在 OpenVZ 6 内核上正常运行 Debian 10。警告不保证以下步骤适用于所有 OpenVZ VPS,也不保证这个 glibc 的安全性(我没看它修改了哪里,说起来停止维护的 OpenVZ 6 还要什么安全性)。请备份好数据,最坏的情况下你可能需要重装系统。安装步骤原作者只提供了 deb 包,但这些 deb 包里有调试符号之类一般人用不上的东西,所以不建议 dpkg -i *.deb。原作者建议自己在本地建一个简单的软件源再使用它,步骤如下:# 下载截至本文发布日的最新版本wget https://github.com/sdwru/glibc-debian-10/releases/download/2.28-9910.0/glibc_2.28-9910.0+custom1.1_amd64.deb.zipunzip glibc_2.28-9910....

Docker 容器共享网络命名空间,集成 Bird 实现 Anycast 高可用

正好一年前,我在 DN42 网络内用 Docker 建立了 Anycast 服务。当时我的方法是,自定义容器的镜像,在其中安装一个 Bird,然后加入 OSPF 协议的配置文件来广播 Anycast 路由。但是随着时间推移,这套方案出现了以下问题:安装 Bird 本身是个较花时间的过程。我的 Bird 不是用 apt-get 装的,因为我的 Dockerfile 需要支持多种 CPU 架构,而 Debian 有些架构的软件源里没有 Bird。而又因为我的构建服务器是 AMD64 架构,使用 qemu-user-static 支持其它架构的镜像运行,为其它架构制作镜像、编译程序时就涉及到大量的指令集翻译,效率非常低。构建一个镜像在不同架构下的版本可能需要 2 小时以上,而安装应用本身的 apt-get 流程只需要几分钟。自己定制镜像也比较花时间。因为容器中需要同时运行目标应用(例如之前的 PowerDNS)和 Bird,就不能直接把目标应用作为 ENTRYPOINT 了,而添加其它的管理程序(supervisord、s6-supervise、tini、自己写 Bash 脚本)...

系统禁用摄像头防止网课翻车

本文介绍如何在 Windows 和 Linux 中禁用摄像头驱动,从而:在系统层面上避免误操作开启摄像头,把你 在吃饭 在床上 在玩王者荣耀 在(数据删除) 的样子直播出来避免部分网课软件后台开启偷拍Windows 操作方法按下 Win+R 组合键调出运行窗口,输入 devmgmt.msc 并确定调出设备管理器窗口。你的摄像头会出现在 图像处理设备 一类中,右键停用它。(下图截自 Windows XP,但 Windows 7 和 10 上的操作相同。)当需要使用摄像头时,再回到此处启用摄像头,关闭并重新打开浏览器 / 网课软件即可。Linux 操作方法# 首先关闭浏览器、网课软件等占用摄像头的设备sudo modprobe -rv uvcvideosudo nano /etc/modprobe.d/disablecamera.conf# 输入如下内容并保存blacklist uvcvideo当需要使用摄像头时运行 sudo modprobe -v uvcvideo 加载驱动,用完后 sudo modprobe -rv uvcvideo 卸载驱动。加载 / 卸载后,关闭并重新打开浏览器 / 网课软件即可。...
插图

LADSPA 双声道分频及低音增强插件

今年过年期间,我爸给了我一只漫步者 M120 蓝牙音响。这只蓝牙音响并不是高端型号,只有两个扬声器,没有低音单元,并且也不支持 aptX、LDAC 这些高端的蓝牙音频编码技术。虽然我觉得便携音响用这些也听不出区别。我在用手机连上音响放歌时,发现这个音响竟然有一定的低频输出能力,或者说「能蹦」。说到能蹦,我就想到去年我的一个同学买的 JBL Charge 4 音响。Charge 4 作为一个 1000 块钱的蓝牙音响,有着独立低音单元,低音非常震撼。于是我就想,虽然我的蓝牙音响也就 100 块,能不能通过一些软件手段提升它的低音表现,做到和 Charge 4 」有点像「的程度呢?于是我就打开 Android 上的音效神器 - ViPER4Audio FX 音效软件,把」动态系统「里的低音拉高。此时,低音的确被增强了,但是扬声器开始出现了失真,具体表现为:当扬声器播放了一个低音鼓点后,播放的音量会降低一瞬间,这是受扬声器的机械结构所限。我本来打算对这个音响做一点改造,...

使用现代格式几乎无损地存档图片及视频 - H265 与 HEIF

很多人都会保存有每次参加旅游、聚会等活动,或是人生重要时刻的图片和视频。如果你很喜欢拍照和录视频,并且把它们都保存下来,你很有可能会飞快地塞满一块有一块的硬盘。如果你不想不停地加硬盘,你也可以尝试对你的图片和视频等进行压缩。说到压缩,常见的操作是降低图片的分辨率。我曾经用过的古老的 Microsoft Office Picture Manager(集成在 Office 2003 中)就带有一键图片压缩功能,实际上是将图片转换成分辨率约为 1024x768 的 JPEG 图片。这样操作的一个很大的缺陷,就是图片的大量细节信息完全丢失了。即使你在存档的当时觉得可以接受这些细节的丢失,但随着技术发展,这些丢失很可能有一天变得非常扎眼。例如,零几年时显示器的分辨率普遍为 1024x768,因此 Microsoft Office Picture Manager 将图片压缩到这个分辨率。而这些图片在现代的 1080p 乃至 4K 显示器上被放大,细节的丢失就会导致旧图片变得模糊,而这些损失是不可逆的。因此我希望,...
插图

使用 PowerDNS 的 Lua 功能自建分地区解析 GeoDNS

之前,如果要为自己的网站自建权威 DNS 系统,那么(几乎)唯一的选择是 PowerDNS 加上它的 GeoIP 后端。但是 GeoIP 后端使用的是 YAML 格式的配置文件,不能与 MySQL 等数据库一同使用。这意味着必须手动配置一套跨服务器同步文件的系统,而不能使用更为成熟的数据库同步技术。不过,PowerDNS 在最新的 4.2 版本中加入了 Lua 记录的支持。Lua 是一种专门用于「嵌入其它程序执行功能」的编程语言,你或许曾经在 nginx 上看到过它(作为一个插件)。Lua 记录支持使得 PowerDNS 可以根据用户查询请求的不同来返回不同的回答,分地区解析 GeoDNS 功能也就可以实现了。更新 PowerDNS最新的 PowerDNS 4.2 版本没有加入 Debian 10 的软件仓库中,你需要从 Debian Unstable 的软件仓库下载。但是由于 PowerDNS 依赖了一大堆新版的库文件,其中包括系统运行必须的库文件,...