我本地云是一个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。
打开Winbox,连接上云端服务器,我们在云端创建SSTP服务器。
点开PPP - Interface - SSTP Server,配置完成后勾选上“Enabled”以启用SSTP服务。
SSTP服务是要账号密码的,我们也需要手动添加。点击OK关闭SSTP Server配置界面,随后如图操作打开新增账号的界面。
配置完成后点选OK完成账号添加操作,一定要记住Local Address (隧道的云端地址) 和 Remote Address (隧道本地端地址),一会方便ping测试。
PPP - Interface,随后点击加号,在菜单中选择SSTP Client
直接选择dial out,填写相关信息后保存。
随后打开控制台,ping一下对端看看通不通。我这里用的100.64.110.1作为云端IP,100.64.110.2作为本地IP
能ping通,可喜可贺。
切换到云端的winbox,开始添加到本地路由的策略。此处假设你本地网段是10.0.16.0/24
按照图中操作:IP-Routes-加号,添加路由。
随后开始添加路由,这样路由器遇到10.0.16.0的网段的连接的时候,就会通过VPN去访问本地路由了。
接下来可以尝试在云端路由上ping一下本地的机器,看能否ping通:
可以ping通,进入下一步。
大致是两条,第一条用于标记从VPN来的连接。
IP-FIREWALL-Mangle,点击加号新增一条规则。这里匹配所有从sstp来的连接。
接下来点击“ACTION”,选择“mark connection”,将sstp来的链接标记为"froml2tp" 因为之前用的l2tp协议,你们可以标记成任何喜欢的名字
点击OK保存,接下来创建第二条。第二条用于手动指定带有“froml2tp”标记,且不从ssdp-out来的的链接(如果处理了,可能会环路)的网关为云服务器。
点击"ACTION",选择"ROUTE",在ROUTE DST填写你VPN云端地址。
这样一来就闭环了,VPN转发来的连接会被打上标记,随后正常被转发到服务端上。而服务端的回应包因为在连接内,故也具有这个标记,于是遵从第二条规则被转发回云端,由云端完成数据发送。
在云端WINBOX打开IP-FIREWALL-NAT,点击右上角添加即可。
Chain选择DSTNAT,随后在In Interface中选择你云服务器的WAN口,Protocol选择TCP/UDP (根据情况选),DST PORT选择来路端口。
点击“ACTION”,ACTION中选择dst-nat,To Address写你本地机器IP,TO Port选择本地端口即可。
打开netstat查看,发现外部地址为远端IP地址,转发正确。
尝试映射到Qbittorrent上并通过技术手段代理tracker使其认为peer地址为云服务器,随后能看到有peer通过云端连入,且IP显示正确。
本文作者:Nature
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!