盧盧快閉嘴 / 劉思达LOFTHESTAR - 猜不透 (說唱版)「如果忽遠忽近的灑脫 是你要的自由 那我寧願回到一個人生活」【動態歌詞/PinyinLyrics】♪

若月亮沒來 (若是月亮還沒來) - 王宇宙Leto/喬浚丞『若是晨風還沒來,晚風也可吹入懷』【動態歌詞】

【循环歌曲】《Bloody Mary》(Slowed Instrumental)“人们对Bloody Mary的开发程度不足百分之一”(无损音质) 彩礼视频一转买车BGM

《航天の小曲》《赛博の小曲》《人类进步の小曲》《群星の小曲》《高燃の小曲》 R3cover-Lazer Boomerang | Lazer Boomerang - R3cover (Original Mix)

《进步の小曲》《进部の小曲》《考公の小曲》鸳鸯戏 (DJ完整版) —— 略略略

MENTE MÁ - NAKAMA (Official Lyric Video) 刀马刀马

往期优秀作品推荐

2025年5月

Win10 22H2版本, 通过蓝牙连接音箱之后, 在操作系统内调整音量不起效果, 只能通过外接音箱上的音量调节改变音量大小…

找到一个类似的问题, 解决方案大概如下:

  1. 打开注册表管理器 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AVRCP\CT

  2. 找到DisableAbsoluteVolume值,修改为1,如果没有,右键新建DWORD32位,建立对应值。修改后重启

这样操作下来之后确实可以调整操作系统内音量了, 但是总感觉哪里不太对, 调整外部音箱的音量仍然会修改类似【音量上限】, 而操作系统内的音量总感觉是相对这个上限的某个百分比…

参考

解决WIN10 1803及以后版本的蓝牙音量(绝对音量)问题

  1. 复制远程文件到本地
1
rsync -avzP <远程主机IP>:<远程主机上的路径> <本地主机上的路径>

注意路径末尾的 /, 源末尾带 / 表示复制文件夹的内容而不是文件夹本身, 相当于少了一层. 目标末尾带 / 或者不带没有区别.

-a: archive mode, 尽量保留文件的各种属性

-v: 详细模式

-z: 压缩

-P: 显示进度

当传输不稳定时(导致ssh会话断开), 由于rsync默认会先创建临时文件并写入, 待同步完成后再重命名到目标文件, 当链接断开时远端rsync over ssh session可能还在继续运行, 因此还没有将临时文件重命名为目标文件, 此时再次发起同步会发现并没有续传而是重传了. 一种简单的解决办法是使用 --inplace 参数跳过rsync的这套机制, 直接创建目标名称文件且就地更新.

  1. 排除文件

例如仅同步 mp4 文件, 不处理其他任何文件.

1
rsync -avzP --include '*.mp4' --exclude '*' ...
  1. rsync daemon

在不能运行 ssh server 的时候 (比如WSL 1) 可以使用 rsync daemon, 通信不加密但在相对安全的内网环境下还算好用

需要先写一个最简单的配置文件 rsync.conf

1
2
3
4
5
6
7
port = 12000

[files]
path = <要分享的文件夹的绝对路径>
comment = SHARED LOCAL FILES
read only = true
timeout = 300

然后启动 rsync 服务器. 强制前台, 指定配置文件, 输出日志到控制台.

1
rsync --daemon --no-detach --config rsync.conf --log-file=/dev/stdout
  1. 客户端连接至 rsync daemon

客户端列出服务端分享了哪些文件

1
rsync -rdt rsync://<主机IP>:12000

会有类似这样的显示:

1
files        SHARED LOCAL FILES

同步文件方法与基于ssh链接使用方法一致:

1
rsync -avzP rsync://<远程主机IP>:<远程主机上的路径>/files/ <本地路径>

参考

rsync manpage

rsync tutorial

How to Set Up an Rsync Daemon on Your Linux Server

W&W & KSHMR - Bad (Official Music Video)

Deorro - Five Hours (Static Video) [LE7ELS]

攬佬SKAI ISYOUGOD【八方來財·因果】HD 高清官方完整版 MV 来财, 来

攬佬SKAI ISYOURGOD/AR劉夫陽【大展鴻圖】HD 高清官方歌词版MV 别墅里面唱K

白水寒 - 天真的橡皮(DJ林泽版)「人生呐 能不能放过我这一次」

卢润泽 - 别让爱凋落 (DJ抖音版) (Remix Tiktok) - DJ卡点节奏版 | 循环歌单🎧 || 《别让爱凋落》卢润泽:“My Love,请别让爱凋落”

【黄诗扶】“人是寻常人 遇谁才缤纷” | 《赴鸿门》(歌词PV) | 【排骨】赴鴻門

T-ARA (티아라) - NUMBER NINE (넘버나인) [Han/Rom/Eng] Color Coded Lyrics

精卫 (DJ抖音版) - 30年前、50年后『是现在我所有期待 所有的爱,为什么不明白 说的话为什么不记得 为什么不记得。』♪ || 一听就上头的神曲 | 抖音热门歌曲 | 抖音 | TikTok

DJ Project Regrete (拼音师混音版)

[Edit] CMon - DJ Sok - 给我闹 - DouYinBGM 2025 美式追逐的小曲 给我闹 | (ko bản quyền)《美警追车の小曲》CMon-DJ Sok | Arash feat. Sean Paul - She Makes Me Go (Official Video)

10. Basshunter - I Can Walk On Water

往期优秀作品推荐

2025年2月-3月

Ubuntu Server 22.04, 24.04 LTS版本下, 有一部分ip route, ip rule是通过脚本添加的, 但是周期性会消失, 有时apt upgrade, apt install 也会莫名其妙的丢失. 查了一圈发现到一个非常类似的问题:

Something deletes my ip rules

结果发现是systemd-networkd的操作删除了不受其管理的路由和规则, 顺带又发现了若干个Issue:

Pod routing policies deleted by systemd #1600 - aws/amazon-vpc-cni-k8s

network: add ManageForeignRoutingPolicyRules= boolean setting #19287 - systemd/systemd

解决方案如下:

判断systemd版本: systemd --version

编辑networkd配置文件: /etc/systemd/networkd.conf

1
2
3
4
5
6
7
8
[Network]
#SpeedMeter=no
#SpeedMeterIntervalSec=10sec
#ManageForeignRoutingPolicyRules=yes
#ManageForeignRoutes=yes
#RouteTable=
#IPv6PrivacyExtensions=no
...

修改为:

1
2
ManageForeignRoutingPolicyRules=no
ManageForeignRoutes=no

然后重启networkd:

1
2
3
4
sudo systemctl daemon-reload
sudo networkctl reload
# 或者
sudo systemctl restart systemd-networkd

PS: 一大早上被警报叫起来说网络出问题了结果查了半天发现是systemd的问题, 我只能说大家讨厌systemd不是没有原因的 :-|

在一个包含多个跃点的网络中建立若干条GRE隧道, 如果隧道是从网络外的一侧通往网络外部的另一侧, 且通往网络外部的一侧配置了NAT, 那么会遇到比较头疼的问题.

首先我们知道, 对于conntrack来说, 确立一条”连接”需要五个因素: 协议, 源IP, 源端口, 目标IP, 目标端口, 而GRE协议没有端口的, 所以对于conntrack来说如果源IP目标IP一致, 就会认为是同一条隧道. 进而表现为同一时间只有一个GRE隧道能通过NAT且有流量.

但是当我们打开RFC文档, 不难发现即使是最早的RFC 1701版本中也规定了一个key field可以用来在源IP, 目标IP都相同的时候用来给两侧终端区分不同链接. 后续新版的GRE协议, 也有RFC 2890给出了针对GRE协议的key field扩展, 而且与RFC 1701的协议是兼容的. 那为什么conntrack不把key加入到用来区分不同链接的因素中呢?

带着这个疑问, 让我们打开Linux源码(狗头):

net/netfilter/nf_conntrack_proto_gre.c 中, gre_pkt_to_tuple是用来解析GRE报文并提取链接要素的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* gre hdr info to tuple */
bool gre_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,
struct net *net, struct nf_conntrack_tuple *tuple)
{
const struct pptp_gre_header *pgrehdr;
struct pptp_gre_header _pgrehdr;
__be16 srckey;
const struct gre_base_hdr *grehdr;
struct gre_base_hdr _grehdr;

/* first only delinearize old RFC1701 GRE header */
grehdr = skb_header_pointer(skb, dataoff, sizeof(_grehdr), &_grehdr);
if (!grehdr || (grehdr->flags & GRE_VERSION) != GRE_VERSION_1) {
/* try to behave like "nf_conntrack_proto_generic" */
tuple->src.u.all = 0;
tuple->dst.u.all = 0;
return true;
}

/* PPTP header is variable length, only need up to the call_id field */
pgrehdr = skb_header_pointer(skb, dataoff, 8, &_pgrehdr);
if (!pgrehdr)
return true;

if (grehdr->protocol != GRE_PROTO_PPP) {
pr_debug("Unsupported GRE proto(0x%x)\n", ntohs(grehdr->protocol));
return false;
}

tuple->dst.u.gre.key = pgrehdr->call_id;
srckey = gre_keymap_lookup(net, tuple);
tuple->src.u.gre.key = srckey;

return true;
}

可以看到这里 判断了GRE包是否的GRE_VERSION bit 是否不是 GRE_VERSION_1, 这个宏的定义在 include/uapi/linux/if_tunnel.h:

1
2
3
#define GRE_VERSION_0		__cpu_to_be16(0x0000)
#define GRE_VERSION_1 __cpu_to_be16(0x0001)
#define GRE_PROTO_PPP __cpu_to_be16(0x880b)

为什么会有 GRE_VERSION_1 呢? 在RFC 2784中可以找到答案:

1
2
3
4
5
7.1.  GRE Version Numbers

This document specifies GRE version number 0. GRE version number 1 is
used by PPTP [RFC2637]. Additional GRE version numbers are assigned
by IETF Consensus as defined in RFC 2434 [RFC2434].

所以这里conntrack的逻辑是, 只要是普通的GRE协议, 就直接返回. 只有当协议是PPTP的时候才会提取key字段. 这也就解释了为什么同一时间只能有一个有效的GRE隧道.

1
gre      47 169 src=<redacted> dst=<redacted> srckey=0x0 dstkey=0x0 src=<redacted> dst=<redacted> srckey=0x0 dstkey=0x0 [ASSURED] mark=0 use=1

如此看来唯一的解决办法就是绕过Conntrack, 使用如下命令:

1
iptables -t raw -A PREROUTING -p gre -j NOTRACK

注意这会让GRE协议跳过conntrack, 也不会进入nat表, 因此在网络外侧的接收点需要手动或其他方式来配置到网络另一侧节点的IP路由. (原来的时候remote只需要写出网边缘节点的IP即可)

驱动文件由zadig/libwdi生成

需要先安装Visual Studio 2022, Windows SDK, Windows Driver Kit (WDK), 参考: 下载 Windows 驱动程序工具包 (WDK)

inf2cat, signtool 等工具建议在 Developer Command Prompt for VS 2022中操作

  1. 生成自签证书
1
New-SelfSignedCertificate -Subject "CN=<Name>" -CertStoreLocation "Cert:\CurrentUser\My" -KeyAlgorithm RSA -KeyLength 4096 -HashAlgorithm SHA256 -NotBefore (Get-Date) -NotAfter (Get-Date).AddYears(10) -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.17={text}email=<email>") -KeyUsage None

关于 New-SelfSignedCertificate,参考:New-SelfSignedCertificate (PKI) | Microsoft Learn

其中 2.5.29.37 是增强型密钥用法(enhanced key usage), 1.3.6.1.5.5.7.3.3 是代码签名(code signing). 2.5.29.17 是使用者可选名称(subjectAltName). New-SelfSignedCertificate 命令有一个 -DNSName 参数似乎不支持email这样细粒度级别的配置.

另外命令还支持 -Type 参数, 指定为 CodeSigningCert 时生成出来的证书, “增强型密钥用法”前面会有一个叹号, 不确定是为什么所以最后改成TextExt这种模式了.

-KeyUsage None 可以避免证书附带上默认用途.

  1. 导出为PFX文件
1
2
$password = ConvertTo-SecureString -String "<redacted>" -Force -AsPlainText
Export-PfxCertificate -Cert "Cert:\CurrentUser\My\<Thumbprint>" -FilePath "<filename>" -Password $password
  1. 生成catalog文件
1
inf2cat /v /driver:<dir> /os:XP_X86,XP_X64,Vista_X86,Vista_X64,7_X86,7_X64

注意,这里的/os 参考: Inf2Cat - Windows drivers | Microsoft Learn

一份更全的列表可以参考: Inf2Cat 工具

这个os字符串是根据zadig/libwdi生成出来的catalog文件的安全目录OSAttr属性推出来的,OSAttr列表参见:List of Microsoft Windows versions - Wikipedia

libwdi源码中使用的是 7_X86,7_X64,8_X86,8_X64,8_ARM,10_X86,10_X64,10_ARM 但用这个字符串签出来的文件不太对, 不是很确定原因.

若要使用_ARM参数, 需要保证安装了对应架构的构建工具, 否则inf2cat会报错参数错误.

  1. 对catalog文件签名
1
signtool sign /fd SHA256 /f "<pfx file path>" /p <redacted> /t http://timestamp.digicert.com <cat file path>
  1. 导出一个CA证书cer文件随安装包发行
1
Export-Certificate -Cert "Cert:\CurrentUser\My\<Thumbprint>" -FilePath "<filename>"
  1. 打包,制作自动安装脚本 install-drivers.bat

因为certutil需要用admin权限, 加一段自动提权UAC

1
2
3
4
5
6
7
8
9
10
11
@echo off
:: Check for admin rights
NET SESSION >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
echo Requesting Administrator privileges...
powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/c %~fnx0'"
exit
)

C:\Windows\System32\certutil.exe -addstore -enterprise -f -v root "%~dp0\DriverSigner.cer"
C:\Windows\System32\InfDefaultInstall.exe "%~dp0\drivers.inf"

最近在给办公室配置网络, 要求访问国内网站时走国内DNS解析+国内运营商直出, 访问国外网站时走国外DNS解析+专线转发.

流量分流

整体思路上是根据IP段/CIDR进行分流, 由于主要访问国内网站, 整理了一份海外IP列表. 命中列表的IP请求走专线转发.

创建ipset: ipset create overseas hash:net 其中 overseas 是名字, 可以修改为别的.

添加IP段到ipset中: ipset add overseas 1.1.64.0/18

使用iptables标记流量, 这里的 2 是对流量添加的 fwmark, 可以选择任意值.

1
2
3
iptables -t mangle -A PREROUTING -m set --match-set overseas dst -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -m set --match-set overseas dst -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -m mark --mark 2 -j MASQUERADE

添加一个独立的路由表, 将默认路由修改为专线. 这里的 55 是 TableID, 可以选择任意值.

1
ip route add default via 10.10.0.1 table 55

添加ip rule, 将fwmark和路由表关联起来:

1
ip rule add fwmark 2 table 55

这样, 从本机和其他网络传递过来的包, 如果命中海外IP列表就会走专线转发. 注意, 如果要给其他网络提供功能(即作为路由器), 需要添加NAT, 即:

1
2
sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -o <通往互联网的网卡> -j MASQUERADE

这样发往互联网的数据包的源IP就是互联网网卡的IP, 而不是内网IP.

DNS分流

可选的方案有CoreDNS, Dnsmasq, Pihole, BIND9, PowerDNS等等. 在权衡之后选择了BIND9方案.

(Github上有一个SmartDNS项目也可以实现类似的功能, 但是多重考虑下使用了比较原始的方案)

  1. 安装BIND9
1
sudo apt update && sudo apt install bind9 bind9utils bind9-doc
  1. 编写配置文件 /etc/bind/named.conf.options

注意, 这个配置关闭了DNSSEC. 不然会出现类似 broken trust chain resolving 'github.com/A/IN': 8.8.8.8#53 的报错. (当然更好的解决办法是配置DNSSEC)

默认使用了腾讯云, 阿里云, 114的公共DNS. 日志输出到了syslog, 可以通过 journalctl 检索.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
options {
directory "/var/cache/bind";

dnssec-validation no;

listen-on-v6 { any; };

max-cache-size 512M; // Limit cache size to prevent memory overuse
max-cache-ttl 86400; // Maximum time to keep cached records (1 day)
max-ncache-ttl 3600; // Negative caching time (1 hour)

recursion yes;
allow-recursion { any; };

forwarders {
119.29.29.29; 223.5.5.5; 114.114.114.114;
};

forward only;
};

logging {
channel default_log {
# file "/var/log/named.log";
syslog daemon;
severity debug;
print-time yes;
};
category queries { default_log; };
};
  1. 编写Zone文件 /etc/bind/named.conf.whitelist-zones
1
2
3
4
5
6
7
8
9
10
11
zone "docker.com" {
type forward;
forward only;
forwarders { 8.8.8.8; 1.1.1.1; };
};
zone "github.com" {
type forward;
forward only;
forwarders { 8.8.8.8; 1.1.1.1; };
};
...

可以通过python脚本比较方便的生成zone文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import subprocess
import traceback


with open("domains.txt") as f:
content = f.read()

lines = content.split('\n')
lines = list(set([line.strip() for line in lines if line and not line.strip().startswith('#')]))
print("{} domains imported".format(lines))

with open("/etc/bind/named.conf.whitelist-zones", "w") as f:
for line in lines:
f.write(f'''zone "{line}" {{
type forward;
forward only;
forwarders {{ 8.8.8.8; 1.1.1.1; }};
}};
''')

print("New config generated. Validating...")
subprocess.check_call(["named-checkconf", "/etc/bind/named.conf"])

print("Reloading DNS server...")
subprocess.check_call(["systemctl", "reload", "named"])

print("Reload complete. Showing latest logs... (Ctrl+C to close)")
subprocess.call(["journalctl", "-t", "named", "-f"])
  1. 重启BIND服务器以使配置生效
1
sudo systemctl restart named

如果配置没有问题的话可以看到named输出的日志:

1
2
3
4
5
6
7
Mar 05 13:36:19 office-server named[6387]: managed-keys-zone: loaded serial 7
Mar 05 13:36:19 office-server named[6387]: zone 255.in-addr.arpa/IN: loaded serial 1
Mar 05 13:36:19 office-server named[6387]: zone 0.in-addr.arpa/IN: loaded serial 1
Mar 05 13:36:19 office-server named[6387]: zone 127.in-addr.arpa/IN: loaded serial 1
Mar 05 13:36:19 office-server named[6387]: zone localhost/IN: loaded serial 2
Mar 05 13:36:19 office-server named[6387]: all zones loaded
Mar 05 13:36:19 office-server named[6387]: running

有解析请求时会输出日志:

1
Mar 05 13:37:16 office-server named[6387]: 05-Mar-2025 13:37:16.472 client @0x7a7f2c005368 <...>#25256 (main.vscode-cdn.net): query: main.vscode-cdn.net IN A + (...)

可以通过以下命令来测试DNS响应

1
dig +short @127.0.0.1 baidu.com

参考

dnsmasq ipset iptables 实现对流量进行分流 很棒的文章,思路很清晰一下就明白了

How To Configure BIND as a Private Network DNS Server on Ubuntu 20.04

巧用 DNS 实现国内外域名 ip 分流上网

Openwrt使用SmartDNS进行国内外DNS分流,提高访问速度,防止DNS污染和泄露。

『MV』Annie Lowdermilk - Fall | 落 (花開花落日升日沒) - 唐伯虎Annie

常石磊 - 你知道我在等你吗 - (Dj阿福 ProgHouse Remix 2023) - Ni Zhi Dao Wo Zai Deng Ni Ma #dj抖音版2023

你若三冬(DJ版)-冯纫机【你若三冬来 换我一城雪白 相思风中开】2024热门音乐

黄梅戏

探故知 (DJ炎炎版)

X-Coast — Da Boing Boing Trak

Once Upon A Time (House Extended Mix)

往期优秀作品推荐

2024年11月