LiteServer Project Minecraft 主站
LiteServer Project Minecraft 国际站
友链: 白天的小站
Strongswan侧的配置与之前写的 通过BGP与Google Cloud Router建立高可用链接 文中的过程, 使用到的脚本基本上保持一致, 本文主要介绍FortiGate侧的配置步骤.
目前正在使用的FortiOS版本为 v7.0.17
登录FortiGate, 选择 VPN -> IPSec Tunnels, 点击 Create New, 在下拉菜单中选择 IPSec Tunnel
会自动打开 IPSec Wizard. Template type 选择 Custom, 填写一个名字, 然后点下一步
在打开的新页面中, Network部分做如下配置:
Remote Gateway 选择 Static IP Address, IP Address 填入对端的地址, Interface 选择外网直接的接口, 勾选 Local Gateway 并选择 Primary IP.
NAT Traversal 调整至 Enable
Dead Peer Detection 调整至 On Idle
Advanced 菜单展开, 确保 Add Route 选项是 Enabled
配置 Authentication
Method 选择 Pre-shared Key, 填入 PSK
IKE Version 调整至 2
配置 Phase 1 Proposal
删掉不需要的Encryption配置, 保留 Encryption: AES256GCM, PRF: PRFSHA512.
Diffie-Hellman Group 注意只勾选需要的组.
配置 Phase 2 Selectors
Local Address 选择 Subnet, 0.0.0.0/0.0.0.0
Remote Address 选择 Subnet, 填入端到端的IP. /24 CIDR 段使用 255.255.255.0 作为 mask, /30 CIDR 段使用 255.255.255.252.
展开 Advanced, 去掉不需要的 Encryption, 保留 AES256GCM
确保 Enable Replay Detection 勾选
确保 Enable Perfect Forward Secrecy (PFS) 勾选
Diffie-Hellman Group 注意只勾选需要的组.
点击 OK 保存配置, 回到 IPsec Tunnels 页面, 点击新的隧道一行的 Status 列, 在新打开的页面中, 找到对应的隧道(会高亮), 右键 在打开的菜单中选择 Bring Up -> All Phase 2 Selectors
打开 Policy & Objects -> Firewall Policy, 配置防火墙策略
打开 Policy & Objects -> Central SNAT, 配置出网NAT
打开 Network -> Static Routes, 将端到端的IP CIDR添加为静态路由.
打开 Network -> DNS Servers, DNS Service on Interface 栏点击 Create New, 在新打开的页面中 Interface 选择新创建的隧道, Mode 选择 Recursive, 点击 OK 保存配置
(可选) 打开 Network -> Interfaces, 找到新创建的隧道, 双击打开新页面. 在 Address 栏中, IP 填入端到端的本端IP, 注意不需要填写CIDR后缀或mask. 对端IP填写端到端的对端IP+mask, 使用空格分开.
Route-Based VPN Tunnel FortiGate <-> Cisco ASA
Phase 2 configuration | FortiGate / FortiOS 7.6.4 | Fortinet Document Library
因为不是很想把PBS放到NAS或者另外的单独设备上, 目前打算把PBS作为一个VM装在PVE里, 然后这个VM单独走PVE的SMB Backup (磁盘分20G应该足够了) 其他的VM走PBS做备份, 这样可以享受PBS提供的差分备份方案.
唯一的问题在于PBS默认是不支持SMB的, 目前只支持本地磁盘, 可移动设备, S3存储(实验性). 所以大概的思路就是先进shell手动mount一下然后再作为”本地磁盘”添加datastore.
1 | apt install cifs-utils |
编辑 /etc/fstab
, 添加smb mount point
1 | //<NAS地址>/pbsbackup /mnt/nas-store cifs vers=3.0,iocharset=utf8,file_mode=0777,dir_mode=0777,uid=backup,gid=backup,username=<SMB用户名>,password=<SMB密码> 0 0 |
使挂载生效
1 | systemctl daemon-reload |
回到PBS web端, 添加datastore的时候, backing path 填写 /mnt/nas-store
即可.
盧盧快閉嘴 / 劉思达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) 刀马刀马
Minecraft 1.18 New Music Disc “otherside”
ATLXS - PASSO BEM SOLTO (SLOWED) | ATLXS - PASSO BEM SOLTO (SLOWED) so bay so~
热歌新好听版!浮生未歇:不能不想你,挣扎在爱与痛的缝隙!4K无损好视听 我只能在爱与痛之间喘息 不能不想你(好听版)
Win10 22H2版本, 通过蓝牙连接音箱之后, 在操作系统内调整音量不起效果, 只能通过外接音箱上的音量调节改变音量大小…
找到一个类似的问题, 解决方案大概如下:
打开注册表管理器 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AVRCP\CT
找到DisableAbsoluteVolume值,修改为1,如果没有,右键新建DWORD32位,建立对应值。修改后重启
这样操作下来之后确实可以调整操作系统内音量了, 但是总感觉哪里不太对, 调整外部音箱的音量仍然会修改类似【音量上限】, 而操作系统内的音量总感觉是相对这个上限的某个百分比…
1 | rsync -avzP <远程主机IP>:<远程主机上的路径> <本地主机上的路径> |
注意路径末尾的 /
, 源末尾带 /
表示复制文件夹的内容而不是文件夹本身, 相当于少了一层. 目标末尾带 /
或者不带没有区别.
-a
: archive mode, 尽量保留文件的各种属性
-v
: 详细模式
-z
: 压缩
-P
: 显示进度
当传输不稳定时(导致ssh会话断开), 由于rsync默认会先创建临时文件并写入, 待同步完成后再重命名到目标文件, 当链接断开时远端rsync over ssh session可能还在继续运行, 因此还没有将临时文件重命名为目标文件, 此时再次发起同步会发现并没有续传而是重传了. 一种简单的解决办法是使用 --inplace
参数跳过rsync的这套机制, 直接创建目标名称文件且就地更新.
例如仅同步 mp4
文件, 不处理其他任何文件.
1 | rsync -avzP --include '*.mp4' --exclude '*' ... |
在不能运行 ssh server 的时候 (比如WSL 1) 可以使用 rsync daemon, 通信不加密但在相对安全的内网环境下还算好用
需要先写一个最简单的配置文件 rsync.conf
1 | port = 12000 |
然后启动 rsync 服务器. 强制前台, 指定配置文件, 输出日志到控制台.
1 | rsync --daemon --no-detach --config rsync.conf --log-file=/dev/stdout |
客户端列出服务端分享了哪些文件
1 | rsync -rdt rsync://<主机IP>:12000 |
会有类似这样的显示:
1 | files SHARED LOCAL FILES |
同步文件方法与基于ssh链接使用方法一致:
1 | rsync -avzP rsync://<远程主机IP>:<远程主机上的路径>/files/ <本地路径> |
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
[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
Ubuntu Server 22.04, 24.04 LTS版本下, 有一部分ip route
, ip rule
是通过脚本添加的, 但是周期性会消失, 有时apt upgrade
, apt install
也会莫名其妙的丢失. 查了一圈发现到一个非常类似的问题:
结果发现是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 | [Network] |
修改为:
1 | ManageForeignRoutingPolicyRules=no |
然后重启networkd:
1 | sudo systemctl daemon-reload |
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 | /* gre hdr info to tuple */ |
可以看到这里 判断了GRE包是否的GRE_VERSION
bit 是否不是 GRE_VERSION_1
, 这个宏的定义在 include/uapi/linux/if_tunnel.h
:
1 | #define GRE_VERSION_0 __cpu_to_be16(0x0000) |
为什么会有 GRE_VERSION_1
呢? 在RFC 2784中可以找到答案:
1 | 7.1. GRE Version Numbers |
所以这里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 | 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 | $password = ConvertTo-SecureString -String "<redacted>" -Force -AsPlainText |
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 | signtool sign /fd SHA256 /f "<pfx file path>" /p <redacted> /t http://timestamp.digicert.com <cat file path> |
1 | Export-Certificate -Cert "Cert:\CurrentUser\My\<Thumbprint>" -FilePath "<filename>" |
因为certutil
需要用admin权限, 加一段自动提权UAC
1 | @echo off |