编辑
2025-02-18
折腾
00
请注意,本文编写于 41 天前,最后修改于 41 天前,其中某些信息可能已经过时。

目录

前言
硬件环境
基本原理
实际操作
1. 创建SSTP 服务端
2. 本地端连接SSTP
3. 添加云端路由策略
4. 添加本地路由策略。
5. 添加转发规则
最终效果

前言

我本地云是一个5700G+32G的NAS,这个配置足以应对大部分游戏服务端。实际上因为性能过剩,我还会用这个NAS开虚拟机,租给其他有需要的朋友用。

在这里遇到的问题是:本地云(公司云、家里云)的问题在于在现如今无法或者不可能申请到独立IP,可访问性几乎为零使得使用无法脱离端口转发(L4/L7)或者虚拟组网方案。

如果是端口转发,作为服务端就很难获取到客户端的真实IP,在服务端视角看来客户端IP是转发服务器。虽然有HTTP的XFF头或者proxyprotocol + mmproxy的方案,但其局限性很大(例如proxyprotocol支持的游戏服务端少,UDP的proxyprotocol支持也不多等)。

如果是虚拟组网方案,则增大折腾成本和最终用户的使用难度。

这里研究了一段时间后,得到了一个能够将云服务器IP分配到本地的方法,且用该方法本地服务端能够看到正确的客户端IP。

硬件环境

本地路由器:RouterOS系统软路由一台,理论上Routeros可以更换为任意支持针对connection打标记,且能根据标记走指定路由的操作系统/路由器。

云端:Routeros VPS一台。理论上只要能装SSTP+iptables NAT转发也能完成,不过出于易用性考虑还是用RouterOS了。

基本原理

将两个RouterOS用 SSTP / L2TP / OPENVPN / WIREGUARD(Routeros7+) 组网。

在云端设置到本地路由的路由表(网关自然是VPN本地端IP),让两端能互相ping通。

接下来在本地路由中设置防火墙规则,将从VPN接口来的连接统统打上mark。另外带mark的连接也要重定向网关到VPN云端IP。

这样一来,只需要在云端设置DSTNAT即可将流量通过VPN转发到本地RouterOS,在这一过程中由于防火墙规则的存在,故本地返回的封包也会经由云端发回去,实现闭环。

虽然你在本地用wireguard这类的协议代理0.0.0.0/0也能实现类似的效果,但这样所有本地流量都会上一遍云,非常麻烦。

实际操作

由于网络环境原因,这里选择创建SSTP服务而非L2TP、WIREGUARD。 SSTP相对于另外两个的优势在于通过TCP传输数据。L2TP和WIREGUARD都是走UDP的,可能会导致QOS。

1. 创建SSTP 服务端

打开Winbox,连接上云端服务器,我们在云端创建SSTP服务器。

image.png

点开PPP - Interface - SSTP Server,配置完成后勾选上“Enabled”以启用SSTP服务。

image.png

SSTP服务是要账号密码的,我们也需要手动添加。点击OK关闭SSTP Server配置界面,随后如图操作打开新增账号的界面。

配置完成后点选OK完成账号添加操作,一定要记住Local Address (隧道的云端地址) 和 Remote Address (隧道本地端地址),一会方便ping测试。

image.png

2. 本地端连接SSTP

PPP - Interface,随后点击加号,在菜单中选择SSTP Client

image.png

直接选择dial out,填写相关信息后保存。

image.png

随后打开控制台,ping一下对端看看通不通。我这里用的100.64.110.1作为云端IP,100.64.110.2作为本地IP

能ping通,可喜可贺。

3. 添加云端路由策略

切换到云端的winbox,开始添加到本地路由的策略。此处假设你本地网段是10.0.16.0/24

按照图中操作:IP-Routes-加号,添加路由。

image.png

image.png

随后开始添加路由,这样路由器遇到10.0.16.0的网段的连接的时候,就会通过VPN去访问本地路由了。

image.png

接下来可以尝试在云端路由上ping一下本地的机器,看能否ping通:

image.png

可以ping通,进入下一步。

4. 添加本地路由策略。

大致是两条,第一条用于标记从VPN来的连接。

IP-FIREWALL-Mangle,点击加号新增一条规则。这里匹配所有从sstp来的连接。

image.png

接下来点击“ACTION”,选择“mark connection”,将sstp来的链接标记为"froml2tp" 因为之前用的l2tp协议,你们可以标记成任何喜欢的名字

image.png

点击OK保存,接下来创建第二条。第二条用于手动指定带有“froml2tp”标记,且不从ssdp-out来的的链接(如果处理了,可能会环路)的网关为云服务器。

image.png

点击"ACTION",选择"ROUTE",在ROUTE DST填写你VPN云端地址。

image.png

这样一来就闭环了,VPN转发来的连接会被打上标记,随后正常被转发到服务端上。而服务端的回应包因为在连接内,故也具有这个标记,于是遵从第二条规则被转发回云端,由云端完成数据发送。

5. 添加转发规则

在云端WINBOX打开IP-FIREWALL-NAT,点击右上角添加即可。

Chain选择DSTNAT,随后在In Interface中选择你云服务器的WAN口,Protocol选择TCP/UDP (根据情况选),DST PORT选择来路端口。

image.png

点击“ACTION”,ACTION中选择dst-nat,To Address写你本地机器IP,TO Port选择本地端口即可。

image.png

最终效果

image.png

打开netstat查看,发现外部地址为远端IP地址,转发正确。

尝试映射到Qbittorrent上并通过技术手段代理tracker使其认为peer地址为云服务器,随后能看到有peer通过云端连入,且IP显示正确。

本文作者:Nature

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!