青蛙小白
目录

Tunnel

EasyTier

EasyTier由Rust和Tokio驱动一个简单、安全、去中心化的异地组网方案。

https://github.com/EasyTier/EasyTier

frp

frp 是一个快速的反向代理工具,允许你将位于 NAT 或防火墙之后的本地服务器暴露到互联网上。它目前支持 TCP 和 UDP 协议,以及 HTTP 和 HTTPS 协议,使得可以通过域名将请求转发到内网服务。

https://github.com/fatedier/frp

gost

GO Simple Tunnel - GO语言实现的安全隧道

gost v2 https://github.com/ginuerzh/gost gost v3 https://github.com/go-gost/gost

本地端口转发(TCP)

本地端口转发(TCP):

gost -L=tcp://:2222/192.168.1.1:22 [-F=...]

将本地TCP端口2222上的数据(通过代理链)转发到192.168.1.1:22上。当代理链末端(最后一个-F参数)为SSH转发通道类型时,gost会直接使用SSH的本地端口转发功能:

gost -L=tcp://:2222/192.168.1.1:22 -F forward+ssh://:2222

例如,将本地的443端口转发到192.168.101.115001端口:

gost -L=tcp://:443/192.168.101.11:5001 > gost.log 2>&1 &

透明代理(gost red:// + iptables)

下面这组配置是 REDIRECT 模式 的透明代理:把本机或经过本机的 TCP 80/443 流量重定向给 gost,再由 gost 转到上游 SOCKS5 代理。

参考: https://gost.run/en/tutorials/redirect/

gost -L "red://:<REDIRECT_PORT>?sniffing=true&so_mark=100" -F socks5://<PROXY_HOST:PROXY_PORT>

说明:

  • red://:<REDIRECT_PORT>:在本地 <REDIRECT_PORT> 端口启动透明代理入口。
  • -F socks5://<PROXY_HOST:PROXY_PORT>:把接到的连接转发到上游 SOCKS5 代理。
  • sniffing=true:通过 HTTP Host / TLS SNI 探测目标地址,用于透明转发场景。
  • so_mark=100:可选但推荐。给 gost 出站连接打 fwmark=100,配合 iptables 规则避免回环。

iptables 规则:

iptables -t nat -N GOST
# 忽略局域网流量,请根据实际网络环境调整
iptables -t nat -A GOST -d 192.168.0.0/16 -j RETURN
# 忽略已打标(mark=100)的出站流量,避免被再次重定向形成回环
iptables -t nat -A GOST -p tcp -m mark --mark 100 -j RETURN
# 仅将目标端口为 80/443 的 TCP 流量(通常为 HTTP/HTTPS)重定向到 <REDIRECT_PORT>
iptables -t nat -A GOST -p tcp --dport 80 -j REDIRECT --to-ports "$REDIRECT_PORT"
iptables -t nat -A GOST -p tcp --dport 443 -j REDIRECT --to-ports "$REDIRECT_PORT"
# 拦截进入本机且后续需要路由决策的 TCP 流量(典型为本机作为网关/旁路由时的转发流量),统一交给 GOST 链处理
iptables -t nat -A PREROUTING -p tcp -j GOST
# 拦截本机进程发起的 TCP 出站流量,统一交给 GOST 链处理
iptables -t nat -A OUTPUT -p tcp -j GOST

iptables 规则(幂等):

如果想重复执行而不产生重复规则,可以在原有写法上做最小改动:

#!/bin/bash
REDIRECT_PORT="<REDIRECT_PORT>"

# 先删除主链到 GOST 的跳转(删到不存在为止)
while iptables -t nat -C PREROUTING -p tcp -j GOST 2>/dev/null; do
  iptables -t nat -D PREROUTING -p tcp -j GOST
done
while iptables -t nat -C OUTPUT -p tcp -j GOST 2>/dev/null; do
  iptables -t nat -D OUTPUT -p tcp -j GOST
done

# 删除并重建 GOST 链
iptables -t nat -F GOST 2>/dev/null || true
iptables -t nat -X GOST 2>/dev/null || true
iptables -t nat -N GOST

# 忽略局域网流量,请根据实际网络环境调整
iptables -t nat -A GOST -d 192.168.0.0/16 -j RETURN
# 忽略已打标(mark=100)的出站流量,避免被再次重定向形成回环
iptables -t nat -A GOST -p tcp -m mark --mark 100 -j RETURN
# 仅将目标端口为 80/443 的 TCP 流量(通常为 HTTP/HTTPS)重定向到 <REDIRECT_PORT>
iptables -t nat -A GOST -p tcp --dport 80 -j REDIRECT --to-ports "$REDIRECT_PORT"
iptables -t nat -A GOST -p tcp --dport 443 -j REDIRECT --to-ports "$REDIRECT_PORT"

# 重新挂回主链
iptables -t nat -A PREROUTING -p tcp -j GOST
iptables -t nat -A OUTPUT -p tcp -j GOST

如果这台机器不是网关/旁路由,通常可以去掉 PREROUTING 这一条。

规则逻辑:

  1. 新建 nat/GOST 链,集中管理重定向规则。
  2. 目标地址是局域网网段(192.168.0.0/16)时直接放行,不走代理。
  3. 已带 mark 100 的 TCP 流量直接放行,避免 gost 出站连接再次被重定向造成死循环。
  4. 仅把 TCP 80/443 重定向到本地 <REDIRECT_PORT>,由 gost 接管。
  5. PREROUTING 处理“经过本机”的流量(本机作为网关时)。
  6. OUTPUT 处理“本机发起”的流量。
  7. REDIRECT 模式仅处理 TCP;若需要透明代理 UDP,应使用 TPROXY 模式。

Windows Server PortProxy

https://learn.microsoft.com/en-us/windows-server/networking/technologies/netsh/netsh-interface-portproxy

portproxy是Windows中的一项 端口代理(Port Proxy)技术,依赖于 netsh 工具的 portproxy 功能。它用于在本地机器上监听特定的端口,并将流量转发到目标地址和端口。

注意 此功能属于 Windows TCP/IP 堆栈的一部分,可以视为轻量级的代理实现或端口转发解决方案。

主要功能:

  • 允许将本地的网络流量通过一个指定端口转发到另一台计算机上的端口。
  • 可以在同一网络接口之间(例如 IPv4 到 IPv4 或 IPv6 到 IPv6)转发,也可以跨协议(例如 IPv4 到 IPv6)进行转发。

netsh interface portproxy通过在Windows操作系统内核中设置一个代理规则,监听本地的指定端口。一旦有数据流入指定端口,系统会根据规则将数据包转发到目标地址和端口。

常见用途:

  • 远程服务访问:当目标机器和服务处于 NAT 或防火墙后,使用端口转发可以简化访问。
  • 测试和调试:开发人员常用于模拟不同网络场景,或将特定服务的流量重定向到本地。
  • 代理服务:本地端口代理可以被用作简易的代理服务,提供间接的访问。

对于作为代理服务的常用场景是:

  1. 只在某台Windows上安装了VPN软件,只有从这台Windows才能ssh到VPN连接内网中的一台windows服务器,通过在这台Windows上设置端口代理,可以将这台Windows的某个端口转发到内网的Linux服务器的ssh端口。这样就可以从Windows服务器所在网络的其他机器(Linux, MacOS)等间接ssh到内网的Linux服务器。
  2. 只在某台Windows上安装了VPN软件,连上VPN后,只能在这台Windows上的用浏览器访问某https协议的堡垒机系统。通过在这台Windows上设置端口代理,可以将这台Windows的某个端口转发堡垒机系统的https端口。这样就可以从Windows服务器所在网络的其他机器(Linux, MacOS)等间接访问堡垒机系统。

上面两个场景,可借助这台Windows上的portproxy,通过只在这台windows上安装VPN,以这台windows作为跳板机访问特定的网络。避免了在客户端机器(MacOS, Linux)安装VPN软件,尤其是一些软件只提供了Windows版本的情况。

注意 端口代理涉及系统级网络配置,必须在管理员权限下执行命令。需要确保本地的防火墙允许监听的端口通信。

例子:将Windows上的本地端口 20022转发到10.10.100.1722 端口,可以使用以下命令创建规则:

netsh interface portproxy add v4tov4 listenport=20022 listenaddress=0.0.0.0 connectport=22 connectaddress=10.10.100.17

上面的命令将监听本地机器上的 20022 端口,并将所有传入的连接转发到 10.10.100.1722 端口。在此之后,可以通过连接到 Windows 机器的 20022 端口来访问 10.10.100.1722 端口。

查看本地端口是否已经监听:

netstat -ano | findstr LISTENING | findstr 20022
  TCP    0.0.0.0:20022          0.0.0.0:0              LISTENING       3104

如果需要查看已配置的端口转发规则,可以使用以下命令:

netsh interface portproxy show all

侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
0.0.0.0         20022       10.10.100.17   22

删除规则:

netsh interface portproxy delete v4tov4 listenport=20022 listenaddress=0.0.0.0

清除所有端口转发规则:

netsh interface portproxy reset

docker-easyconnect

docker-easyconnect 是一个将深信服(Sangfor)开发的非自由 VPN 软件 EasyConnect 和 aTrust 运行在 Docker 中的项目。它可以作为网关使用,或提供 socks5、http 代理服务供宿主机连接使用。

主要用途:

  • 解决 EasyConnect/aTrust 官方客户端在 Linux 上的兼容性问题
  • 避免 VPN 软件对宿主机系统的侵入性修改
  • 将 VPN 连接隔离在容器中,通过代理端口(socks5:1080、http:8888)访问内网资源
  • 支持纯命令行版(CLI)和带 VNC 图形界面版两种模式
评论