前言:
随着家中设备越来越多,开的服务也越来越多:群辉、jellyfin、qBittorrent、等等。当我想在外网访问某个服务时,该怎么办?
就目前我所知的,想在外网连回家无非就这几种方案:
- vpn
- 家中开ss/v2ray服务
- frp/nps
- zerotier
前两者都必须有公网ip,后两者不需要。但后两者是借助另外的服务器实现的,通常家庭的上行带宽都是大于服务器的下行带宽的,整体速度受限于服务器带宽,有公网ip时不是个好选择。
我有公网ip,自然就只考虑了前两种方案,在比较了vpn和ss方案后,最终选择了ss这种方案。自然vpn是能满足需求的,但vpn也有他的问题:
- vpn工作模式是将我们所有的请求都拦截并转发,这意味着即使你访问baidu这样的网站,数据包也会回家绕一圈才到你的设备上,请求时间会增加,这是不合理的。
- 如果你是在像公司这种地方使用,公司内网也会有其他的局域网服务需要访问,基于【问题1】,可以知道这些服务也是会访问不通的。
- 虽然有像openvpn这样’‘智能’‘分流的方案,但维护这样一个list,工作量也不小。
- 无法同时使用翻墙代理和vpn。既想回家又想翻墙的时候就只能让翻墙流量也回家,不理想的方案。
那使用ss服务器这种方案,对于我现在的使用习惯改变最小,只需要新增一台服务器,加一条分流规则即可。原先的软件可以继续用,也可继续使用大佬们已有的规则,工作量上最小,nice~
那要怎么做?
- 在家中建立一个ss服务器,设置路由器的端口映射,让服务暴露在公网上。
- 设置ddns,定时更新ip。
- 在手机或者电脑中增加一台ss服务器,设置好分流规则,让访问家庭局域网的请求走这台服务器。
开始前的准备工作:
- 公网ip!公网ip! 公网ip!虽然也可以用vps+frp/nps,但是会受到vps带宽限制,效果很差。
- 一个域名用来ddns,如果不想申请域名,也可以使用duckdns,有docker版的方便使用。
- 建议将家中的网段设置为不常用的网段,避免网段冲突,比如192.168.117.x。如果你在公司也有内网服务,比如192.168.2.110,这样分开两个网段就不会相互影响了。
服务器端:
这里以openwrt为例,找到vpn->v2ray服务器,在这里新建一个ss服务器,加密方式可以不用高级加密,国内流量是不过墙的,用不着高级加密。
2023-6-26 更新:请选择类似”aes-256-gcm”这种高级加密,否则高版本的clash内核可能不支持
新建完成,点击“保存并应用”,返回到主页后,确保如下两个是勾选的,再最下边的点击“保存并应用”
设置ddns和端口映射
略。。 自行搜索相关教程
设备端:
在保证你的服务已经在公网可以访问之后(使用tcping工具测试端口是否打开),就可以在设备端进行设置了。本人只有iphone和pc,就介绍ios和windows设置。
IOS设备:
我主用quan,这里只以quan来示例。为什么使用quan而不用其他软件,是因为quan有个很棒的功能,可以根据环境自动选择代理方式。比如当我们在外边时,是需要使用代理连回家中的,但当我回到家时,这时候就应该直连,而不是从外网绕一圈再回来,quan的策略功能就可以做到这一点。
-
在quan中新建一个ss服务器,名称为BackHome,配置按你自己的填。
-
设置中找到“策略”,点右上角+号新增一条策略,名称为“ConenectHomeEnv”。分别选择WI-FI跟蜂窝网为刚刚新加的BackHome节点。重点来了:点击“添加SSID行为”,输入你家WIFI的名字,策略选择为DIRECT。最终设置完成如下图,点击保存。
-
进入“设置-分流”,增加一条规则如下图所有,点击保存。图中的ip地址要根据你自己家的网段来设置,如果说你家网段是192.168.100.x,那就要相应的改为”192.168.100.0/24”。
-
完成以上设置后,打开quan的开关,在浏览器中输入家中服务器ip,此时应该是可以打开了。其他的软件也可以通过内网ip访问家中的服务,比如群辉或者jellyfin等等。
windows设备:
windows端我使用的是clash for windows(以下用cfw代称),如果你还不了解clash是什么,那建议先了解一下这款非常强大的代理分流软件。使用clash可以实现很多你想不到的骚操作,强烈推荐👍。
默认情况下局域网的流量是不会走cfw的,要想让这部分流量也代理的话就必须安装tap device,我的理解是这就相当于上边提到的vpn。除此之外还会使用到”mixin”,它可以在不修改profile的情况下动态修改配置信息,如果你是使用机场的订阅地址,使用这个功能就很方便。
- 在cfw中点击“tap device”,出现弹框点击确定,如果出现软件安装,则一直点击next。
-
安装完成后,在网络中会出现一个“cfw-tap的设备”。
-
回到cfw,找到settings-profile mixin,将type改为javascript,点击editor,将编辑框中的代码改为以下内容,点“save”保存。
module.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => { const proxy = { name: "backHome", type: "ss", server: "example.cc", //修改为你的ddns域名 port: 2048, //ss映射端口 password: "password", //密码 cipher: "aes-128-cfb" } const proxyGroup = { name: 'BackHome', type: 'select', proxies: ['backHome'] } const rule = 'IP-CIDR,192.168.123.0/24,BackHome' // 192.168.123.0/24改为你家的网段 return {...content,proxies:[...content.proxies,proxy], 'proxy-groups':[...content['proxy-groups'], proxyGroup]} }
-
同时打开mixin和system proxy开关,让配置项生效。
- 完成上面的设置就已经可以像在家一样随意访问家里设备了,甚至你还可将家中的nas映射为网络硬盘。
- 想要学习其他的骚操作,请查看官方的文档Clash for Windows
总结:
其实使用ss或者v2ray连回家的教程在网上有很多,但几乎都是告诉你用全局模式,这并不是我理想中的解决方案。对于“回家”这件事,只让这部分的局域网流量请求走回家这条线路即可,国内或者国外的请求应该正常的走本地网络,特别是如果你像我一样,本地网络有其他局域网服务访问,那就更不能使用类似全局代理这种方式了。这个世代的代理软件都有很核心的功能:规则分流,然而却很少有教程提及这部分。不仅如此教程内容还非常雷同,不禁让人感慨中文的高质量文真的太少。
多说一点:
很多人不理解为什么要连回家,如果你在家中没有群辉,jellyfin这样的服务,自然是没有这种需求的。如果有的话,使用这种方案的好处有很多:
- 可以对外只暴露一个端口,后期增加服务不用再映射端口。而且还是加密的,不用担心暴露破解问题。
- 部分isp是会封锁http服务的,不论你起在哪个端口,比如我的jellyfin好好运行了几天之后就莫名其妙被封了。而这种方式并不对外暴露http服务,isp通常不识别ss流量,那自然也不会封端口了。
- 对于黑群用户而言,qc服务是无法使用的。这意味无法方便在家庭以外的环境之前同步照片,访问家里的nas设备。如果通过端口映射的方式,要研究需要暴露那些端口才能完整的访问服务(我就没弄懂)。使用ss服务器则没有这种问题,在外边跟家中一样,使用局域网ip即可正常使用群晖的服务,还更安全了。
- 可以用同一份配置(ip)访问服务,无需切换。