2022年更新:

已经采用更灵活性能更强的三层隧道了。

前言

虽然IPv6正在逐渐普及,可能会有助于用户获得公网IP,但是运营某学校校园网的电信并未打算为该校师生提供IPv6,公网IP更加无从说起,所以目前来说,FRP仍然是生活中非常常用且不可取代的。然而一些FRP服务商的免费服务中提供的隧道十分少,稳定的花生壳只提供了两条隧道,而SakuraFrp虽然提供了5条但是没有前者那么稳定,虽然2-5条隧道也不是不能用,但是对于RDP,SSH,web等一众服务来说是不够的,那么有没有办法仅用一条隧道就访问内网的多个服务呢?

答案是肯定的:我们可以在隧道搭建SOCKS5来实现。

SOCKS5是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,说白了就是当通过FRP连接到SOCKS5服务端后,客户端就相当于直接进入服务端所在的内网了。

部署服务端

环境

系统:Ubuntu Server 20.04.2 LTS

安装Shadowsocks服务端

在Ubuntu下可以通过Nodejs快速部署Shadowsocks服务端,首先安装Nodejs和npm:

sudo apt update
sudo apt install nodejs npm

安装pm2:

npm -g i pm2

安装shadowsocks:

npm -g i shadowsocks

此时应该会提示安装路径,如/usr/local/lib/node_modules/shadowsocks/config.json

用Vim打开这个配置文件,如果这个文件是空的就写入如下信息:

{
"server":"0.0.0.0",
"server_port":8083,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"myPassword",
"timeout":600,
"method":"aes-256-cfb"
}

易知访问端口为8083,密码为myPassword,算法为aes-256-cfb此时应该设置一个能抵御社工的强密码,否则黑客将能轻易地通过简单密码进入内网!

部署完成后,可以启动服务:

pm2 start /usr/local/lib/node_modules/shadowsocks/bin/ssserver

但是这样部署并不能开机自启,我们可以通过systemd来实现:

首先新建一个服务并编辑:

sudo vim /etc/systemd/system/ss.service

输入以下内容

[Unit]
Description=Shadowsocks Client Service
After=network.target

[Service]
User=Username
Type=forking
ExecStart=pm2 start /usr/local/lib/node_modules/shadowsocks/bin/ssserver

[Install]
WantedBy=multi-user.target

其中Username为用户名

保存之后启用服务并启动:

sudo systemctl enable ss.service
sudo systemctl start ss.service

重启并测试

pm2 ls

如果出现shadowsocks的服务则部署成功

部署FRP服务

部署的客户端及教程在各大服务商都有提供,安装好FRP服务后将本地端口指向上文配置文件中所配置的访问端口即可。值得一提的是,因为某些原因花生壳的SOCKS5隧道仅对付费用户开放,而我们使用内网穿透的场景多为TCP协议为主,所以我们可以新建一条TCP或UDP隧道(取决于实际需求)来指向shadowsocks的端口,SakuraFrp也类似,新建TCP/UDP隧道即可。

oray

客户端

客户端环境

操作系统:iOS/iPad OS 14.5,macOS Big Sur 11.2.1

客户端部署

iOS在非国区商店都能下载Shadowrocket,支持直接在armMac上运行,Windows和安卓可以在各大使用ss协议的机场下载客户端,在客户端中填入FRP的公网地址和端口,密码和算法按照配置文件来填写,启动代理即连接内网。后续可以使用PAC进行进一步操作,这里不再阐述。

设置HOSTS

在上述步骤完成后,虽然理论上已经进入内网,但是仍然无法通过原局域网IP连接对应主机,这时候我们需要在服务端设置hosts:在hosts中输入内网IP 自定义域名(最好选择有代表性且不与广域网的域名重复)
如:

192.168.1.1 a.com

这时候我们在外网使用ss连接,通过a.com即可访问内网中192.168.1.1的主机。通过ping可以发现在SOCKS5的隧道中,各个内网主机的IP被分配了E类IP地址:240.0.0.0-255.255.255.254,而每次连接时各个主机的IP都不一样,目前也没有搞懂这个IP的分配机制,所以就先用hosts来指定IP。

![ping](https://cdn.starryloki.com/2023/11/f811c083ccd0a8eb3822681a630396c4.jpg)
在隧道中ping内网主机绑定的域名

EOF