使用 Noeio 访问内网服务(子网路由)
内网里跑着一些只监听内网地址的服务——nginx 网关、数据库、管理后台之类。用子网路由让内网里的一台 Linux 节点把整个网段通告进 Mesh,远端节点就能用内网 IP 直接访问这个网段里的任意一台机器,被访问的机器上都不需要装 noeio。
下面假设两台机器已经在同一个虚拟网络里并能互相 ping 通。还没组网的话,先按跨云组网走一遍:部署 derper、生成 token、启动 daemon、分配虚拟 IP。
- 1
在内网的 Linux 节点上通告网段
挑一台能访问到目标服务的内网机器当子网路由器,把它所在的网段通告出去。daemon 正在运行时直接用 noeio route advertise 即可生效,不需要重启;命令与参数见管理子网路由。
noeio route advertise 192.168.10.0/24或者在启动时一并指定noeio boot --advertise-routes 192.168.10.0/24通告端仅 Linux 可用,macOS / Windows 上会返回 FAILED_PRECONDITION,网段不会进入广播。auto_nat 默认开启,daemon 会自己开 ip_forward 并在独立的 noeio 表里配好 SNAT;ip_forward 是主机全局的,想自己管就把它设为 false,见配置文件。
- 2
在远端节点上接受这个网段
消费端要显式打开 accept_routes 才会安装别人通告的路由,三个平台都支持。这一项没有运行时命令,改完要重启 daemon。
noeio boot --accept-routes或者写进配置文件[router] accept_routes = true - 3
确认路由装上了
输出里会列出学到的网段、它来自哪个节点、当前走直连还是中继,以及状态。active 表示已安装并在用;rejected 会给出原因,最常见的是与本机物理网卡的网段重叠——本地局域网优先,其余冲突规则见子网路由。
noeio route list - 4
用内网 IP 访问服务
此时远端节点访问这个网段的流量会经子网路由器转发,直接请求目标主机的内网地址即可,端口不受限制。下面以网段里的一个 nginx 网关为例。
curl -I http://192.168.10.2流量在子网路由器上做了 SNAT,所以服务端看到的来源是子网路由器的内网地址,不是远端节点的虚拟 IP。请求不通时先在子网路由器上发同一条请求,用来区分是服务本身 / 内网防火墙的问题,还是路由没生效。
- 5
按域名访问(可选)
nginx 靠 server_name 分流时,只用 IP 请求会落到 default server 上。临时验证加一个 Host 头就够;长期用把域名指到这个内网 IP,写进远端节点的 hosts 或内网 DNS。
临时验证:带 Host 头curl -I -H 'Host: intranet.example.com' http://192.168.10.2长期使用:写进远端节点的 hosts192.168.10.2 intranet.example.com
几点限制
- 目前只打通 overlay → 内网这一个方向:内网主机不能主动连远端节点的虚拟 IP,回包靠 conntrack 返回。
- 有些网段不能通告:前缀短于 /8(含 0.0.0.0/0,出口节点暂不支持)、包含本节点 overlay 地址的网段、包含 derper 或 STUN 地址的网段,以及 127.0.0.0/8 与 169.254.0.0/16。
- 多台机器通告同一网段是主备而非负载均衡:peer_id 最小的为 active,它消失后由下一个接替。
- IPv6 子网、以及 macOS 作为通告端,都还不支持。
想了解通告与撤销的具体机制、NAT 规则和信任模型?