方寸间 - 笔记•记录
type: channel
link: https://10101.io/category/%E7%AC%94%E8%AE%B0%E8%AE%B0%E5%BD%95/
items: Netbird Relay 部署记录
items: Netbird Proxy + Nginx 部署记录
items: Ceph 集群迁移 (修改 IP 地址) 记录
items: Ceph 分布式存储系统搭建小记
items: Systemd 配置网络接口 | Arch Linux 使用小记
items: Arch Linux 安装篇 | Arch Linux 使用小记
items: Tmux 使用小记
items: WireGuard NAT-to-NAT 实践
items: 关于 Windows Terminal、WSL 和 VSCode 的一点记录
items: Manjaro 配置记录

Netbird Relay 部署记录
type: item
date: 2026-07-06T11:29:00+00:00
description: 前言最初 netbird 的 management/signal/coturn/relay 等服务是独立的，后来为了方便部署使用，统一成了一个 netbird-server，但也保留了独立部署服务的能力（提高性能和高可用），根据 官方文档 所述，relay/signal 均可以独立部署。我使用 netbird 主要为了国外服务器之间的互联，都有公网 IP，其实对 relay 服务器需求不是那么高，但是折腾的心按捺不住。同 Netbird Proxy + Nginx 部署记录 中所述，我需要基于 nginx 进行部署，不过 relay 倒是不像 proxy 有 TLS 透传要求，比较简单，随便记录一下吧。部署注意：当前如果指定了外部 relay 服务器的话，那 netbird-server 内置的 relay 服务器就不会生效了，预计后续会支持共存 (见 issue #5351)生成 authSecretopenssl rand -base64 32注意：该密钥生成一次即可，所有的 relay server 需要共享相同的密钥部署 relay 服务如前言所说，我需要使用 nginx 来处理 TLS，但是呢，官方文档提供的说明中，又是让 relay server 来处理 TLS，要么采用 ACME 申请证书，要么提供证书文件。但是看 relay server 的作用，本身提供的能力有两个：STUN 服务（UDP，用于 p2p 发现）Netbird Relay (quic/ws，http 服务，用于流量中转)就服务而言，没有必要非得要在 relay server 上进行 tls 终结。实际操作了下，确实如我所想。准备环境变量准备环境变量文件 relay.env，文件内容示例如下：NB_LOG_LEVEL=info # relay server 监听的地址，容器部署，该端口为容器内监听端口，保持 443 无所谓 NB_LISTEN_ADDRESS=:443 # 实际 client 需要连接的 relay 地址 NB_EXPOSED_ADDRESS=rels://relay.netbird.10101.io:443 # 生成的 authSecret NB_AUTH_SECRET=XprUtOMCVMdVYFdjLJqNl5mW+RUWyXjyJDgpoZhX0c8= # Embedded STUN (comma-separated for multiple ports, e.g., 3478,3479) NB_ENABLE_STUN=true NB_STUN_PORTS=3478这里去掉了官方示例中的证书相关环境变量，即不让 relay server 来处理 tls，仅对外提供 http 服务和 stun 服务。保证 NB_EXPOSED_ADDRESS 为实际 client 需要连接的地址即可。docker-compose依旧采用 docker-compose 进行部署，relay docker-compose.yaml 内容如下：services: relay: image: netbirdio/relay:latest container_name: netbird-relay restart: unless-stopped networks: [netbird] ports: # 监听在 127.0.0.1:33080，不占用 443 端口 - '127.0.0.1:33080:443' # 暴露所有的 NB_STUN_PORTS，具体定义在环境变量文件 relay.env 中 - '3478:3478/udp' env_file: # 使用环境变量文件 - relay.env volumes: - ./relay_data:/data logging: driver: "json-file" options: max-size: "500m" max-file: "2" networks: netbird: ipam: config: - subnet: 172.30.0.0/16 gateway: 172.30.0.1启动服务：docker compose up -d # 查看日志，确保正常启动并监听 docker compose logs relay服务正常启动后，就可以使用 nginx 反代服务了，这里就不赘述了。配置 netbird-serverrelay server 启动后，还需要在 netbird-server 的配置文件中增加 relay 的配置，才能正确下发给 client。编辑 config.yaml文件，增加 relay 和 stun 配置，示例如下： # External STUN servers st…

Netbird Proxy + Nginx 部署记录
type: item
date: 2026-06-24T14:21:00+00:00
description: 前言之前有用 wireguard 来做服务器间的互联（服务暴露），但是一直都是手动配置的，有些繁琐。遂有考虑服务器间的 full mesh 互联方案，偶然间了解到了 netbird，基于 wireguard 的零信任方案，对比 tailscale，服务端/客户端全开源，果断选择了它。netbird 的整个部署过程，早期还是比较繁琐的，主要还是 IDP 部分，坑很多，当初自建颇费了一番功夫。不过随着发展，目前部署已经相当方便了。之前想着写文章记录下的，但是太懒了搁置了（看我更新频率就知道了 (）。然后前段时间 netbird 更新了 reverse-proxy 功能，我感觉还是很方便的：基础反向代理功能，支持 L4/L7 代理；支持自动申请证书；相同的 proxy 域名自动组成 cluster，可以在不同区域部署多个 proxy 实例，结合分区域解析的 DNS 可以快速构建一个简单的类 CDN 的加速方案；支持增加各种认证，保护后端服务刚好，这两天又搞了个 netbird-proxy 实例，那就……记录下吧。限制反代 http/https 服务的话，由于 netbird-proxy 对外提供 HTTPS，且必须要在 netbird-proxy 上进行证书验证（它目前要么通过 ACME 自动申请，要么提供泛域名证书），所以 netbird-proxy 之前如果还有代理的话，必须进行 tls 透传。目前官方是要求使用 traefik，但是我习惯了使用 nginx，也有一些服务已经依托于 nginx 了，所以不想切换到 traefik，所以本文也是基于 nginx 做前置进行部署。另外，对于多个 proxy 实例，由于每个实例都是自助进行证书申请的，那么在需要反代的 service 很多、实例很多的时候，很大概率会达到 Lets‘ Encrypt 的速率限制。官方建议使用泛域名证书，但是却只能指定一个证书，我有多个域名，并不想合并到一个证书中，这个方法行不通。本来想了一个方案，一个主 proxy 负责证书申请，然后同步到其他 proxy 中，但是发现若关闭了 proxy 的自动证书申请，那它就自动要读取本地的泛域名证书，没有的话 proxy 压根就跑不起来了，路又被堵住了。 ~目前这个没想到什么好办法解决，暂时控制下 proxy 数量，看看后续 netbird 是否提供更好的方案~ 。官方在 BYOP 文档中 提到了多个 proxy 使用共享网络存储存放证书，会通过 cross-replica lock 来尽量确保一致性，但是 flock 在共享存储中并不可靠（取决于共享存储实现），感觉也不是很优秀的方案。[scode type="green" size=""]测试了下 NFSv4, flock 锁应该是有效的，暂时可以采用 NFS 共享 certs 目录来解决证书更新的问题。不过还是更希望官方能有一个中心化的证书管理方案，比如通过 management server 来统一负责证书的申请和分发[/scode]部署过程Nginx 透传 TLSnetbird-proxy 本身完全可以自己独立工作（监听 443 端口），但由于我有一些需求需要通过 nginx 实现，所以要考虑这俩共存。在限制一节中已经提到，netbird-proxy 需要其前的代理透传 TLS，但是 nginx 的 http 块是不支持 TLS 透传的，需要采用 stream 模块进行 L4 代理。但是，同时，也要确保 http 块的反代请求正常。所以，方案如下：使用 stream 模块，监听所有的 443 端口请求；根据 sni 进行分流：需要 nginx http 反代的走 nginx http 监听端口；需要 netbird proxy 反代的走 netbird proxy 监听端口具体的配置示例如下：# 省略部分内容，请勿直接复制使用，根据实际情况修改 # ========================================================================= # 1. STREAM 块 (负责 443 端口的四层 SNI 分流) # ========================================================================= stream { # 开启 SNI 预读 ssl_preread on; # 根据域名映射后端 map $ssl_preread_server_name $stream_map { netbird.10101.io nginx_http_backend; default netbird_proxy_backend; # 默认透传给 netbird…

Ceph 集群迁移 (修改 IP 地址) 记录
type: item
date: 2026-01-16T08:23:35+00:00
description: 机架整体迁移到新机房后，IP 地址发生变更，所有 ceph 节点都需要更新 IP 地址。由于操作时未能一一记录，只能凭记忆大致还原整个过程。本 Ceph 集群使用 cephadm 进行管理。[scode type="yellow" size=""]仅作个人折腾记录，生产环境请谨慎[/scode]原网络如下：public network：10.182.65.0/24cluster network: 10.90.90.0/24cluster network 在一个单独 vlan 中，可以不动，只需要修改 public network。最开始的思路是，10.182.65.0/24 网段保留（由于该网段无法公开访问，放在一个 vlan 中），增加新的 public network，这样假如可以访问到 10.182.65.0/24 网段，直接用该网段即可（因为该 vlan 所在链路带宽更大），无法访问到该网段则使用新的 public network。但是实际操作下来发现，虽然 osd 节点监听在 0.0.0.0，但实际上报给 MON 的只有一个 IP（可以通过 ceph osd dump 看到具体 IP），由于原网段和新网段无法互联，导致可能出现 ceph 客户端无法访问 osd 的情况。所以，最后只能全部替换掉原 public network，迁移后网络如下：public network：10.184.17.0/2410.184.18.0/24cluster network: 10.90.90.0/24环境准备将集群中所有主机原 public network 接口放入同一个 vlan 中，然后新增一个接口，配置新的 public network 网段 IP 地址启动 cluster，确保集群正常启动修改 HOST 地址将 host 的地址更新为新 IP 段ceph orch host set-addr <hostname> <new-addr>MON 节点MON 节点涉及到的 IP 地址配置文件主要有 3 个：/etc/ceph/ceph.conf/var/lib/ceph/{fsid}/config/ceph.conf/var/lib/ceph/{fsid}/{mon.id}/config迁移后比较棘手的就是 MON 节点，主要问题点：直接修改上述三个文件中的 IP 地址，然后启动 MON 节点，发现会有问题，主要原因是 MON 节点的节点信息维护在 monmap 中，直接修改配置文件不会改变 monmap 中的节点信息；尝试通过 monmaptool 工具来直接修改 monmap 中的节点信息，但是由于集群是通过 cephadm 管理的（podman 容器），monmap 注入时需要停止 mon 节点，但停止了 mon（容器）又无法进行进行注入了官方文档建议，通过新增一个 MON 节点再移除一个旧的 MON 节点的方式来迁移网络。由于不想新增虚拟机，所以决定接受集群短暂出现 HEALTH WARN 状态，每次移除一个 MON 后，再新增一个新 IP 的 MON 节点。删除和部署 MON 过程如下：# 取消 MON 节点的自动部署 ceph orch apply mon --unmanaged # 移除一个 MON 节点 ceph orch daemon rm mon.<hostname> # 新增一个 MON 节点，指定 IP 为新的 IP 地址 ceph orch daemon add mon <hostname>:<new_ipaddr>注意每替换一个，确认集群恢复正常后（ceph -s）再进行下一步操作。MON 节点更新完之后，使用 ceph mon stat/dump 确认所有 MON 节点都符合预期：root@ceph-mon-01:/# ceph mon dump epoch 26 fsid 5e08383c-18d1-11ee-a099-005056a354fb last_changed 2025-05-27T11:41:34.580004+0000 created 2023-07-02T12:10:07.025273+0000 min_mon_release 19 (squid) election_strategy: 1 0: [v2:10.184.18.34:3300/0,v1:10.184.18.34:6789/0] mon.ceph-mon-01 1: [v2:10.184.17.111:3300/0,v1:10.184.17.111:6789/0] mon.ceph-mon-02 2: [v2:10.184.17.121:3300/0,v1:10.184.17.121:6789/0] mon.ceph-mo…

Ceph 分布式存储系统搭建小记
type: item
date: 2023-07-08T16:20:00+00:00
description: 前言最近组里申领了几台服务器，每台上面有 8 块 8T 的硬盘，我们的需求对硬盘要求不大，所以想着把这些硬盘用起来，避免闲置了。大概想了下，可能的需求有：块存储或者 NFS 存储挂载到 vSphere 中，供其他主机使用；NFS 或者 SMB 存储挂载到 PC 上使用开始的时候想着弄个 NAS，但是这种集中式的存储方案对于多台服务器来说还是不够方便。然后就想到分布式存储方案，搜了下发现了 Ceph 这个玩意，遂对照着官方文档尝试着搭建了个。Ceph 简介Ceph 是一个统一的分布式存储系统，提供三种存储接口：对象存储块设备存储文件存储Ceph 基本组件Monitors：维护着集群状态 map，保证集群数据的一致性Managers：负责追踪集群数据，同时提供 Web 及 REST API 服务OSDs: 用于集群中所有数据与对象的存储，处理集群数据的复制、恢复MDSs：为 Ceph 文件存储提供元数据Ceph 集群网络ceph 只有一个 public network 即可以正常工作，但是 OSDs 间的数据传输流量可能会比较大，为其划分一个单独的 cluster network 可能会对性能有所提升Ceph 主机划分共有 7 台 ESXi 主机，每台主机上有 8*8T 硬盘，计划如下：3 台上建立 3 台虚拟机用于 MON 节点各个主机上分别建立 1 台虚拟机用于 OSD 节点，将每台主机上的 8 块硬盘直通挂在 OSD 虚拟机上所有 OSD 节点采用两块网卡，一个用于 public network，一个用于 cluster network所有节点配置如下：nodeesxicorememorydiskceph diskinterface10.182.65.231-ceph-mon-0110.182.65.8432GB60GB-110.182.65.232-ceph-mon-0210.182.65.2432 GB60GB-110.182.65.233-ceph-mon-0310.182.65.3432GB60GB-110.182.65.221-ceph-osd-0110.182.65.8432GB10GB8*8T210.182.65.222-ceph-osd-0210.182.65.2432GB10GB8*8T210.182.65.222-ceph-osd-0310.182.65.3432GB10GB8*8T210.182.65.222-ceph-osd-0410.182.65.4432GB10GB8*8T210.182.65.222-ceph-osd-0510.182.65.5432GB10GB8*8T210.182.65.222-ceph-osd-0610.182.65.6432GB10GB8*8T210.182.65.222-ceph-osd-0710.182.65.7432GB10GB8*8T2Ceph 集群搭建安装依赖各个 node 上安装以下依赖：Python3SystemdPodman/DockerNTPLVM2由于我们在虚拟机中操作，可以在一台虚拟机中把环境准备好后，克隆虚拟机即可安装 cephadmCeph 官方提供的 cephadm 工具可以很方便地用于 ceph 的创建和管理。安装方式有两种：直接下载 cephadm 脚本；通过包管理器下载包管理器提供的版本可能会落后，此处采用脚本方式：# 下载 cephadm，对应最新稳定版 ceph——quincy curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm # 增加可执行权限 chmod +x cephadm # 将 cephadm 安装到 PATH 中 ./cephadm add-repo --release quincy ./cephadm install创建 Ceph 集群创建第一个 MON 进程在 ceph-mon-01 节点上执行如下命令创建第一个 MON 进程和 MGR 进程cephadm bootstrap --mon-ip 10.182.65.231 --cluster-network 10.90.90.0/24说明：--mon-ip 指定了该 MON 进程节点可对外访问的 IP 地址；--cluster-network 指定了 OSD daemons 间创建副本、恢复和心跳流量使用的网络创建完成之后，查看该节点：# 进入 ceph 环境 (本文后续操作无特殊说明均在该环境下进行) cephadm shell # 查看 ceph host root@ceph-…

Systemd 配置网络接口 | Arch Linux 使用小记
type: item
date: 2021-07-23T14:31:00+00:00
description: 前言在前一篇文章 Arch Linux 安装篇 中有提到连接网络可以选择多种方式，如 iwd、netctl、systemd-networkd、NetworkManager 等。由于我对于 GUI 的要求不是那么高，最终我选择的是 systemd-networkd + iwd 的方式管理和连接网络。由于平时可能需要用到集聚接口 / vlan 子接口，所以查找了下 systemd-networkd 创建集聚接口和 vlan 子接口的相关资料，特做记录。ps: 文章其实和 Arch 这个特定的 Linux 发行版没啥大关系，只是决定使用 Arch 这个发行版了，后续的 Linux 上的一些使用方面的记录可能都会冠以 「Arch Linux 使用小记」这个 title。接口配置文件systemd 配置接口主要涉及的文件有 netdev 及 network 。netdev 文件netdev 文件用于配置虚拟网络设备，例如 bond / vlan / tun / wireguard 等各种类型的接口，详见 systemd.netdev主要配置的字段有 [NetDev] 及具体的接口类型段。network 文件network 文件用于配置接口具体的网络信息，如 IP / MAC / 路由等，详见 systemd.network主要配置的字段有 [Match] 及 [Network] 。集聚接口Debian Wiki 中提到 systemd 默认会创建一个名为 bond0 模式为 balance round robin 的集聚口，且模式不可更改（未去验证），所以为避免可能出现问题以下配置时均不采用 bond0 这个名字。更改配置后，可执行 systemctl restart systemd-networkd 生效。有线与无线聚合这个的需求主要是有线和无线之间作为主备，比如拔掉网线，可以无缝使用无线网络进行连接。创建集聚口 netdev 文件，如 /etc/systemd/network/bond1.netdev：[NetDev] Name=bond1 # 创建的集聚口名字 Kind=bond # 类型为 bond [Bond] Mode=active-backup # 模式为 active-backup，即主备模式 PrimaryReselectPolicy=always MIIMonitorSec=1s创建集聚口 network 文件，如 /etc/systemd/network/bond1.network:[Match] Name=bond1 # 需要匹配的集聚口名字 [Network] DHCP=ipv4创建有线接口 network 文件，如 /etc/systemd/network/eno1.network:[Match] Name=eno1 # 需要匹配的有线接口名字 [Network] Bond=bond1 # 属于的 bond 接口 PrimarySlave=true # 优先使用有线创建无线接口 network 文件，如 /etc/systemd/network/wireless.network:[Match] Name=wlan0 # 无线接口名字 [Network] Bond=bond1 # 属于的 bond 接口LACP 动态链路聚合这个的需求主要是 Linux 上联交换机时，为增大带宽，Linux 与交换机相连的接口做聚合，并且开启 LACP 进行动态协商。创建集聚接口 netdev 文件，如 /etc/systemd/network/bond2.netdev:[NetDev] Name=bond2 # 集聚接口名字 Description=LAG/Bond to a switch Kind=bond [Bond] Mode=802.3ad # 集聚接口工作模式，802.3ad 即为 lacp创建集聚接口 network 文件，如 /etc/systemd/network/bond2.network:[Match] Name=bond2 # 匹配的集聚接口名字 [Network] BindCarrier=enp4s0f0 enp4s0f1 # 集聚接口的成员接口名创建集聚接口的成员接口 network 文件，这里我将两个成员接口放在一个 network 文件中，如 /etc/systemd/network/bond2_members.network:[Match] Name=enp4s0f0 Name=enp4s0f1 # 匹配的成员接口名，可以使用模糊匹配，这里我用的精确的接口名字 [Network] Bond=bond2 # 属于的集聚口名VLAN 子接口物理接口有限，我需要创建一些 vlan 子接口满足一些特别的…

Arch Linux 安装篇 | Arch Linux 使用小记
type: item
date: 2021-07-04T05:54:00+00:00
description: 前言之前的一台老电脑装着 Windows 和 Manjaro 的双系统，但是 Windows 也一直没在使用，就想着把它干脆把它格了装成 Linux 单系统。由于习惯了 pacman 和 aur，就想着重装成 Manjaro 或者 Arch 了，毕竟之前装过 Manjaro 了，是时候体验下装 Arch 了（瞎折腾~）。Arch Linux 的官方 Wiki 一直都是业界楷模，所以照着维基安装问题不大。本文对自己安装过程（(LVM + XFS) / Btrfs + KDE）进行记录整合，方便自己使用，整个内容在 Wiki 基本都能找到说明，建议想要入坑的直接查看 Wiki。准备工作下载镜像；制作 U 盘启动盘，可采用 Rufus 或者 Ventoy系统安装启动到 Live 环境进入 BIOS 设置 U 盘优先启动，启动后进入 archiso shell 环境（默认为 zsh）；验证启动模式是否为 UEFI 模式：# 能够正常显示该目录，则为 uefi 模式 ls /sys/firmware/efi/efivars本文采用 UEFI 模式启动。连接网络由于安装过程中需要安装一些必要的软件，所以需要连接到网络，我采用的是无线网络（iwd），有线网络的话正常插上线（DHCP）就可使用了：# 1. 查看网卡设备 ip link show # 2. 输入 iwctl 进入 iwd 模式下 [root@archiso~] iwctl [iwd#] # 3. 扫描和获取附近网络 [iwd#] station <device> scan [iwd#] station <device> get-networks # 例如： [iwd#] station wlan0 scan [iwd#] station wlan0 get-networks Available networks -------------------------------------------------------------------------------- Network name Security Signal -------------------------------------------------------------------------------- > 12333_5461 psk **** CU_cH82 psk **** CMCC-cd3x psk **** Tenda_304 psk **** JC2902544410000B07050225 psk **** JSCN_SZ_4296B9 psk **** # 4. 连接 WiFi，连接是会提示输入密码，按照实际情况输入即可 [iwd#] station <device> connect <network name> # 5. 连接后，如无报错，则连接成功，输入 exit 退出 # 6. ping baidu.com 确认网络连接正常同步系统时间# 设置 ntp 同步 timedatectl set-ntp true # 查看同步状态 timedatectl status硬盘分区与格式化硬盘分区我采用的是 GPT 分区表，硬盘分区工具可使用 fdisk 或者 cfdisk。LVM + XFS 方案采用 LVM 方案来方便进行空间的动态调整，文件系统采用的是 XFS 格式（不支持压缩空间），所以刚开始配置的时候可以给各分区小点的空间。假设存在两块硬盘 /dev/sda 及 /dev/sdb，因为我使用的是 UEFI 模式启动，需要创建相应的 EFI 系统分区（如 /dev/sda1），不能使用 LVM，该分区大小可以设置在 500M 左右，分区类型为 EFI System；将 /dev/sda 及 /dev/sdb 剩余空间分别创建分区 /dev/sda2 、/dev/sdb1，分区类型为 Linux LVM，用于 LVM；配置 LVM（创建 PV --> 创建 VG --> 配置 LV）：创建物理卷：# 查看可以用做物理卷的设备 lvmdiskscan # 创建物理卷 pvcreate /dev/sda2 pvcreate /dev/sdb1 # 查看物理卷 pvdisplay创建卷组：# 创建卷组命令 vgcreate <vg-name> <device> # 例如 vgcreate arch-vg /dev/sda2 /dev/sdb1 # 查看卷组 vgdisplay创建逻辑卷：# 逻辑卷创建命令 lvcreate -L <volume size> <vg name> -n <lv name> # 例如：先创建 root/home/swap 三个 LV，后续有需要可以再加 lv…

Tmux 使用小记
type: item
date: 2021-05-01T16:46:00+00:00
description: 前言因为常用的环境都在服务器端，大部分的工作也都是 SSH 上服务器或者通过 vscode 的 remote-ssh 远程完成的，所以就会有 SSH 断开工作环境丢失的问题。然后几个月前了解到了 Tmux 这个终端复用工具，用了一段时间之后感觉还不错，遂对其做个记录。Tmux 简介单元模块服务器（server）：tmux 为 C/S 模型，输入 tmux 时则代表开启了一个 tmux 服务器会话（session）：开启 tmux 服务后，默认新建一个会话；一个 tmux 服务器可以创建多个会话窗口（window）：新建一个会话后，默认新建一个窗口；一个会话可以创建多个窗口窗格（pane）：新建一个窗口后，默认新建一个窗格；一个窗口可以创建多个窗格主要功能对于我来说，tmux 主要功能有：会话和窗口分离，窗口关闭，会话不结束，用以维持环境；窗口可以进行分割，在一个窗口不同窗格下进行不同的操作；基于 C/S 模型，多个客户端可以同时连接到同一个 session，方便共享；插件系统，方便扩展功能，如记录日志（可以不依赖终端软件了）Tmux 自定义配置tmux 可以自定义配置，针对个人用户的配置文件，修改 $HOME/.tmux.conf 文件即可。前缀键tmux 可以通过 tmux + command 的方式进行操作；也可以在进入 tmux 窗口中后通过快捷键进行操作，快捷键通过前缀键唤醒。默认的前缀键是 ctrl+b，但是这个前缀键比较不友好，实际使用中有点别扭，所以我对其进行了修改。关于前缀键的选取，主要考虑的因素有是否方便敲击和是否与其他快捷键有冲突。比较理想的按键是 ` 键，冲突少，只要敲击一个键，+ 数字键切换窗口时也很方便，但是我的 NiZ Plum Atom66 键盘这个键很不方便，所以放弃了，最后采用的是 ctrl+s 键，修改如下：set -g prefix C-s unbind C-b bind C-s send-prefix关于前缀键的选取可参考如下文章 / 提问：为 tmux / screen 选择一个合适的引导键hotkeys - What's the least conflicting prefix/escape sequence for screen or tmux? - Super User常用基础选项# 设置延时 set -sg escape-time 1 # 修改默认延时，设置为1ms，增加响应时间 # 开启鼠标模式，可以使用鼠标进行窗格大小的调整 set -g mouse on # 关闭自动改名 set-option -g allow-rename off # 开启剪贴板 set -g set-clipboard on # 设置 buffer 长度 set -g history-limit 50000 # 加载 tmux 配置文件的快捷键: prefix + r bind r source-file ~/.tmux.conf\; display "Reloaded!"文本复制模式使用快捷键 prefix + [ 可以进入 Copy 模式，使用 Enter 键退出，平时修改配置时习惯使用 Vim 进行操作，所以修改文本复制模式为 vi:# 开启 vi 按键 setw -g mode-keys vi set -g status-keys vi bind-key -T vi-edit Up send -X history-up bind-key -T vi-edit Down send -X history-down不过我一般不使用键盘来进行复制操作，多是进入 Copy 模式后进行屏幕搜索窗口配置# 由于 0 键的位置，切换窗口时不好寻找，设置窗口索引从 1 开始 set -g base-index 1 # 切换窗口快捷键，在窗口间前后切换，-r 代表可以多次敲击 bind -r C-h select-window -t :- bind -r C-l select-window -t :+ # 修改默认的分割 window 快捷键，采用 | 和 - 更加形象好记 bind | split-window -h bind - split-window -v窗格配置# 设备窗格索引从 1 开始 setw -g pane-base-index 1 # 选择窗格快捷键，使用 Vim 按键模式 bind h select-pane -L # 左 bind j select-pane -D # 下 bind k select-pane -U # 上 bind l select-pane -R # 右 # 调节窗格大小快捷键，使用 Vim 按键模式 bind -r H resize-pane -L 5 bind -r…

WireGuard NAT-to-NAT 实践
type: item
date: 2020-10-06T09:46:00+00:00
description: 最近有连接两个内网的小需求，想起了之前写过的 WireGuard 搭建和使用折腾小记，决定尝试着使用 WireGuard 来实现。因为两个内网都在 NAT 后，自己也没有固定的公网 IP，所以只能借助一台 VPS 作为中继服务器，用来分别连接两个内网并进行流量转发。以下内容为自己的一点记录，其实大体上和之前的文章区别不大，不过这次主要以手动命令配置为主，方便自己进一步理解。拓扑环境NAT-A (192.168.0.0/24) --- Gateway (VPS) --- NAT-B (10.180.0.0/16)wg 隧道接口 IP 我这里采用的是 10.10.10.0/24 网段的 IP，如下：NAT-A：10.10.10.2/24GW：10.10.10.1/24NAT-B：10.10.10.3/24安装与配置环境依赖NAT-A、NAT-B、VPS 均采用一台 Linux PC 作为 WireGuard endpoint；WireGuard 安装过程不再赘述，见官方文档；iptables、iproute2配置过程GW 端# 1. 生成密钥对 wg genkey | tee privatekey | wg pubkey > publickey # 2. 创建 WireGuard tunnel 接口 ip link add dev wg0 type wireguard # 3. 为 wg 接口配置 IP 地址 ip address add dev wg0 10.10.10.1/24 # 4. 指定 gw 端 wg0 接口私钥及接听端口 wg set wg0 private-key $(cat privatekey) listen-port 60000 # 5. 启用 wg0 接口 ip link set up dev wg0 # 6. 开启流量转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # > filter 表转发链中允许 wg0 接口的出入流量 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT # > nat 表动态伪装 snat iptables -t nat -A POSTROUTING -o $OUTBOUND_INTERFACE -j MASQUERADENAT-A 端# 1. 生成密钥对 wg genkey | tee privatekey | wg pubkey > publickey # 2. 创建 WireGuard tunnel 接口 ip link add dev wg0 type wireguard # 3. 为 WireGuard 接口配置 IP 地址 ip address add dev wg0 10.10.10.2/24 # 4. 指定 NAT-A 端接口密钥及 peer 信息（注意替换字段内容） # > allowed-ips: 指定需要经隧道的 IP 段，即指定相应 IP 段的静态路由；这里除了添加 WireGuard 网段，还需添加 NAT-B 网段地址，即相当于添加路由 ip route add 10.180.0.0/16 dev wg0 # > endpoint: 指定 gw 端的地址和监听端口 # > persistent-keepalive：用于保持长连接 wg set wg0 private-key $(cat privatekey) peer $GW_PUBKEY allowed-ips 10.10.10.0/24,10.180.0.0/16 endpoint $GW_IP:60000 persistent-keepalive 10 # 5. 启用 wg0 接口 ip link set up dev wg0 # 6. 开启流量转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # > filter 表转发链中允许 wg0 接口的出入流量 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT # > nat 表动态伪装 snat iptables -t nat -A POSTROUTING -o $OUTBOUNG_INTERFACE -j MASQUERADENAT-B 端# 1. 生成密钥对 wg genkey | tee privatekey | wg pubkey > publickey # 2. 创建 WireGuard tunnel 接…

关于 Windows Terminal、WSL 和 VSCode 的一点记录
type: item
date: 2020-09-02T12:33:00+00:00
description: 前言最近尝试使用了 Windows Terminal 和 WSL，同时安装了许久的 remote development 扩展也终于尝试着用了起来。遂对 Windows Terminal、WSL、VSCode+Remote Development 等配置内容进行一个简单的记录，方便自己换环境时快速恢复。WSL因为自己平时使用的 VPS 都一直采用的是 Debian，所以 WSL 我也就继续使用 Debian 了。安装比较简单，开启 Linux 子系统功能后 Windows 应用商店下载就好了。文件权限WSL 访问 Windows 盘符下的文件时，显示的权限都是 777，同时，WSL 新建的文件夹权限也是 777，需要稍微修改下更改下默认的权限。# 新建 /etc/wsl.conf 文件 [automount] enabled = true root = /mnt/ options = "metadata,umask=22,fmask=111" mountFsTab = true #[filesystem] #umask = 022 # 新建 /etc/fstab 文件，挂载 c 盘，以使用 Windows 下的应用程序 C:\ /mnt/c drvfs rw,noatime,uid=1000,gid=1000,metadata,umask=22,fmask=11 0 0 # zsh 配置好后，在 .zshrc 文件中添加 if "$(umask)" == '000' ; then umask 022 fi常用配置基础软件sudo apt install vim git curlshell 配置（oh-my-zsh）shell：zsh (oh-my-zsh)prompt: pureplugin: git z zsh-autosuggestions zsh-syntax-highlighting# 安装 zsh sudo apt install zsh # 安装 oh-my-zsh 并启用 sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" # 下载插件 # > zsh-syntax-highlighting git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting # > zsh-autosuggestions git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions # 下载 pure prompt mkdir -p "$HOME/.zsh" git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure" # 修改 ~/.zshrc # > 添加 pure path fpath+=$HOME/.zsh/pure # > 修改主题为 '' ZSH_THEME="" # > 使 pure 生效，添加在 source $ZSH/oh-my-zsh.sh 后 autoload -U promptinit; promptinit prompt pure # > 添加插件 plugins=(git z zsh-autosuggestions zsh-syntax-highlighting)python 环境配置# 系统 python 环境 sudo apt install python3 python3-pip ln -s /usr/bin/python3 /usr/bin/python # 安装 pyenv git clone https://github.com/pyenv/pyenv.git ~/.pyenv echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc # 安装 pipenv pip3 inst…

Manjaro 配置记录
type: item
date: 2020-05-24T00:45:00+00:00
description: 前言好久没用 Manjaro 了，今天准备打开看下，发现因为 Windows 的自动更新，导致 Linux 的引导没了。本来准备修复一下的，后来想想反正 Linux 下没啥重要数据，就将 Manjaro-deepin 重装成了 Manjaro-xfce。虽然之前已经用过一段时间，发现太久没用很多东西都忘了，然后又要重新进行搜索一番。虽说网上关于 Manjaro 的配置文章已经非常多了，但是还是想重新记录一下，帮助自己下次快速恢复下环境。系统配置pacman 源sudo pacman-mirrors -i -c China -m rank在弹出框内选择自己需要的源。AUR 源AUR 是为用户而建、由用户主导的 Arch 软件仓库。# 添加 archlinuxcn 仓库 sudo nano /etc/pacman.conf # 在末尾依次输入 [archlinuxcn] SigLevel = Optional TrustedOnly Server = http://mirrors.163.com/archlinux-cn/$arch # 保存后退出 # 更新 sudo pacman -Syy # 安装 archlinuxcn-keyring sudo pacman -S archlinuxcn-keyring # 更新 sudo pacman -Syyuyaypacman 不支持 AUR 源，采用 yay AUR 助手在保证 pacman 功能的同时支持 AUR 仓库。sudo pacman -S yaySnap部分软件通过 Snap 进行发布，可安装 Snap 进行补充sudo pacman -S snapd sudo systemctl enable --now snapd.socket sudo ln -s /var/lib/snapd/snap /snapShell采用 oh-my-zsh，建议参考 定制终端# 插件，安装之后在 $HOME/.zshrc 中 plugin 行添加以下插件名 # > zsh-syntax-highlighting git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting # > zsh-autosuggestions git clone git://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions软件配置Web BrowserChromeyay -S google-chromeClash# github 下载 release 包 # https://github.com/Dreamacro/clash/releases # 运行 clash，生成配置文件夹后关闭 chmod +x clash && ./clash # 将自己的配置文件覆盖默认配置 $HOME/.config/clash/config.yaml # 采用 pm2 管理 #> 1. 安装 pm2 wget -qO- https://getpm2.com/install.sh | bash #> 2. 启动 clash pm2 start clash # 设置代理 cat >> /etc/profile << EOF export http_proxy=http://127.0.0.1:7890 export https_proxy=http://127.0.0.1:7890 EOF # 注销后重新登录Input Methodibus-rime# 安装 yay -S ibus-rime # 配置环境变量 nano $HOME/.xprofile export GTK_IM_MODULE=ibus export XMODIFIERS=@im=ibus export QT_IM_MODULE=ibus ibus-daemon -x -d # 注销生效 # 配合坚果云恢复 Rime 环境Cloud Storage坚果云yay -S nutstoreText EditorVimyay -S vimTyporayay -S typoraVisual Studio Code# aur yay -S visual-studio-code-binInstant MessagingTelegramyay -S telegram-desktop-binTerminalelecterm下载 electerm 对桌面自带终…