[技术杂谈]低成本搭建iOS原生VPN,告别小火箭
贫穷再一次激起了人的创造力 上一次:[技术杂谈]低成本windows远程控制直连方案(无需VPN组网) 前言 这次事情的起因是最近换了新的传输协议xhttp,三台电脑上平时在用的xray和v2ray内核都成功跑通了,本以为可以在我的16e上愉快的使用时,却发现自己的小火箭内核版本过低,传输协议选项中没有xhttp 那么看到这解决办法肯定就是要去更新,但由于我的apple id目前在国区,要更新就得换到当时买火箭的美区。但又因为我在国区有apple music,此时如果换区就会导致我的资料库被删掉,就此触发音乐圈经典老番🤣👉 我可不想自己整理了大半年的音乐库凭空消失,所以换区这条路肯定是不行了。此时肯定有聪明的观众会说可以换一个在美区并且有火箭的apple id,但这又会导致我apple钱包里的卡被全部解绑,换回我自己的国区id时得一张一张重新绑。更重要的是,必须是”有火箭“的美区id,相当于我又得重新花二十多块钱买个火箭,或者还得找人去借一个 所以,求人不如求己,一个黑客最基本的素养就是要想办法花最少的钱办最大的事,就有了这篇博客 (另外顺便解释一下为什么需要小火箭这类网卡层代理,而不使用无线网络连接时设置里的http/socks5代理?原因其实很简单,一是DNS泄漏的问题(可以看[技术杂谈]一篇聊完DNS投毒、泄露),二是iphone上绝大多数应用会无视这个设置导致仍然无法使用) 需要准备 一台闲置linux服务器。用来跑xray/v2ray/singbox/clash等各种代理内核,我用的是家里的一台闲置电脑。如果你没有,也可以随便拿台vps,不过最好不要是国内厂商的,原因你懂的 (选用)一个公网ipv4地址。最好的办法就是随便找台带公网v4地址的vps,我自己正好手头有台闲置的阿里云。这台vps就可以是国内厂商,并且最好是在国内,因为是出门在外做转发会用到,下文会介绍原因以及为什么不能是ipv6。 当然,如果你只是想在自己家里科学上网,并且你的iOS设备可以和你的闲置电脑在一个网段下,那完全可以不需要这个公网v4地址。 设计思路 因为iOS本身支持的vpn协议类型有限,所以必须要搭建一个符合其所支持协议的vpn服务,并将它的流量统一转发给代理内核本身提供的的socks5,因此就可以通过连接路径粗略总结出搭建路径 iphone -> vpn服务(用docker搭建并创建专属网段) [ ->编写流量规则,在防火墙上把vpn服务接到的流量做标记 -> linux内核将做过标记的流量根据路由表发给特定网卡 -> 网卡转交给socks5 ] ->xray/v2ray/singbox提供的socks5代理 开始 先来介绍一下iOS自带的VPN功能。就拿我目前正在使用的iOS 18举例,一般来说,如果你此前从未使用过类似小火箭这样的软件,那么自带VPN入口大概率会在"设置"->“通用”->“VPN与设备管理"底下 如果你用过,那么在网络连接相关设置附近应该也能看到 在添加VPN配置中查看可添加的VPN类型,可以发现只支持这三种 其实第一种和第三种他们本质上都是第二种IPsec的"套壳”,从传输特征和加解密复杂度上看没有太大区别,只不过在验证逻辑和配置上略有不同。我们待会儿会用到第三种"L2TP" 来到我准备好的闲置linux服务器上,先配置好自己的代理内核,可以是你的clash,又或者v2ray等等,这里我就不做介绍了,直接拿准备好的代理测试一下 成功代理到了我的美中节点,那么此时我们的目标其实很清晰,就是想办法让我的iphone通过自带vpn所支持的协议与我的服务器建立链接,并将我iphone上的请求全部转交到服务器的socks5代理上 也就是我们需要搭建一个vpn服务端供我的iphone连接 实现在家可用 因为我不想脏了自己的环境,毕竟我的服务器还要跑别的东西,同时为了方便后续做流量规则,所以我选择用把vpn服务架在docker。先给我的vpn服务创建一个专属网段 docker network create --subnet=172.20.0.0/16 vpn_net 接着直接用别人包好的hwdsl2/ipsec-vpn-server镜像即可一键部署。如果对vpn有研究的观众并且用过这个镜像可能会有问为什么不设置固定的dns,以防dns泄露?其实如果不设置就可以将dns请求也一并交给代理节点,也就没有dns泄漏的问题 docker run -d --name ikev2-vpn \ --restart=always \ --privileged \ --net vpn_net \ --ip 172.20.0.2 \ --name vpn\ -p 500:500/udp \ -p 4500:4500/udp \ -e "VPN_IPSEC_PSK=预共享密钥(随便填)" \ -e "VPN_USER=用户名" \ -e "VPN_PASSWORD=密码" \ hwdsl2/ipsec-vpn-server 如果成功,你应该能在日志里看到类似这样的输出 ...