一个 EasyTier VPN 参数导致的 iBGP 全面崩溃 - BIRD iBGP 排坑记录
前言博主某天在查看自己 DN42 的 Looking Glass 时, 发现几个用于 ASN 内传输路由的 iBGP 协议全部处于 Connection closed 状态, 导致了 ASN 内部无法正常传输路由. 在检查了各项配置且尝试重启无果之后, 意识到这貌似并不是什么简单的问题, 遂尝试解决.网络状态各节点 BIRD: 正常iBGP 节点间通信: 正常iBGP Peer 协商: 不正常网络架构描述iBGP Peer 一共有五台设备, 一台设备处于境内, 与其他四台设备建立 Peer, 其他四台设备处于境外, 这四台设备之间互相不 Peer. 且每台设备都与若干 eBGP 节点进行了 Peer.已确认的部分iBGP 节点间 ASN 相同iBGP Peer 的 IP 地址配置无误节点间防火墙配置无误问题分析iBGP Peer 不成立通常可能是以下几个原因导致的Router ID 冲突Peer IP 地址不匹配TCP MD5 密码不匹配使用 LoopBack 建立连接时, BGP 多跳未配置监听地址与端口不匹配或配置错误某一方 BGP 会话未启动Hold Time 协商问题下面我们一个一个进行分析由于这些 iBGP Peer 的情况都大致相同, 且配置也大致相同. 因此每一步的验证仅取其中一对 Peer 进行查看Router ID 冲突对双方 Router ID 进行检查VM-Subroot@VM-Sub:/etc/bird/ibgp# birdc show status | grep "Router ID" Router ID is 172.23.66.97JPSB01root@JPSB01:~# birdc show status | grep "Router ID" Router ID is 45.xxx.xxx.xxx可以明显看出, 双方 Router ID 不同, 故不是此问题Peer IP 地址不匹配现在对双方在配置文件中的 Peer IP 进行检查VM-Subroot@VM-Sub:/etc/bird/ibgp# cat sb1-jp.conf protocol bgp 'ibgp_sb1-jp' from ibgpeers{ neighbor 10.0.64.103 as DN42_OWNAS; };JPSB01root@ACCK-JPSB01:/etc/bird/ibgp# cat homelab-subserver.conf protocol bgp 'ibgp_homelab-subserver' from ibgpeers{ neighbor 10.0.64.4 as DN42_OWNAS; };双方的 IP 地址均为 WireGuard VPN 内网中的 IP 地址, 因此互相连接时, 源 IP 地址肯定是 VPN 网络中的 IP 地址, 因此不是这个问题.TCP MD5 密码不匹配iBGP Peer 间未单独配置密码, 故不是该问题使用 LoopBack 建立连接时, BGP 多跳未配置iBGP 使用直连连接, 未使用 LoopBack 接口, 连接只有一跳, 故不是该问题监听地址与端口不匹配或配置错误监听地址和端口均为进行修改, 所有配置为 BIRD 默认, 故不存在该问题某一方 BGP 会话未启动双方 BGP 会话均启动, 故不是该问题深入排查现在, 所有可能的原因都排查完了, 但问题还未解决. 还剩怎么排查呢? 我们可以抓包查看具体通信报文是什么. 这里使用 tcpdump 对 179 端口进行监听, 并输出 pcap 文件tcpdump -i any port 179 -vvv -s0 -w bgp.pcap等待一段时间后, 使用 WireShark 打开该文件查看报文这就是具体抓到的数据包. 现在我们过滤所有 eBGP 报文, 仅查看需要检查的两个 iBGP Peer 之间的报文. 使用这个过滤器ip.addr == 10.0.64.4 && ip.addr == 10.0.64.103在这份数据包中我们可以看到, 10.0.64.4 多次尝试向 10.0.64.103 发送 OPEN 报文, 但最终会被 10.0.64.4 发送 RST 报文, 整个连接被重置, 最终导致 BIRD 报错 Connection closed.现在, 我们重新在 10.0.64.103 上进行抓包, 结果如下可以看到, 无论是 10.0.64.4 还是 10.0.64.60, 均只对对方的 TCP 报文进行了处理, 没有任何 BGP 层的处理. 这很奇怪, 如果问题出现在 BGP 层, 那么应该由其中一方发送 BGP Notification 报文来终止连接, 而不是 TCP Reset.鉴于这个问题是突然出现的, 所以我们来审视一下问题出现的前后, 我都对网络做了什么改动. 回想了一下, 在这期间我对网络做的唯一改动就是 将 Easytier VPN 的部署从 直接在 systemd 服务中将具体配置参数输入给 Easytier 二进制程序 改为了 通过将具体配置写进配置文件再送给 Easytier 处理. 在配置文件中, 我多加上了这么几条参数[flags] enable_kcp_proxy = true enable_quic_proxy = true latency_first = true private_mode = true我们逐个检查这些 flag 会实现什么功能enable_kcp_proxy 启用 KCP 代理. 将 TCP 连接使用 KCP 协议进行代理该功能虽然会改变 TCP 流量的传输方式, 但不改变原始 TCP 报文, 所以不会造成影响.enable_quic_proxy 启用 QUIC 代理. 将 TCP 连接使用 QUIC 协议进行代理该功能虽然会改变 TCP 流量的传输方式, 但不改变原始 TCP 报文, 所以不会造成影响.laterncy_first 延迟优先. 无视 TTL 跳数, 始终优先使用延迟最短的路径转发流量该功能虽然达到了最小延迟的目的, 但可能会增加 TTL 跳数. 从上面的配置文件可以看出, 配置里并没有单独配置 max-hop, 这可能造成连接失败.我们来测试一下双方互通的跳数10.0.64.4traceroute to 10.0.64.60 (10.0.64.60), 30 hops max, 60 byte packets 1 10.0.64.60 (10.0.64.60) 14.478 ms 14.476 ms 14.463 ms10.0.64.60traceroute to 10.0.64.4 (10.0.64.4), 30 hops max, 60 byte packets 1 10.0.64.4 (10.0.64.4) 13.845 ms 14.444 ms 14.378 ms这里可以看到, 两台机器虽然均开启了 laterncy_first, 但双方的跳数仍为 1, 不会造成 iBGP 故障. 但保险起见, 我们还是把这项功能关掉.private_mode 隐私模式. 不允许任何非相同网络的节点使用该节点建立连接或转发流量顾名思义, 这项功能是为了防止外部未知设备在未经允许的情况下借助这个节点进行 VPN 网络搭建或流量转发, 但在我查询 AI 后, 它告诉我Root cause: EasyTier's private_mode with KCP/QUIC proxy rewrites the source IP of incoming BGP connections to 10.0.64.60 (this machine's own tunnel IP). BIRD rejects these because it only knows about neighbor 10.0.64.4. The same issue likely affects 10.0.64.4 in reverse, so both directions fail.底层原因: EasyTier 的 private_mode 通过 KCP/QUIC 代理时会 重写连入 BGP 连接的源 IP 地址 到 10.0.64.60 (这台机器的私有隧道 IP). BIRD 拒绝了这些连接, 因为它只知道邻居的地址 10.0.64.4. 相同的问题也影响了 10.0.64.4, 故两边均失败了.由此我们可以得知, 当某一方的 BGP 连接传入时, Easytier 会先将 IP 数据包中的 源 IP 地址 改为本机隧道地址, 然后再被 BIRD 接收.为了验证是不是为这个问题, 我们在 10.0.64.60 中查看 BIRD 的日志root@SchoolNode-Main:/home/nanami114/PersonalFiles/easytier/configs# journalctl -xeu bird Jun 04 17:50:58 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 39138) Jun 04 17:51:03 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 56654) Jun 04 17:51:07 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 56670) Jun 04 17:51:11 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 56676) Jun 04 17:51:15 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 44306) Jun 04 17:51:19 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 44320) Jun 04 17:51:23 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 38916) Jun 04 17:51:27 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 38924) Jun 04 17:51:31 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 38930) Jun 04 17:51:35 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 37640) Jun 04 17:51:40 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 37656) Jun 04 17:51:44 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 48124) Jun 04 17:51:49 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 48128) Jun 04 17:51:53 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 55374) Jun 04 17:51:58 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 55388) Jun 04 17:52:02 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 39252) Jun 04 17:52:07 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 39266) Jun 04 17:52:11 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 39270) Jun 04 17:52:15 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 33950) Jun 04 17:52:20 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 33964) Jun 04 17:52:24 SchoolNode-Main bird[2383741]: BGP: Unexpected connect from unknown address 10.0.64.60 (port 59404) ...可以从日志中看到, BIRD 对 10.0.64.60 传入的连接进行了大量的报错, 由此我们得知, 问题就出在这里!现在我们将这项功能关掉, 然后再次查看连接状态root@SchoolNode-Main:/home/nanami114/PersonalFiles/easytier/configs# birdc s p BIRD 2.18.1 ready. Name Proto Table State Since Info device1 Device --- up 17:15:38.915 kernel_v4 Kernel master4 up 17:15:38.915 kernel_v6 Kernel master6 up 17:15:38.915 dn42_static_v4 Static master4 up 17:15:38.915 dn42_static_v6 Static master6 up 17:15:38.915 dn42_rpki_akix RPKI --- up 17:15:39.962 Established ospf_dn42 OSPF master4 up 17:15:38.915 Alone ospf_dn42_v6 OSPF master6 up 17:15:38.915 Alone ibgp_homelab-subserver BGP --- up 17:54:48.504 Established可以看到, 此时 iBGP 已经处于了 Established 状态. 至此, 问题全部解决.结语本人非专业网络运维, 如有错误或疏漏还请指出! 如果觉得文章不错, 还请分享给有需要的人, 感谢!
当 Easytier 遇上 mwan3: 一次 VPN 回程路由被劫持的修复实录
前言博主使用了 Easytier 在家, 学校, 境内外公网服务器之间通过 WireGuard 协议建立了一个三层 VPN 网络. 平日里在学校或出门在外都会通过这个 VPN 网络连接家里的设备, 访问家里搭建的业务. 在博主今天尝试在学校连接家里服务器上的 SMB 时, 发现全部连接失败, 故着手研究原因.网络拓扑架构在 HomeLab 中, 有三台设备代理了 192.168.1.0/24 网段, 即其他设备可以走这三个节点访问该网段. 且对于该网段的访问没有专门的 ACL 限制, 所有设备均可访问在校园节点中, 网关代理了 192.168.20.0/24 网段, 同样可以被所有设备访问链路状态相关节点状态: HomeLab (在线), Router-School (在线)链路通信状态校园节点在网关上与 192.168.1.0/24 段的设备通信正常, 但下游设备与该网段的通信时不正常HomeLab 中所有节点的网络通信状态与子网代理状态都是正常的疑点: 下游设备与 192.168.1.14/32 通信时正常, 但与该网段中其他所有设备通信都不正常. 表现为 ICMP Ping 无回包, 业务数据访问不通问题分析造成该故障最常见的原因可能有以下几点回程路由缺失反向路径过滤 (rp_filter) 导致回包被丢弃IP 转发未开启Easytier 的出口策略 / 策略路由冲突我们这边逐个来排查1. 回程路由缺失请求: 192.168.20.0/24 → 网关 → tun0 → VPN → 192.168.1.0/24回包: 192.168.1.0/24 → VPN → 网关 tun0 → ??? → 192.168.20.0/24网关自身访问时, 源地址通常是 tun0 的 IP (10.0.64.253), 这个地址天然在 VPN 路由域内, 对端可以直接回包.而下游设备访问时, 源地址保留为 192.168.20.x, 如果对端节点没有去往 192.168.20.0/24 的路由, 回包就会丢失或走默认路由被丢弃.这里检查校园网关的路由表root@X-wrt-School:~# ip rou default via 10.131.0.1 dev pppoe-wan proto static metric 40 default via 10.151.0.1 dev pppoe-xwan01 proto static metric 41 default via 10.141.0.1 dev pppoe-xwan02 proto static metric 42 default via 10.141.0.1 dev pppoe-xwan03 proto static metric 43 default via 10.151.0.1 dev pppoe-xwan04 proto static metric 44 10.0.64.0/24 dev tun0 proto kernel scope link src 10.0.64.253 10.0.64.0/24 dev tun0 proto static metric 65535 10.10.64.0/24 dev tun0 proto static metric 65535 10.131.0.1 dev pppoe-wan proto kernel scope link src 10.131.15.37 10.141.0.1 dev pppoe-xwan02 proto kernel scope link src 10.141.102.228 10.141.0.1 dev pppoe-xwan03 proto kernel scope link src 10.141.40.183 10.151.0.1 dev pppoe-xwan01 proto kernel scope link src 10.151.10.205 10.151.0.1 dev pppoe-xwan04 proto kernel scope link src 10.151.32.226 169.254.0.0/16 dev br-lan proto kernel scope link src 169.254.254.254 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 192.168.1.0/24 dev tun0 proto static metric 65535 192.168.3.0/24 dev tun0 proto static metric 65535 192.168.20.0/24 dev br-lan proto kernel scope link src 192.168.20.1 192.168.20.0/24 dev br-lan proto bird scope link metric 32 192.168.100.0/24 dev tun0 proto static metric 65535可以看到, 192.168.1.0/24 正常从 tun0 出口然后检查 HomeLab 节点中设备的路由表nanami114@NanamiWork-Server:~$ ip rou default via 192.168.1.1 dev vmbr0 proto kernel onlink 10.0.64.0/24 dev tun0 proto static metric 65535 10.10.64.0/24 dev tun0 proto static metric 65535 192.168.1.0/24 dev vmbr0 proto kernel scope link src 192.168.1.8 192.168.3.0/24 dev tun0 proto static metric 65535 192.168.20.0/24 dev tun0 proto static metric 65535 192.168.100.0/24 dev tun0 proto static metric 65535可以看到这里也是正常的, 因此该原因被排除2. 反向路径过滤 (rp_filter) 导致回包被丢弃这里直接检查校园网关的 rp_filter 策略root@X-wrt-School:~# sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.all.rp_filter = 0 root@X-wrt-School:~# sysctl net.ipv4.conf.tun0.rp_filter net.ipv4.conf.tun0.rp_filter = 0 root@X-wrt-School:~# sysctl net.ipv4.conf.br-lan.rp_filter net.ipv4.conf.br-lan.rp_filter = 0可以看到, 所有相关网络接口的 rp_filter 均为 0, 证明这里没有问题, 故排除该原因3. IP 转发未开启首先网关本身使用的系统为 OpenWrt, 该系统为专业的软路由系统, 因此可以直接排除该原因. 但为了严谨, 这里还是检查一下root@X-wrt-School:~# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 14. Easytier 的出口策略 / 策略路由冲突在第一项检查中我们可以看到, 路由表中存在多个 pppoe-wan, 说明这是一个多拨的网络环境. 因此可能造成下游流量在转发时被路由策略规则劫持, 导致回包走到了错误的物理接口, 而非回到 tun0.root@X-wrt-School:~# ip rule show 0: from all lookup local 1001: from all iif pppoe-wan lookup 1 1002: from all iif pppoe-xwan01 lookup 2 1003: from all iif pppoe-xwan02 lookup 3 1004: from all iif pppoe-xwan03 lookup 4 1005: from all iif pppoe-xwan04 lookup 5 2001: from all fwmark 0x100/0x3f00 lookup 1 2002: from all fwmark 0x200/0x3f00 lookup 2 2003: from all fwmark 0x300/0x3f00 lookup 3 2004: from all fwmark 0x400/0x3f00 lookup 4 2005: from all fwmark 0x500/0x3f00 lookup 5 2061: from all fwmark 0x3d00/0x3f00 blackhole 2062: from all fwmark 0x3e00/0x3f00 unreachable 32766: from all lookup main 32767: from all lookup default通过这条输出, 我们可以注意到:下游设备 192.168.20.x → 网关 → 匹配 main 路由表走 tun0 → VPN → 192.168.1.y (正常发出)回包到达网关 tun0 后, 内核会进行路由查找. 此时, 如果回包被打上了某个 fwmark (例如 0x100), 就会命中规则 2001: from all fwmark 0x100/0x3f00 lookup 1, 从而使用路由表 1 进行转发.这里我们查看路由表 1 的具体路由信息root@X-wrt-School:~# ip route show table 1 default via 10.131.0.1 dev pppoe-wan metric 40 10.0.64.0/24 dev tun0 proto kernel scope link src 10.0.64.253 metric 256 10.0.64.0/24 dev tun0 proto static scope link metric 65535 10.10.64.0/24 dev tun0 proto static scope link metric 65535 10.131.0.1 dev pppoe-wan proto kernel scope link src 10.131.15.37 10.141.0.1 dev pppoe-xwan02 proto kernel scope link src 10.141.102.228 metric 3 10.141.0.1 dev pppoe-xwan03 proto kernel scope link src 10.141.40.183 metric 4 10.151.0.1 dev pppoe-xwan01 proto kernel scope link src 10.151.10.205 metric 2 10.151.0.1 dev pppoe-xwan04 proto kernel scope link src 10.151.32.226 metric 5 169.254.0.0/16 dev br-lan proto kernel scope link src 169.254.254.254 metric 256 192.168.1.0/24 dev tun0 proto static scope link metric 65535 192.168.3.0/24 dev tun0 proto static scope link metric 65535 192.168.20.0/24 dev br-lan proto bird scope link metric 32 192.168.20.0/24 dev br-lan proto kernel scope link src 192.168.20.1 metric 256 192.168.100.0/24 dev tun0 proto static scope link metric 65535从输出的路由表信息来看, 已经存在去往 192.168.20.0/24 的正确路由, 这说明单纯的回程缺失已经被排除. 但下游设备无法通信, 此时问题大概率出现在连接跟踪表记 (conntrack) 与防火墙过滤的联合作用上.首先我们查看 OpenWrt 的防火墙配置可以看到, Easytier 接口的出入配置都是正确且有效的, 那么接下来我们对问题进行深入分析与排查深入分析mwan3 的标记机制mwan3 会在 mangle 表的 PREROUTING 和 OUTPUT 中挂载 mwan3_hook. 核心逻辑如下CONNMARK restore: 恢复连接上保存的标记 (fwmark).如果恢复后标记为 0, 则根据入接口 (mwan3_ifaces_in) 或策略 (mwan3_rules) 打上新标记, 最后 CONNMARK save, 将标记保存到连接跟踪里.此后所有属于该连接的包都会自动被还原相同标记, 并通过 ip rule 的 fwmark 匹配, 强制走对应的路由表 (如 table 1~5).当前链路存在的问题当 192.168.20.x 首次访问 192.168.1.x 时出站 (br-lan → 网关 → tun0):该包在 PREROUTING 或 OUTPUT 链被 mwan3 打上某个标记 (例如 0x100), 并 CONNMARK save 保存.回包 (tun0 → 网关 → 应回到 br-lan):回包进入 PREROUTING → mwan3_hook → CONNMARK restore 直接将标记恢复为 0x100.由于标记非零, 后续 mwan3_ifaces_in 等链都被跳过 (它们要求 mark match 0x0/0x3f00).回包带着 0x100 进入路由查找, 命中 ip rule 中的 2001: from all fwmark 0x100/0x3f00 lookup 1, 使用 table 1 转发.尽管 table 1 有去往 192.168.20.0/24 的直连路由, 理论上可以通, 但实际环境中常被以下两种隐形过滤阻断:filter 表 FORWARD 链的状态跟踪丢弃大多数 OpenWrt 默认防火墙 FORWARD 链允许 ESTABLISHED ,RELATED 状态, 丢弃 INVALID.当回包带着被强制改变的路由标记走过路由后, 连接跟踪可能将其状态标记为 INVALID (因为出方向走的是 main 表或不同的路由表, 回包却走 table 1, 属于非对称路由, conntrack 可能视其为无效), 随后被 FORWARD 链丢弃.反向路径校验 *(即使 rp_filter=0 仍有其他机制)某些内核版本在策略路由下仍会做额外的路径校验, 或者 secure_redirects 等参数造成丢弃. 但更常见的是第 1 点.因此, 即使路由存在, 包也可能在送到 br-lan 之前就被 filter 规则或 conntrack 剔除.故障修复快速恢复最快且最可靠的办法是让回包不再经过 FORWARD 转发路径, 而是直接进网关本机. 将下游设备的源地址伪装为网关 VPN 接口的地址即可.iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o tun0 -j MASQUERADE执行完后看效果:C:\Users\Nanami114>ping 192.168.1.4 Pinging 192.168.1.4 with 32 bytes of data: Reply from 192.168.1.4: bytes=32 time=11ms TTL=63 Reply from 192.168.1.4: bytes=32 time=11ms TTL=63 Reply from 192.168.1.4: bytes=32 time=11ms TTL=63 Reply from 192.168.1.4: bytes=32 time=12ms TTL=63 Ping statistics for 192.168.1.4: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 11ms, Maximum = 12ms, Average = 11ms C:\Users\Nanami114>ping 192.168.1.8 Pinging 192.168.1.8 with 32 bytes of data: Reply from 192.168.1.8: bytes=32 time=7ms TTL=63 Reply from 192.168.1.8: bytes=32 time=7ms TTL=63 Reply from 192.168.1.8: bytes=32 time=7ms TTL=63 Reply from 192.168.1.8: bytes=32 time=7ms TTL=63 Ping statistics for 192.168.1.8: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 7ms, Maximum = 7ms, Average = 7ms可以看到, 此时下游设备已经可以正常收到对端设备 ICMP Ping 的回包. 接下来查看业务流量状态:这里可以看到, 此时 SMB 流量已经可以正常通讯, 说明整个网络链路已经恢复, 下游设备恢复了与 192.168.1.0/24 段的正常通讯.当然, 这个方法虽然恢复快速但也存在不妥:所有下游设备去往 192.168.1.0/24 的通讯, 都会被目标设备识别为 10.0.64.253 在与其通信, 也就是校园网关在与其通信. 为了解决这个问题, 下面我们进行深度修复.根因修复: 调整 mangle 规则, 避免 VPN 回程路由被标记精准修复命令在 mwan3_hook 中 CONNMARK save 之前插入一条规则: 如果包是从 tun0 进入且目标是 192.168.20.0/24, 则将其标记清零, 并让 conntrack 保存清零后的标记. 这样该连接后续流量将不再受多线策略影响.首先查看 mwan3_hook 接口编号root@X-wrt-School:~# iptables -t mangle -L mwan3_hook --line-numbers Chain mwan3_hook (2 references) num target prot opt source destination 1 CONNMARK all -- anywhere anywhere mark match 0x0/0x3f00 CONNMARK restore mask 0x3f00 2 mwan3_ifaces_in all -- anywhere anywhere mark match 0x0/0x3f00 3 mwan3_local all -- anywhere anywhere mark match 0x0/0x3f00 4 mwan3_rules all -- anywhere anywhere mark match 0x0/0x3f00 5 mwan3_connected all -- anywhere anywhere 6 CONNMARK all -- anywhere anywhere CONNMARK save mask 0x3f00可以看到 mwan3_connected 是第五条, CONNMARK save 是第六条. 我们需要在这两条之间插入标记清零的规则iptables -t mangle -I mwan3_hook 6 -i tun0 -d 192.168.20.0/24 -j MARK --set-mark 0这里可以看到, 刚才插入的规则已经生效. 此时看下游设备效果.这里使用下游设备连接对端物理设备的 SSH, 连接两次即可在终端内看到上一次连接的 IP 地址.Linux NanamiWork-Server 7.0.0-3-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.0-3 (2026-04-21T22:56Z) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Wed May 27 16:19:00 2026 from 192.168.20.2 nanami114@NanamiWork-Server:~$可以看到, 这里显示 Last login: Wed May 27 16:19:00 2026 from 192.168.20.2, 证明改动已经生效, 并已经恢复了与目标设备的连接. 至此, 整个 VPN 网络的修复就已完成.后记本人非专业网络运维, 如有疏漏或错误, 还请指出! 如果您觉得文章不错, 还请分享给有需要的
自建代理节点 - 史上最简单的 Vless + Reality + uTLS + Vision 代理节点搭建方案
前言博主先前在尝试使用 Shadowsocks 协议搭建代理并使用了一段时间后, 发现代理所使用的端口不幸被省内本地墙检测并封禁, 因此决定更换方案. 在尝试使用 x-ui 搭建节点并发现死活连不上后, 决定研究手动搭建的方案. 这篇文章将会教你如何非常快速地搭建使用 Vless + Reality + uTLS + Vision 算法的代理节点, 实现最安全的代理方案搭建需求未被封禁 IP 的 VPS法律声明本站只做技术分享, 请读者在完全遵守相关法律法规的情况下参考本站的教程, 严禁将本站教程内容用于任何违法用途!开整1. 服务端配置使用该指令下载一键部署脚本wget -P /root -N --no-check-certificate "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/install.sh" && chmod 700 /root/install.sh && /root/install.sh项目地址下载完成后输入 3 并回车, 选择 一键无域名Reality也可以根据需求自行选择其他协议或方式. 本文以无域名 Reality 进行演示输入 1, 选择 Xray-core按照提示输入您的邮箱, 密码等信息. 如果没有特殊要求, 这里建议全部保持默认, 即直接按回车随机生成输入 sni 时, 一定要输入目前可以无墙访问的国外站点, 例如 www.python.org等待一段时间后, 脚本会给出连接信息. 一般为---> 通用格式(VLESS+reality+uTLS+Vision) vless://<uuid>@<addr>?encryption=none&security=reality&pqv=&type=tcp&sni=<sni>&fp=chrome&pbk=<publicKey>&sid=<shortID>&flow=xtls-rprx-vision#<userName>-<encType>至此, 服务端配置已经完成2. 客户端配置由于支持该连接方式的客户端众多, 本文不会演示全部客户端, 将会以 mihomo 内核所能识别的 yaml 格式进行配置. 如果您使用的是 v2ray 官方客户端, 只需要复制 vless:// 开头的信息, 直接粘贴到程序内就可以使用了新建 *.yaml 格式的文件, 按照服务端控制台给出的信息和下方所给格式填写配置文件.proxies: - {name: "<Node Name>", type: vless, server: <IP Address>, port: <Port>, uuid: <uuid>, network: tcp, tls: true, udp: true, flow: xtls-rprx-vision, servername: <sni>, reality-opts: {public-key: "<publicKey>", short-id: "<shortID>"}, client-fingerprint: chrome}如您的节点不止一个, 可以直接复制 - {} 并另起一行粘贴.你也可以直接将控制台的输出内容丢给 AI 让其生成相应的 yaml 配置文件按照上述规范填写好配置文件后, 直接拖入 Clash 客户端中, 即可正常连接结语本人非网络领域专业人士, 如有错误欢迎指出. 如果您觉得这篇文章对您有帮助, 请将其分享给有需要的人!
Linux 运维 - 新版 OpenWrt 基于 Bird 的 OSPF 组网实现
前言在配置工作室/企业网络时, 常常需要实现多网段互通, 而这些网段通常处于同一层级或不同层级, 并非上下级的关系, 所以并不可以直接互通. 这时我们就需要在路由器上配置 OSPF. 本篇文章将教你如何在搭载 OpenWrt 的路由器上实现 OSPF 组网.示例环境主路由 OS: X-WRT 25.04_b202510240128 Plucky副路由 OS: X-WRT 26.04_b202601250827 Plucky按照本文进行配置需要您对 OSPF 协议拥有基本的认识开整1. 安装 Bird转至 系统 (System) --> 软件 (Software) 页面, 安装如图所示的两个软件包Q. 为什么不选择 Bird 3?A. Bird 2 经过社区长期验证, 被认为是稳定且可靠的选择, 拥有大量的实际配置案例与故障处理经验. 且 Bird 2 几乎满足了绝大部分网络配置的需求, 无需使用 Bird 3 的新特性.2. 配置 Bird打开 init.d 中的 Bird 配置vim /etc/init.d/bird将 BIRD_CONF="/etc/bird.conf 改为BIRD_CONF="/etc/bird/bird.conf"新建配置文件夹和主要配置文件mkdir /etc/bird vim /etc/bird/bird.conf按照以下格式填写配置define INTRA_ROUTER_ID = <your_router_id>; define INTRA_PREFIX_V4 = [ <your_network_segments>/<netmask>+ ]; define INTRA_PREFIX_V6 = [ <your_network_segments>/<netmask>+ ]; protocol device { scan time 10; }; ipv4 table intra_table_v4; ipv6 table intra_table_v6; include "config/defs.conf"; include "config/kernel.conf"; include "config/ospf.conf";配置条目解析INTRA_ROUTER_ID: 当前设备的 Router-IDINTRA_PREFIX_V4: 定义 IPv4 内部网络前缀的宏INTRA_PREFIX_v6: 定义 IPv6 内部网络前缀的宏前缀命名规范define INTRA_... # 内部路由相关define INTER_... # 外部/边界路由相关define CUSTOMER_... # 客户路由相关define PEERING_... # 对等路由相关scan time 10: 扫描接口的间隔为 10sipv4 table: IPv4 路由表名称ipv6 table: IPv6 路由表名称include: 指定包含哪些配置文件, 可以添加自己的配置文件. 以下是建议添加的配置文件defs.conf: 可以存放路由条目过滤规则等函数kernel.conf: 存放写进内核路由表的过滤规则ospf.conf: 配置 OSPF 的配置文件示例配置define INTRA_ROUTER_ID = 100.64.0.163; define INTRA_PREFIX_V4 = [ 100.64.0.0/16+, 192.168.0.0/16+ ]; define INTRA_PREFIX_V6 = [ fd18:3e15:61d0::/48+ ]; protocol device { scan time 10; }; ipv4 table intra_table_v4; ipv6 table intra_table_v6; include "intra/defs.conf"; include "intra/kernel.conf"; include "intra/ospf.conf";新建子配置文件并按照示例格式填写配置文章中提供的配置文件均为示例, 十分建议自行另外编写, 可以使用 AImkdir infra cd infradefs.confvim defs.conffunction is_intra_net4() { return net ~ INTRA_PREFIX_V4; } function is_intra_net6(){ return net ~ INTRA_PREFIX_V6; }kernel.confvim kernel.confprotocol kernel intra_kernel_v4 { kernel table 254; scan time 20; ipv4 { table intra_table_v4; import none; export filter { if source = RTS_STATIC then reject; accept; }; }; }; protocol kernel intra_kernel_v6 { kernel table 254; scan time 20; ipv6 { table intra_table_v6; import none; export filter { if source = RTS_STATIC then reject; accept; }; }; };ospf.confvim ospf.confprotocol ospf v3 intra_ospf_v4 { router id INTRA_ROUTER_ID; ipv4 { table intra_table_v4; import where is_intra_net4() && source != RTS_BGP; export where is_intra_net4() && source != RTS_BGP; }; include "ospf/*"; }; protocol ospf v3 intra_ospf_v6 { router id INTRA_ROUTER_ID; ipv6 { # table dn42_table_v6; table intra_table_v6; import where is_intra_net6() && source != RTS_BGP; export where is_intra_net6() && source != RTS_BGP; }; include "ospf/*"; };配置 OSPF创建 OSPF 相关目录与配置文件mkdir intra/ospf vim intra/ospf/0.confOSPF 的配置文件可以自行命名, 但建议以 <AeraID>.conf 的规则进行命名按照如下格式编写 OSPF 配置文件area 0.0.0.0 { interface "<lan_interface>" { stub; }; interface "<ospf_interface>" { type <type>; cost <cost>; hello ; retransmit ; priority <num>; authentication <type>; ecmp weight <num>; bfd <yes/no>; }; };配置条目解析aera: OSPF AeraIDinterface: 接口独立配置stub 接口为末节接口, 仅接受路由信息但不进行 OSPF 相关的活动没有任何标注的接口为 OSPF 的活动接口, 会正常的进行邻居的发现与握手type: 接口网络类型broadcast(默认/推荐): 广播网络. 适用于以太网/令牌环等广播介质. 该方式会选举 DR/BDR, 支持多台路由器pointopoint: 点对点网络. 适用于 PPP, HDLC, 点对点隧道, 不选举 DR/BDR, 直接建立邻居nonbroadcast: 非广播多路访问 (NBMA). 适用于帧中继, ATM, X.25, 需要手动配置邻居pointomultipoint: 点对多点. 适用于部分网状连接, 将 NBMA 模拟为多个点对点链路stub: 末节网络, 适用于只有单个路由器的网络, 不发送 Hello, 不形成邻居.cost: 接口开销. 一般内网可以直接填写为 1, VPN 等隧道链路建议设置为稍大的值, 如 100hello: Hello 报文的发送间隔, 单位为秒若邻居间 Hello 报文的发送间隔不同, 则会直接无法握手成为邻居, 因此此参数在不同路由器之间必须相同retransmit: 重传间隔, 单位为秒authentication: OSPF 认证类型ecmp weight: ECMP 权重bfd: 是否启用 BFD 支持示例配置area 0.0.0.0 { interface "br-lan" { stub; }; interface "zta7oqfzy6" { type broadcast; cost 100; hello 20; }; };完成上述所有配置后重启 Bird/etc/init.d/bird restart验证使用以下指令来查看 Bird 的生效状况birdc s p如看到 OSPF 协议为 Running 即表明生效成功intra_ospf_v4 OSPF intra_table_v4 up 16:49:39.948 Running intra_ospf_v6 OSPF intra_table_v6 up 16:49:39.948 Running相关链接[整活向] 跨越 20km 的局域网: 在 OpenWrt 上使用 ZeroTier + OSPF 实现异地内网无感融合结语本人非网络领域专业人士, 如有错误欢迎指出!如果觉得文章对您有所帮助, 请将其分享给需要的人, 感谢!
前言博主上了大学之后, 发现某些校内网站只有在使用校园网的情况下才可被访问. 但在家或在校外的时候, 肯定是没法直接连接校园网的. 这篇文章将会教你使用 Shadowsocks 这款工具对网络流量进行代理, 以实现在不同网络环境下访问网站的目的.使用场景在外访问校园网在外访问企业内部网运维在外访问机房内部网法律声明严禁使用此文章提供的工具与方法进行翻墙等违反法律的行为, 后果自负!本教程及其作者不对任何违反法律行为的读者负责配置需求Linux 服务器脑子本教程基于有公网 IP 地址的服务器进行教学, 如果您的对端设备没有公网, 也可以参考 本教程 来配置私人专有网络.开整本教程将以基于 Debian 的发行版进行示例服务端配置使用 apt 安装 Shadowsocks 及其依赖sudo apt install -y build-essential autoconf libtool libssl-dev libpcre3-dev libc-ares-dev libev-dev asciidoc xmlto automake sudo apt install -y software-properties-common sudo add-apt-repository ppa:max-c-lv/shadowsocks-libev -y sudo apt update sudo apt install -y shadowsocks-libev安装大致需要 3 ~ 4GB 存储空间打开 Shadowsocks 的配置文件nano /etc/shadowsocks-libev/config.json按照此模板填写配置{ "server":["::", "0.0.0.0"], "mode":"tcp_and_udp", "server_port":<Your server port>, "local_port":1080, "password":"<Your password>", "timeout":86400, "method":"chacha20-ietf-poly1305" }添加 "no-delay":true 可以禁用 Nagle 算法, 降低延迟"server":["::","0.0.0.0"] 可以同时监听 IPv4 与 IPv6, 如果您不想监听 IPv6, 可以改为 "server":"0.0.0.0"此外, 这里还有一些高级参数可以供您选择:nameserver: 添加指定 DNS 服务器地址ipv6_first: 是否优先使用 IPv6worksers: 工作线程数. 一般指定为 CPU 核心数mtu: 最大传输单元. 当代理情况较差时, 可以尝试降低此值保存配置后, 为 Shadowsocks 添加开机自启同时启动程序sudo systemctl start shadowsocks-libev sudo systemctl enable shadowsocks-libev启动后, 可以通过查看程序日志来确定是否运行正常sudo systemctl status shadowsocks-libev运行正常的日志如下:● shadowsocks-libev.service - Shadowsocks-libev Default Server Service Loaded: loaded (/lib/systemd/system/shadowsocks-libev.service; enabled; preset: enabled) Active: active (running) since Thu 2026-01-29 10:29:21 EST; 18s ago Docs: man:shadowsocks-libev(8) Main PID: 927631 (ss-server) Tasks: 1 (limit: 1138) Memory: 2.9M CPU: 37ms CGroup: /system.slice/shadowsocks-libev.service └─927631 /usr/bin/ss-server -c /etc/shadowsocks-libev/config.json Jan 29 10:29:21 ACCK-HK systemd[1]: Started shadowsocks-libev.service - Shadowsocks-libev Default Server Service. Jan 29 10:29:21 ACCK-HK ss-server[927631]: 2026-01-29 10:29:21 INFO: UDP relay enabled Jan 29 10:29:21 ACCK-HK ss-server[927631]: 2026-01-29 10:29:21 INFO: enable TCP no-delay Jan 29 10:29:21 ACCK-HK ss-server[927631]: 2026-01-29 10:29:21 INFO: initializing ciphers... <Data Deleted> Jan 29 10:29:21 ACCK-HK ss-server[927631]: 2026-01-29 10:29:21 INFO: tcp server listening at [::]:<Data Deleted> Jan 29 10:29:21 ACCK-HK ss-server[927631]: 2026-01-29 10:29:21 INFO: tcp server listening at 0.0.0.0:<Data Deleted> Jan 29 10:29:21 ACCK-HK ss-server[927631]: 2026-01-29 10:29:21 INFO: udp server listening at [::]:<Data Deleted> Jan 29 10:29:21 ACCK-HK ss-server[927631]: 2026-01-29 10:29:21 INFO: udp server listening at 0.0.0.0:<Data Deleted>如您的程序运行正常没有报错, 那么服务端至此配置完成客户端配置Shadowsocks 的客户端有很多种选择, 本站点不方便进行展示, 但可以提供一些外部的教程供读者参考:Shadowsocks Windows 使用说明在Ubuntu上部署Shadowsocks-Libev客户端Shadowsocks完全指南：从入门到精通（2025最新版）结语感谢阅读, 如有错误欢迎指出!
随时随地访问异地设备! - 自托管异地组网 VPN - Easytier 部署教程
前言我们有时在外面需要访问不在同一个内网环境中的异地设备, 如果要搭建 Frp 等类似服务, 会非常的麻烦, 而且灵活性底. 这时我们就需要 VPN 服务. 但传统的 VPN 服务搭建成本太高: 服务器太贵, 搭建又很麻烦. 那么, 有什么低成本, 部署简单的 VPN 服务吗? 有的. 本篇文章将为你介绍一种可以自托管的民用 VPN 组网服务 Easytier.声明此 VPN 并非多数人所理解的用于科学上网的代理, 而是 Virtual Private Network (虚拟私人网络). 这种技术可以让您在公共网络中建立一条专有虚拟网络通道, 以此来建立处于不同网络环境中的设备的连接. 借助这项技术, 您可以在外部网络中使用一个专有的 IP 来连接您的设备, 就像在家里使用内网 IP 地址那样.搭建需求一台有公网 IPv4 的云/本地服务器 (带宽不做要求)NAT 等级 >= 3 的家用宽带 (非必须)注: 如果 NAT 等级不满足此要求, 且 IPv6 不可用的情况下, 很可能无法打通 P2P善于思考的大脑为什么选择 EasyTier部署便利, 可部署性强同时支持中心化/去中心化部署有完善的 WebUI, 管理方便不强制 HTTPS设备接入方便支持设备平台丰富 ( Linux, Windows, Android, MacOS, HarmonyOS )支持设备架构丰富 ( x86, x86-64, armhf, arm64, riscv, mips, loongarch )我会本篇文章可能需要一个可以科学上网的网络环境1. 服务端配置此教程面向的服务端为 Linux 平台1.1 下载 Easytier 服务端进入 Easytier 官方发布页 下载与服务器环境对应的发行版, 并解压至任意目录使用以下指令给予二进制文件可执行权限chmod +x ./easytier-core chmod +x ./easytier-web-embedeasytier-core 是整个 Easytier 的核心程序, 无论是服务端还是客户端, 均通过此程序建立连接.easytier-web-embed 是一个内嵌了用于管理 Easytier 连接页面的 Web 服务器. 如果您不需要这类工具, 或想使用公共的 Web 页面, 也可以不启用此程序1.2 部署 Easytier 服务为了保证 Easytier 在服务器意外断电重启后还能正常运行, 我们需要将 Easytier 部署为 Linux 服务. 这里我们使用 systemctl 来部署使用以下指令来分别创建内核与 Web UI 的服务sudo vim /etc/systemd/system/easytier-core.service sudo vim /etc/systemd/system/easytier-web-embed.service在 easytier-core.service 中填入如下内容[Unit] Description=easytier-core After=network.target [Service] Type=simple ExecStart=<path/to/easytier-core> -w udp://127.0.0.1:22020/<UserName> --machine-id aliyun-sh User=root Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target在 easytier-web-embed.service 中填入如下内容[Unit] Description=easytier-web-embed After=network.target [Service] Type=simple ExecStart=<path/to/easytier-web-embed> --api-server-port 11211 --api-host http://127.0.0.1:11211 --config-server-port 22020 --config-server-protocol udp User=root Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target保存后, 分别启动两项服务的开机启动, 然后先运行 Web UI 的服务sudo systemctl daemon-reload sudo systemctl enable easytier-web-embed sudo systemctl enable easytier-core sudo systemctl start easytier-web-embed使用这条命令来检查服务运行状况, 若无异常, 则运行sudo systemctl status easytier-web-embed进入 Web UI (地址为 http://<Server IP>:11211), 在 API Host 中填入 http://<Server IP>:11211, 并在如 图 1-2-1 所示的位置注册账号.注: 用户名应与刚才注册 core 服务时填入的 <UserName> 字段相同注册账号成功后登录 Web UI, 并使用这条指令启动 easytier-core 服务.sudo systemctl start easytier-core在 Web UI 的侧边栏中切换至 Device List 一栏. 如果配置无误, 你应当看见如 图 1-2-3 所示的您的服务器.点击设备的齿轮图标, 即设置按钮, 跳转至创建新连接的页面. 在此页面填入你的 VPN 信息.注: 如果您正在建立一个新的 VPN 网段, 那么您设置的 IP 地址网段将会成为此 VPN 的网段. 如果您使用的是 DHCP, 那么服务器将自动分配一个可用的网段.例如: 如果您的 IP 地址设置为 10.0.0.1, 那么该 VPN 的网段就会成为 10.0.0.x, 后续加入的设备均会被分配到此网段下.Network Name: 该 VPN 网段的标识符. 如果您想让其他设备加入此 VPN, 那么这些设备设置的 Network Name 应该相同.注: Easytier 识别不同 VPN 的标识符就是这个 Network Name, 一个 Network Name 对应的就是一个 VPN.Network Secret: 该 VPN 的密码.Networking Method: 网络连接方式. 选择 Manual 后, 填入 tcp://<IPAddr>:11010, udp://<IPAddr>:11010. 请在输入完一项后点击如 图 1-2-4 所示的按钮来加入到列表, 否则不生效.Public Server: Easytier 的公共服务器. 如果您想使用公共服务器来建立 VPN 连接, 那么直接使用此选项即可.Manual: 手动配置服务器. 适用于大多数中心化部署方案.Standalone: 将此设备作为独立服务器使用.Advanced Settings: 高级设置. 如果您具有一定的网络工程基础, 可以按照自己的需求来配置, 否则请保持原样不动.您可以参考 Easytier 官方文档 来对这里的设置进行配置.Port Forward: 端口转发. 同上.此时使用这条命令查看 easytier-core 的输出sudo systemctl status easytier-core正确配置后的状态输出应如 图 1-2-5 所示的类似2. 客户端配置Linux 客户端Linux 有两种配置方式: GUI 桌面程序配置与 CLI 命令行程序配置. 因为 GUI 在 Linux 平台使用较少, 因此这里只教学 CLI 程序的配置. 此方法同时适用于客户机与服务器. 当然, 如果您想配置 GUI 程序, 可以参考下文 Windows 平台的 GUI 配置.2.1 下载程序从 官方 Release 页面 根据自身设备平台下载适用于 Linux 版本的压缩包 (示例文件名 easytier-linux-x86_64-v2.4.5.zip), 并将其解压至您的设备.使用下列命令授予可执行权限chmod +x ./easytier-core2.2 配置程序在注册为服务之前, 我们首先对程序进行测试.使用这条指令来启动 Easytier 客户端./easytier-core <IP Mode> --network-name <Network Name> --network-secret <Network Secret> -p <Server Address> <Optional Config>IP Mode: 预期的 IP 地址. 如果您想配置一个静态 IP 地址, 请使用 --ipv4 <IP Address> 参数. 如果您想配置一个 DHCP 地址, 那么请使用 --dhcp 参数Network Name: 该 VPN 网段的标识符.Network Secret: 该 VPN 的密码. 想加入此 VPN 就必须输入相同的密码, 不过多解释.Server Address: 服务器地址. 推荐使用 TCP 方式连接服务器, 因此该地址的填写格式为: tcp://<Server IP>:11010.Optional Config: 附加参数. 这里推荐添加 --multi-thread 参数以启用多线程. 如果您想添加其他更多的参数, 请参考 Easytier 官方文档启动程序后, 若输出的日志正常, 则证明此配置有效. 正常的日志输出应如 图 2-2-1 所示, 包含与其他 peer 连接成功的提示.2.3 注册服务我们这里同样使用 systemctl 注册服务.使用这条指令创建 easytier-core 的服务sudp vim /etc/systemd/system/easytier-core.service将如下内容添加到此文件中[Unit] Description=easytier-core After=network.target [Service] Type=simple ExecStart=<path/to/easytier-core> <Config> User=root Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target使用以下命令重载 systemctl 并启动服务sudo systemctl daemon-reload sudo systemctl enable easytier-core sudo systemctl start easitier-core使用这条指令检查该服务的日志sudo systemctl status easytier-core正确的日志输出应如 图 2-2-2 所示, 包含运行成功的提示与 peer 信息.至此, 配置结束.Windows 客户端Windows 有两种配置方式: GUI 桌面程序配置与 CLI 命令行程序配置. 如果您的配置对象为服务器, 那么则推荐用 CLI 的方式进行配置. 如果为普通家用电脑, 则推荐用 GUI 的方式进行配置.2.1 GUI 配置从 官方 Release 页面 下载适用于 Windows 版本的 GUI 程序 (示例文件名 easytier-gui_2.4.5_x64-setup.exe), 并将其安装至您的电脑. 安装完成后启动程序.按照下方的提示按需配置您的私有 VPN.Virtual IPv4: 该 VPN 网络中您的设备的虚拟 IPv4 地址. 作为客户端如果没什么特殊的需求, 建议勾选 DHCP 来自动获取可用的 IP 地址.注: 如果您正在建立一个新的 VPN 网段, 那么您设置的 IP 地址网段将会成为此 VPN 的网段. 如果您使用的是 DHCP, 那么服务器将自动分配一个可用的网段.例如: 如果您的 IP 地址设置为 10.0.0.1, 那么该 VPN 的网段就会成为 10.0.0.x, 后续加入的设备均会被分配到此网段下.Network Name: 该 VPN 网段的标识符.Network Secret: 该 VPN 的密码.Networking Method: 网络连接方式. 选择 Manual 后, 填入 tcp://<IPAddr>:11010, udp://<IPAddr>:11010. 请在输入完一项后点击如 图 2-1-1 所示的按钮来加入到列表, 否则不生效.Public Server: Easytier 的公共服务器. 如果您想使用公共服务器来建立 VPN 连接, 那么直接使用此选项即可.Manual: 手动配置服务器. 适用于大多数中心化部署方案.Standalone: 将此设备作为独立服务器使用.Advanced Settings: 高级设置. 如果您具有一定的网络工程基础, 可以按照自己的需求来配置, 否则请保持原样不动.您可以参考 Easytier 官方文档 来对这里的设置进行配置.Port Forward: 端口转发. 同上.您可以以 图 2-1-2 所示的博主的配置作为参考.配置完成后, 点击 Run Network, 启动 VPN 服务. 如果配置正确且网络环境较为理想, 你应当可以打通所有设备的 P2P.说明: 如果无法打通 P2P, 即处于 relay 状态, 那么访问该节点时, Easytier 会选择一台 P2P 延迟对双方都最低的设备来进行中转. relay 符号旁的数字表示 经过的中转节点数量.2.2 CLI 配置CLI 的配置方法在 Windows 和 Linux 平台上并无太大差别, 因此这里请参考上文 Linux CLI 程序的配置方法, 在 Windows 板块, 我将只介绍服务的配置方法.easytier-core 的可执行文件本身附带注册服务的功能, 这里我们可以直接调用程序本身来注册 Windows 服务. 指令如下sudo .\easytier-cli.exe service install ` --description <Service Description> ` --display-name <Service Name> ` --disable-autostart ` --core-path <path/to/easytier-core> ` --service-work-dir <Work Dir> ` -- <Config>Service Description: 服务描述. 随意填写Service Name: 服务名称. 随意填写--disable-autostart: 禁用开机自启. 如果您想启用, 可以将其改为 --enable-autostart, 或执行完后手动启动 service.msc 进行更改.path/to/easytier-core: easytier-core 程序的路径Work Dir: easytier-core 程序的工作目录. 推荐直接填写放置可执行文件的目录.Config: 启动程序时传递的参数. 配置方式与 Linux 的 CLI 相同.待程序提示注册完成后, 使用这条指令启动服务sudo .\easytier-cli.exe service start启动完成后, 可以使用这条指令来查看服务状态./easytier-cli service status如服务运行正常, 则配置至此结束结语本篇文章涵盖了 Easytier 从 GUI 到 CLI, 从 Linux 到 Windows 的配置. 编写不易, 如果觉得有用, 请留下你的评论, 并将其分享给有需要的人, 感谢!本人非专业人士, 如有误, 请直接指出, 感谢!
服务器或 NAS 家庭媒体库终极解决方案, 轻松实现订阅自动下载 + 获取元数据
前言相信大家在拥有一台自己的私人 NAS 或服务器后, 肯定会想搭建一个属于自己的媒体资源库. 现在各大网盘虽然容量大, 但下载速度一般都会受到网速, 会员制限速等限制. 那么, 最合适的解决方案是什么呢? 当然是搭建一个部署在自己家的本地媒体库! 这篇文章将会带你入门家庭媒体库, 并带你一步一步进行安装+调试!设备需求拥有至少一个千兆及以上速率电口的计算机设备性能较强的路由器/交换机设备 (用于进行高速内网传输)NAS / 服务器性能要求CPU内存显卡硬盘J1900 or up8GB or upNo Requirement取决于自身需求需要用到的项目Emby Media Server[数据删除]该项目在 Github Discussion 中提出不要在国内传播, 故删除相关信息 如果你是一名 CTFer, 可能会找到隐藏信息(?)qBittorrent Enhanced Edition1.下载项目在开始部署之前, 我们需要先下载所有需要的文件访问 Emby Media Server 的官方下载页面, 下载适用于 Windows 的服务端访问 [数据删除] 的官方下载地址, 下载 Windows 版本访问 qBittorrent Enhanced Edition 的官方发行版页面, 下载 Windows 版本2. 配置 qBittorrent 下载器安装完 qBittorrent 后, 打开程序的设置页面, 在侧边栏中选中 WebUI (网页 UI), 在 Authentication (认证) 一栏中设定网页 UI 的账号密码.您也可以根据自身的需求设置 内网/公网 IP 的白名单. 注意: 白名单内的 IP 地址在登录 Web UI 时不需要输入账号密码. 请认真考虑安全性.您同时也可以在此更改绑定的端口号, 以确保不与您的其他业务冲突.切换至侧边栏的 Behavior (行为) 栏目, 找到 Desktop (桌面) 子项目中的 Start qBittorrent on Windows start up (在 Windows 启动时打开 qBittorrent), 勾选该选项, 并点击 OK 保存.完成配置后请手动使用浏览器访问 <服务器 IP>:<端口> 页面, 以确保 Web UI 的正常启动.注: qBittorrent 的下载方式为 BT 下载. 这种下载方式的下载速度取决于这份资源在您下载的时候有多少人 做种. 做种的机器数量越多, 下载速度则越快. 反之, 下载速度则越慢. 因此, 使用这种下载方式下载最近的番剧以及其他资源的速度会相对较快, 下载老资源则相对较慢. 不仅如此, 路由器的配置也会影响种子的发现与下载. 博主鼓励读者在路由器上使能 uPnP 功能. 具体如何启用请另行搜索, 本片不过多赘述.3. 配置番剧自动订阅将下载好的 [数据删除] 解压至一个单独的文件夹内, 运行 [数据删除]-launcher.exe 启动程序.访问 <服务器 IP>:7789 地址进入 数据删除] 的 Web UI.默认账号密码均为 admin进入 Web UI 后, 点击位于页面右上角的 设置 按钮, 填入 qBittorrnet 的 Web UI 地址, 并输入刚才在 qBittorrent 中设定的用户名和密码, 同时按照自己的需求设置 普通 TV 番剧 与 剧场版 的保存位置. 图为博主的设置截图注: [数据删除] 请求 qBittorrent 的模式是由运行在服务器上的程序请求, 与用于访问 Web UI 的主机的环境无关. 因此, 如果您没有分机运行 qBittorrent 与 [数据删除], 您完全可以填写 localhost 或 127.0.0.1 作为服务器地址.填写完成之后点击 测试 按钮, 以测试与 qBittorrent 的连接是否正常.测试无误后, 可以按照自己的需求, 更改其他页面的选项. 以下是一些建议启动与关闭的选项:下载设置 -> 检测是否死种: 启用基本设置 -> 添加订阅 -> 仅获取动漫: 勾选基本设置 -> 添加订阅 -> tvshow.nfo: 启用基本设置 -> 添加订阅 -> 自动上传: 启用基本设置 -> 重命名设置 -> 自动重命名: 启用基本设置 -> RSS 设置 -> 遗漏检测: 启用基本设置 -> RSS 设置 -> 自动跳过 X.5 集: 启用您还可以在 通知 一栏中启用通知服务, 以实时获取您的订阅链接状态与更新点击页面右上角的 添加 -> 添加订阅 按钮, 即可跳转到番剧的订阅页面. 点击 Mikan 按钮后, 您就可以选择当季想要订阅的番剧与剧场版的影视资源. 当然, 您还可以使用 搜索 功能, 来下载以前的影视资源.此软件的番剧源为 Mikan Project.4. 配置 Emby 媒体服务器启动下载的 Emby 服务端安装器, 其会弹出些许页面让您确认是否下载, 全部确认即可. 该安装程序会自行下载并安装 Emby 服务端.在安装完成后, 主程序会自动打开 Emby Web UI, 请按照页面指示, 配置您的媒体库与用户. 配置完成后, 即可进入主页面.注: 在配置过程中, 可以参考以下提示, 提高体验与元数据的识别率:将一切有关国家与地区的选项全部选为 中国启用 Prefer embedded titles over filenames (使用内嵌标题而非文件名)启用 Enable real time monitoring (启用实时检测)勾选所有数据源, 并确保 TheTVDB 在每一项中都处于最高优先级启用 Save artwork into media folders (保存艺术作品至媒体文件夹)启用 Download images in advance (提前下载图像)稍等片刻后, 您便可以在主页等页面看到您的媒体文件.如果需要进一步优化您的 Emby 体验, 可以参考 Emby 优化与升级指南至此, 配置结束结语如果您觉得本篇文章有用的话, 请推荐给您身边需要的人, 感谢!如有任何文章中的错误与疏忽, 欢迎提出, 感谢!
新华三 H3C 部分交换机 Console 终端清除密码方案
前言在遇到新华三交换机 Console 调试端口密码未知的情况下, 我们很难去进行交换机相关配置. 那么, 有没有一种方法可以强制重置交换机的密码呢? 这篇文章会告诉你解决方案.测试平台交换机: H3C S5130S-52P-EI调试程序: Serial Debug Assistant1. 进入 Bootroom 菜单注: 开始操作前, 请确保串口调试程序处于终端模式在交换机开机前, 使用 Console 串口调试线连接交换机与电脑, 并打开串口随后给交换机通电, 并仔细观察串口打印信息. 当观察到 Press Ctrl+B to access EXTENDED BOOT MENU 字样的信息 (如图 1-1) 时, 根据提示按下对应快捷键.按下对应快捷键后, 您应该看到 Password recovery capability is enabled. 等字样. 如没有显示, 请更换串口调试软件2. 执行重置指令进入扩展菜单 (如图 2-1) 后, 找到 Skip current system configuration 等字样按下对应数字键后, 敲击回车, 并等待指令执行完成.执行完成后, 重启设备.3. 重新设置密码设备重启完成后, 会直接进入指令页面. (交换机无默认密码)使用 system-view 命令, 进入系统视图指令模式输入以下指令进行密码设置user-interface aux 0 // 如果没有 aux 0, 则换用 console 选项 authentication-mode password // 设置登陆方式为密码 set authentication password simple <password> // 设置密码为 <password> (请自行替换) user privilege level 3 // 设置用户权限等级为最高 - 3随后重启交换机. 至此便完成了密码的重置结语作为运维人员, 我们不应随便配置正在运行业务的设备. 如您在正在运行业务的设备上碰到了此问题, 请响您的设备管理人员寻求帮助.感谢阅读, 如有问题, 欢迎指出!
最强校园网! - 适用于单网口的校园网多线路载波聚合解决方案
前言博主刚上大学, 发现大学的校园网实在是太烂了. 不仅一个宿舍就只有一个网口能有线拨号上网, 而且每个用户只能分配到差不多 40 mbps 的网速. 于是诞生了这么个想法: 利用软路由来实现单端口多播和载波聚合, 从而实现宽带速率的叠加.注意: 本教程仅适用于支持单端口多播的校园网环境, 如果您的校园网环境与此不同, 请不要参考这篇教程.如果您的校园网为多网口分别拨号, 却也想实现这样的功能, 请参考这篇教程设备 / 环境需求支持单端口多 PPPoE 播号的校园网接口一台搭载至少两个 RJ-45 网口的 X-wrt 软路由任意类型交换机注意: 原版 OpenWrt 似乎并不能配置Xwan, 因此这里请务必选择基于 OpenWrt 的 X-wrt资源下载X-wrt官方下载页面1. 启用 Xwan登录 LuCI WebUI , 跳转到 网络 (Network) --> Xwan 页面勾选 启用 (Enable)在下方 Xwan 数量 (Xwan Number) 中设置你要聚合的宽带数量博主这里聚合了博主和舍友共四条校园网宽带, 故输入 4在 互联网协议 (Internet Protocal) 中选择你需要的协议博主这里选择了 IPv4 and IPv6点击 保存并提交 (Save & Apply)注: 对于 Xwan, 系统会自动配置好防火墙所需规则和负载均衡, 无需手动配置.2. 配置 PPPoE 拨号上网跳转至 网络 (Network) --> 接口 (Interfaces) 页面此时, 你可以看到有一条主线 wan 和三条分线 Xwan01; Xwan02; Xwan03; Xwan04分别为每一条线路设置相应的拨号上网账号密码设置完后单击 保存并应用 (Save & Apply)如果配置无误, 所有线路应该都可以正常拨号.验证与测试使用多线程测速软件或多线程下载器进行验证, 如得到的网速是叠加后的网速, 那么则配置成功博主这里叠加的是四条 40 mbps 的宽带, 故结果为 147.70 mbps 为正常后记博主非专业网络相关从业人员, 如有遗漏或错误, 欢迎各路大佬指出!
"超绝加强版"随身WiFi - 手搓 CPE 路由, 随时随地获得最强信号!
前言博主即将去大学上学, 鉴于大学严苛的上网环境(指价格贵的要死体验还很差的校园网)和手机流量上网的弱信号与卡顿, 索性准备买台 CPE 使用, 奈何市面上的 CPE 要么用的某不知名野鸡模块, 要么天线设计差, 信号也不大行, 故打算手搓一台 CPE 路由. 这篇文章将会教您如何自己制作属于自己的 CPE 路由.硬件需求一台支持安装 OpenWrt 或基于此系统的衍生系统的硬件设备一块适用于上述硬件设备的移动通信模块附件OpenWrtX-wrtphysdiskwrite本篇专有名词解释ISP - 网络服务提供商, 即运营商1. 安装系统1.1 下载系统映像本教程所需要的系统为 OpenWrt, 点击此处跳转至官方下载站. 你也可以使用为国内用户特别优化的第三方系统 - X-wrt, 点击此处跳转至官方下载站.1.2 安装系统进入任意 Windows PE, 使用 physdiskwrite 程序烧录映像至硬盘.# 用法 physdiskwrite.exe -u -d <diskNumber> <path\to\system.img>diskNumber 为磁盘序号, 如果您不知道, 可以不指定该参数, 即不带 -d 指令.path\to\system.img 为到系统映像的文件路径.-u 为去除默认的 2GB 磁盘大小限制待烧录完成后, 拔下外部存储介质, 直接重启即可.注: 默认的 rootfs 分区大小很小, 如需扩容, 请手动使用 DiskGenius 等软件扩容2. 部署环境2.1 初始化系统初次启动后, 请使用网线接入到目标机器. 当设备有两个及以上 RJ-45 端口时, 其中的一个会被自动更改为 WAN 口, 届时请接入显示器观察系统日志, 如果插入时提示网卡的模式为 forwarding mode, 那么这个端口就是可以使用的. 如果不是, 请更换端口.使用默认账号密码 admin 登录后台, 转至 系统 (System) --> 管理 (Administration) 一栏, 并跳转至 SSH 访问 (SSH Access) 子项, 打开 SSH, 并启用密码访问.跳转至 路由器密码 (Router Password) 子项, 更改路由器密码.2.2 添加对应接口转至 网络 (Network) --> 接口 (Interfaces) 一栏, 点击左下角的 添加新接口 (Add new interface...)输入任意名称后, 协议 (Protocal) 选择 ModemManager, 并点击 创建接口 (Create interface)在 通用设置 (General Settings) 中找到 Modem device, 并选择您接入的调制解调器设备.注: 如找不到您接入的设备, 请仔细检查设备是否连接正确. 如果您在一些 x86 的设备上使用了 MiniPCIe 接口的调制解调器, 请仔细观察设备上是否有两个及以上的 MiniPCIe 接口, 如果有, 请更换接口尝试. 部分接口仅仅支持 mSATA 协议, 并非 PCIe 协议在 APN 中输入对应 ISP 的 APN, 具体见下表ISPAPNCMCC 中国移动cmnetCTCC 中国电信ctnetCUCC 中国联通uninet请根据自己插入的 SIM 卡类型填入对应的 APN跳转至 防火墙设置 (Firewall Settings), 选择防火墙为 WAN确保一切设置完成后, 点击 保存 (Save)注: 由于不同 ISP 的特性, 通用设置中的一些配置可能会不同, 博主这里使用的是 CMCC 的普通 SIM 卡, 这样配置便可. 其他 ISP 如这样配置不生效, 请自行查询具体配置.点击 保存并应用 (Save & Apply), 提交配置2.3 验证配置在提交完成后, 回到路由器后台主页, 等待网络连通. 若可以正常上网, 则证明此时配置已经生效, 你的 CPE 也就大功告成了.结语CPE 的上网体验取决于您的天线质量与通信模块性能. 如果觉得上网体验不好, 建议更换高增益天线和性能更好的通信模块尝试本人并非专业技术人员, 如有遗漏或错误, 欢迎指出, 我会虚心接受您的建议.