尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

sshuttle 平台专项指南:TPROXY 完整 IPv6/UDP 支持与 Windows 环境下的 VM 桥接方案

sshuttle 平台专项指南:TPROXY 完整 IPv6/UDP 支持与 Windows 环境下的 VM 桥接方案 网络CLI【免费下载链接】sshuttleWrong project! You should head over to http://github.com/sshuttle/sshuttle项目地址https://gitcode.com/gh_mirrors/ssh/sshuttle点击查看免费下载导读本文聚焦 sshuttle 官方文档「Platform Specific Notes」章节即 docs/platform.rst下的两篇平台专项文档深入讲解两条核心实战路径一是 Linux 下唯一同时完整支持 IPv6 与 UDP 的TPROXY 转发方法涵盖开机一次性路由配置、--auto-nets的 IPv6 限制、--exclude排除规则、出站路由前置条件并结合源码剖析其 mangle 表防火墙规则与透明代理 socket 原理二是Microsoft Windows 平台无原生支持的背景下如何通过 Vagrant/VM 桥接网卡搭建中转网关使 Windows 整机流量经由 Linux VM 走 sshuttle 隧道。读完本文你将能够独立完成 TPROXY 环境初始化与故障排查以及在 Windows 上部署 sshuttle 的完整替代方案。一、平台专项文档概览docs/platform.rst是 sshuttle 文档集中与具体操作系统/网络平台相关的专项章节入口其目录结构指向两个子文档docs/tproxy.rstLinux TPROXY 转发方法的使用注意事项与前置条件docs/windows.rstMicrosoft Windows 上的非原生运行方案VM 桥接网卡。sshuttle 的转发方法本身是插件化的sshuttle/methods/__init__.py定义了所有方法的基类BaseMethod并提供一个get_method()工厂函数按名称动态加载对应模块见 sshuttle/methods/init.py。当前仓库支持的 method 包括auto、nat、tproxy、pf命令行选项定义见 sshuttle/cmdline.py其中nat与tproxy均基于 Linux iptables而tproxy是平台专项文档中重点介绍的 Linux 专属方案。二、TPROXY唯一完整支持 IPv6 与 UDP 的转发方法2.1 TPROXY 的能力定位官方文档开宗明义TPROXY 是 sshuttle 唯一完整支持 IPv6 和 UDP 的转发方法。这一点可以直接在源码中得到印证——sshuttle/methods/tproxy.py中Method.get_supported_features()明确返回ipv6 True并在检测到recvmsg可用时返回udp True、dns True见 sshuttle/methods/tproxy.py。对比之下nat方法在 sshuttle/methods/nat.py 中直接抛出异常family ! AF_INET时报错即NAT 方法仅支持 IPv4udp为真时报错即NAT 方法不支持 UDP。因此凡是需要 IPv6 或 UDP含 DNS 转发的穿透场景TPROXY 是 Linux 平台上的唯一选择。2.2 开机后的一次性 root 路由配置TPROXY 依赖 Linux 内核的透明代理框架其核心机制是通过fwmark防火墙标记将标记了 1 的数据包强制导入本地回环处理。文档明确要求以下命令每次开机后以 root 身份执行一次ip route add local default dev lo table 100 ip rule add fwmark 1 lookup 100 ip -6 route add local default dev lo table 100 ip -6 rule add fwmark 1 lookup 100逐条解读ip route add local default dev lo table 100在路由表 100 中声明「本地路由表默认项指向 loopback 设备」使所有被标记的 IPv4 包都视为发往本机ip rule add fwmark 1 lookup 100为 IPv4 增加一条策略路由规则凡 fwmark 为 1 的包都查询路由表 100后两条是 IPv6 的等价配置ip -6。这两组命令一 IPv4、一 IPv6正好对应 TPROXY 方法对双栈的完整支持。它们与 sshuttle 运行时由防火墙脚本动态添加的MARK --set-mark 1规则配合sshuttle 在 mangle 表中把所有需要拦截的流量打上标记 1内核策略路由随即把标记流量导入本地从而让本地监听 socket 得以接收这些原本发往远端地址的数据包。2.3 客户端必须以 root 运行由于 TPROXY 依赖IP_TRANSPARENTsocket 选项非本地地址绑定与上述 root 级路由配置客户端进程本身也需要 root 权限。文档给出的示例命令为sudo SSH_AUTH_SOCK$SSH_AUTH_SOCK $HOME/tree/sshuttle.tproxy/sshuttle --methodtproxy ...其中SSH_AUTH_SOCK$SSH_AUTH_SOCK用于在 sudo 提升权限时保留当前 SSH agent 的认证 socket确保后续 ssh 到远程服务器时不被打断要求密码$HOME/tree/sshuttle.tproxy/sshuttle是文档写作时的本地路径示例实际部署时应替换为你仓库中run脚本或安装后的 sshuttle 可执行文件路径--methodtproxy是必须显式指定的参数详见 2.6。2.4--auto-nets不自动检测 IPv6 路由--auto-nets命令行简写-N见 sshuttle/cmdline.py让 sshuttle 依据远程服务器返回的路由表自动确定需要转发的子网但它只覆盖 IPv4 路由不会自动检测 IPv6 路由。因此IPv6 路由需要手动追加到命令行文档示例为在命令末尾追加::/0。从源码实现看--auto-nets的生效路径是服务器端把路由列表作为消息推送给客户端客户端在onroutes()回调中解析family,ip,width三元组并加入fw.auto_nets且当 family 为 AF_INET6 而本地 v6 监听器不存在时会直接忽略该路由见 sshuttle/client.py。结合 2.2 的一次性配置可总结出 IPv6 穿透的完整前置链路内核路由配置 →--methodtproxy→ 命令行显式::/0或更精确的 IPv6 网段。2.5 必须用--exclude排除两处地址文档强调了两类必须排除的流量否则会出现「拦截回环」故障远程 SSH 服务器自身的 IPsshuttle 启动后本地即开始拦截转发规则中的目标网段若 SSH 服务器 IP 落在被拦截网段内sshuttle 会尝试拦截发往 SSH 服务器的 ssh 数据包即连接隧道本身所用流量导致隧道自锁、无法工作。包含本机 IP 的 UDP 返回包含 DNS 应答当拦截网段足够宽如0.0.0.0/0或::/0且把客户端自身 IP 也包含在内时UDP 应答包尤其是 DNS 响应可能被再次拦截并弹回形成环路。解决办法统一为使用--exclude简写-x参数可多次使用也支持--exclude-from简写-X从空白分隔文件批量读取排除网段见 sshuttle/cmdline.py。命令行解析逻辑位于 sshuttle/cmdline.py默认排除项为127.0.0.0/8随后依次追加所有-x/--exclude与-X/--exclude-from的值。在 TPROXY 防火墙规则中排除网段会生成RETURN规则见 sshuttle/methods/tproxy.py即对这些目标直接放行、不参与转发从而避免拦截回环。2.6--methodtproxy必须显式指定sshuttle 默认的 method 为auto在 Linux 上优先检测到iptables时自动选用nat见 sshuttle/methods/init.py而nat不支持 IPv6 与 UDP。因此要启用 TPROXY 的完整能力必须在命令行显式传入--methodtproxy。cmdline.py中 method 参数的合法取值为auto、nat、tproxy、pf其他取值会直接报错见 sshuttle/cmdline.py。2.7 出站路由必须真实存在TPROXY 只能拦截「确实有路由、正在被内核尝试发出的数据包」。如果本机到某目标根本不存在路由例如网络环境无 IPv6 支持那么内核根本不会生成 IPv6 包sshuttle 自然也无从拦截。文档用telnet -6演示了这一现象telnet -6 www.google.com 80 Trying 2404:6800:4001:805::1010... telnet: Unable to connect to remote host: Network is unreachable出现Network is unreachable说明对应地址族没有可用路由。文档给出的处理建议是为外部网卡添加临时 dummy 路由以让 IPv6 包得以生成同时务必在 sshuttle 退出后移除这些路由避免污染路由表。2.8 源码级原理mangle 表、TPROXY 目标与透明 socket为了帮助读者真正理解上述「注意事项」背后的机制这里结合 sshuttle/methods/tproxy.py 的setup_firewall()展开 TPROXY 的运行原理1iptables 链结构。TPROXY 方法在mangle 表而非 nat 表的 REDIRECT中建立三条以监听端口命名的自定义链见 sshuttle/methods/tproxy.pysshuttle-m-port挂在OUTPUT链首位负责把需转发的流量打上 fwmark 1MARK --set-mark 1sshuttle-t-port挂在PREROUTING链首位负责对 TCP/UDP 执行TPROXY目标sshuttle-d-port分流链-m socket命中已有本地 socket 的包直接MARK 1并ACCEPT即已有监听 socket 的本地流量放行。具体规则生成逻辑见 sshuttle/methods/tproxy.py为按网段掩码从最具体到最宽泛排序排除网段生成RETURN包含网段对 TCP 生成MARK 1TPROXY --tproxy-mark 0x1/0x1 --on-port port规则UDP 开启时生成等价 UDP 规则DNS 服务器nslist则单独以--dport 53命中并导向--on-port dnsport。2透明代理 socket。setup_tcp_listener()/setup_udp_listener()对监听 socket 设置IP_TRANSPARENT值 19选项见 sshuttle/methods/tproxy.py使 socket 可以绑定/接收并非发往本机 IP 的数据包——这正是「透明代理」的关键。UDP 监听器还会开启IP_RECVORIGDSTADDRIPv4与IPV6_RECVORIGDSTADDRIPv6选项随后通过recvmsg()从 ancillary data 中解出原始目的地址见 sshuttle/methods/tproxy.py从而在 UDP 无连接语义下仍然知道每个包真正要发往何处发送 UDP 回包时则新建一个同样带IP_TRANSPARENT的 socket 绑定源地址后sendto见 sshuttle/methods/tproxy.py。recvmsg不可用时Python 版本过旧且无 socket_ext 库方法会退回recvfrom此时 UDP/DNS 特性自动关闭——这也解释了为什么文档建议使用较新环境以享受完整 UDP 支持。3测试佐证。仓库测试 sshuttle/tests/test_methods_tproxy.py 对上述行为做了全面验证test_get_supported_features_recvmsg断言ipv6、udp、dns三个特性全开而test_get_supported_features_norecvmsg断言无recvmsg时 UDP/DNS 关闭见 sshuttle/tests/test_methods_tproxy.pytest_setup_firewall则逐条断言了 IPv4/IPv6 下 mangle 表链创建、MARK/TPROXY/RETURN 规则的完整 iptables 调用序列见 sshuttle/tests/test_methods_tproxy.py可作为排查防火墙规则是否符合预期的对照清单。2.9 TPROXY 使用要点速查事项要求说明内核配置开机后一次性 root 执行4 条ip route/ip ruleIPv4 IPv6客户端权限rootsudo建议保留SSH_AUTH_SOCKmethod 参数必须--methodtproxyauto默认选 nat不支持 IPv6/UDPIPv6 网段手动追加如::/0--auto-nets不检测 IPv6 路由服务器 IP--exclude IP防止拦截 ssh 隧道自身流量客户端 IP宽带网段时--exclude本机所在网段防止 UDP/DNS 返回包被弹回出站路由必须真实存在无路由则无包可拦必要时加临时 dummy 路由三、Microsoft WindowsVM 桥接网卡替代方案3.1 现状无原生支持官方文档明确说明sshuttle 目前没有在 Microsoft Windows 上直接运行的内置支持。因此 Windows 用户的可行路径是借助虚拟化手段在 Linux 虚拟机中运行 sshuttle再由 Windows 把流量路由进 VM。3.2 创建带桥接网卡的 Linux VM推荐的虚拟化工具是Vagrant也可直接用 VirtualBox。关键配置点有两个创建 Linux 虚拟机在 VM 内运行 sshuttleLinux 是 sshuttle 的原生运行环境具备完整的 iptables/NAT/TPROXY 能力开启桥接网卡bridged NIC这是整个方案成立的前提。只有桥接模式才能让 VM 与宿主机处于同一物理局域网获得同网段独立 IPWindows 才能经由该 IP 将流量转发给 VM若使用默认 NAT 模式VM 与宿主机之间无法以「下一跳网关」的方式互通。3.3 在 VM 内运行 sshuttle在 VM 中执行以下命令启动 sshuttle监听所有接口并转发除排除网段外的全部流量sshuttle -l 0.0.0.0 -x 10.0.0.0/8 -x 192.168.0.0/16 0/0参数逐项说明-l 0.0.0.0监听所有 IPv4 接口而非默认仅本地回环使 VM 作为网关对外提供服务-x 10.0.0.0/8排除 Vagrant 的 NAT 流量。Vagrant 默认 NAT 网络使用 10.0.0.0/8 网段若不排除VM 与 Vagrant 自身管理通道的流量会被 sshuttle 拦截导致 VM 失联或转发异常-x 192.168.0.0/16排除到本地局域网的流量文档假设局域网使用 192.168.0.0 子网。这保证本机与局域网内其他设备打印机、NAS、路由器等的直接通信不被错误转发仅让访问公网/远端内网的流量走隧道0/0转发目标网段为全部 IPv4 地址即「所有未被排除的流量都走 sshuttle 隧道」。3.4 Windows 端添加默认路由假设 VM 在桥接网卡上获得的 IP 为192.168.1.200可在 Vagrant 配置中固定在 Windows 的cmd.exe 中以管理员权限执行route add 0.0.0.0 mask 0.0.0.0 192.168.1.200该命令把 Windows 的默认路由目标 0.0.0.0掩码 0.0.0.0即全部流量指向 VM192.168.1.200Windows 的全部出网流量便经由 VM 进入 sshuttle 隧道再由远端服务器出口。由此实现「Windows 整机透明走 sshuttle」的效果。需要留意的是该方案要求 Windows 与 VM 的桥接网卡处于同一可达网段且 VM 内 sshuttle 监听在0.0.0.0route add添加的是临时路由重启后失效如需持久化可用route add ... -p远端 sshuttle 服务器须能转发相应流量且 Windows 侧无需安装任何 sshuttle 组件。四、总结围绕docs/platform.rst展开的两篇平台专项文档为 sshuttle 的跨平台/双栈使用提供了明确指引Linux TPROXY是唯一完整支持 IPv6 与 UDP 的转发方法但依赖一套严格的前置条件——开机后一次性内核路由配置、客户端 root 权限、显式--methodtproxy、手动追加 IPv6 网段、用--exclude排除 SSH 服务器 IP 与宽网段下的客户端自身 IP以及真实存在的出站路由。其底层由 mangle 表 MARK/TPROXY 规则、IP_TRANSPARENT透明 socket 与recvmsg原始目的地址解析协同实现仓库源码与测试用例均可对照验证Windows无原生支持标准解法是 Linux VMVagrant/VirtualBox开启桥接网卡VM 内以sshuttle -l 0.0.0.0 -x 10.0.0.0/8 -x 192.168.0.0/16 0/0监听全接口并排除 Vagrant NAT 与局域网流量Windows 端以管理员权限route add 0.0.0.0 mask 0.0.0.0 VM-IP将默认路由指向 VM即可实现整机走隧道。相关文件索引文档入口 docs/platform.rst、TPROXY 专项 docs/tproxy.rst、Windows 专项 docs/windows.rst源码实现 sshuttle/methods/tproxy.py、sshuttle/methods/nat.py、sshuttle/methods/init.py、sshuttle/client.py、sshuttle/cmdline.py测试验证 sshuttle/tests/test_methods_tproxy.py。赞分享网络CLI【免费下载链接】sshuttleWrong project! You should head over to http://github.com/sshuttle/sshuttle项目地址https://gitcode.com/gh_mirrors/ssh/sshuttle点击查看免费下载相关推荐Ladybird Windows支持WSL2环境下的跨平台编译方案Ladybird Windows支持WSL2环境下的跨平台编译方案 Ladybird是一款真正独立的跨平台网页浏览器项目在Windows系统上通过WSL2环前端WebAssemblyGauge API参考手册开发者必读的完整指南Gauge API参考手册开发者必读的完整指南 Gauge是一个轻量级的跨平台测试自动化工具它允许开发者使用业务语言编写测试用例。本指南将深入介绍Gauge开发工具终极指南如何在Guzzle中配置IPv6支持构建双栈网络连接策略终极指南如何在Guzzle中配置IPv6支持构建双栈网络连接策略 Guzzle作为一款功能强大的PHP HTTP客户端在现代网络环境中需要同时支持IPv4后端上一篇React Desktop插件生态完全指南如何快速扩展组件库功能下一篇Advanced Tables 与原生表格对比10个优势让你选择升级创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表