文章目录
[隐藏]
4. 转发 DNS 查询请求
5.stcp 类型的代理
去年的时候, 我曾经写过一篇关于内网穿透的文章.
内网穿透(Frp)- 拯救没有公网 IP 的你: https://post.smzdm.com/p/566063/
一年过去了, 不断的有人咨询我关于使用的问题, 而且我发现用这个的人也是越来越多, 能问运营商要到公网 IP 的几率越来越小. 我用的移动宽带, 客服都直接回复, 我们不提供公网 IP. 另外作者对 frp 也更新了很多, 所以今天想再更新一下关于 FRP, 来张大妈骗点金币吧.
特别是在路由器, NAS 没有公网 IP 是一件很不方便的事情, 尤其是在国内的网络环境. 为了解决这个问题, 则需要内网穿透, 而内网穿透的方法有很多种, 例如使用花生壳, NGROK https://www.centos.bz/tag/ngrok/ 等, 但是我感觉 frp 是相对更为稳定.
frp 是什么
frp 是一个高性能的反向代理应用, 可以帮助您轻松地进行内网穿透, 对外网提供服务, 支持 tcp, http, https 等协议类型, 并且 web 服务支持根据域名进行路由转发.
说白了, 就是利用一台有公网 IP 的机子, 实现访问你家没有公网 IP 的设备.
在我使用过的穿透软件中, 感觉 frp 在稳定性, 功能和维护方面做得比较好, 我也稳定使用了快 2 年了.
准备工具
从上面的内网穿透的原理可以看出, 我么至少需要一台有公网 IP 的主机, 目前来看 VPS 是最好的选择, 以及一个域名.
关于 VPS 用法, 域名购买以及有关工具在我过去的文章中已经详细的说明了. 如果对 VPS 有不明白的地方可以看一下教程 由于我今天只想说说 FRP, 所以就不赘述了.
域名一定要做泛解析, 有时容易忽视这里. 不论是二级域名还是三级域名, 都可以做泛解析. 比如我 f.anys.ga 做域名泛解析, 填入. f 就可以吧. f.anys.ga 进行解析.
FRP 服务端搭建
利用 docker
我选择了 Docker https://www.centos.bz/tag/docker/ 方式, 好处在于十分方便, 容易部署, 沙盒机制可以不破坏系统环境. 最近 docker 用的多了感觉十分非常顺手, 如果你不喜欢 docker 可以自行研究.
搭建服务端
我的 OS 是 Ubuntu14.04 x64. 首先安装 Docker, 这里不推荐 https://www.centos.bz/tag/apt-get/ 或者 yum 的形式安装, 建议直接从官网下载 docker. 如果你不关心 Docker 是什么, 那么你也不用深究, 如果你有兴趣研究一下, 可以自行 https://www.centos.bz/tag/google/ .
- # 安装 Docker
- wget -qO- https://get.docker.com/ | sh
- # 在宿主机建立目录
- mkdir /var/frp && mkdir /var/frp/conf &&cd /var/frp/conf
- # 获取服务器端配置文件
- wget https://frp.anys.ga/frps.ini
- # 建立镜像
- sudo docker run --name frps -d -v /var/frp/conf:/var/frp/conf -p 5000-5100:5000-5100 -p 7000:7000 -p 7500:7500 -p 7001:7001 -p 8089:80 -p 8443:443 ruiny/frps
这样服务器就搭建好了. 按照以上配置完成的话, 服务端口 7000, 状态查询 (Web) 端口 7500,http 服务端口 8089,https 端口为 8443, 同时开放 5000-5100 端口用于其他 TCP/UDP 连接.
之所以用 8089/8443 端口是因为本机上的 80/443 端口用给 Nginx https://www.centos.bz/category/web-server/nginx/ 了, 如果你们确保端口没冲突的话可以用 80/443 端口.(有些强迫症患者只用 80 端口)
之后登陆你 VPS 地址 IP 地址: 7500 可以查询具体状态, 用户名 / 密码为 admin/Qwert123.
配置文档修改
好了, 如果实在懒得动配置, 上面的可以正常使用, 但一般总要改一下密码什么的吧. 我在制作镜像的时候, 把配置文件放在了 / var/frp/conf 下, 在上面过去服务器配置的时候, 我直接用了作者的官方配置, 很多配置是不合适的, 如果需要更改:
nano /var/frp/conf/frps.INI
至少你应该修改以下几项内容:(ctrl+x 保存, 或者习惯用 vi 编辑器的)
- # 设置用户名和密码, 注意是状态面板的用户名和密码.
- dashboard_user = admin
- dashboard_pwd = admin
- # 令牌, 很重要, 用于验证与客户端的通信.
- token = 12345678
- # 自定义二级域名, 如果设置了, 之后在客户端的 http,https 类型的代理中可以不配置 custom_domains, 而是配置一个 subdomain 参数. 可以不配置, 默认没有配置.
- subdomain_host = frps.com
我只开放了 5000-5100 用于 TCP/UDP 端口, 如果需要更多端口请修改以下内容. 但同时 docker run 中也要修改 - p 5000-5100:5000-5100 的端口范围. 我测试, 如果一次性开放端口过多, 会导致 docker 卡死, 所以不建议开太多哦.
- # only allow frpc to bind ports you list, if you set nothing, there won't be any limit
- allow_ports = 5000-5100
FRP 客户端配置
不论是梅林, 老毛子或者是群晖, 在 frp 客户端中的设置都大同小异, 但是我一般喜欢用配置文档的方式, 简单说说配置文档. 完整的客户端配置模板可以在查看
配置文档
配置文档分为两部分, 第一部分是 common 开头的通用配置, 第二部分就是每个穿透服务项目
下面将几个例子:
1. 主路由 Web 界面
- [router] #主路由 Web 界面
- type = http #穿透类别为 http
- local_ip = 192.168.1.1 #内网地址
- local_port = 80 #穿透服务内网端口
- remote_port = 8089
- custom_domains = router.f.anys.ga #外网域名
- use_encryption = true #开启加密
- use_compression = true #开启压缩
在梅林的界面中对应内容如下:
2.GEN8 中 Windows 的远程桌面
- [Gen8-Winser]
- type = tcp #类别为 tcp
local_ip = 192.168.1.5 内网 Gen8 的 ip 地址
- local_port = 3389 #注意穿透端口是远程桌面的端口 3389
- remote_port = 5000 #外网端口随便填一个吧
- use_encryption = true
- use_compression = true
由于是 tcp 所以这里不需要外网域名了, 这个就类似于端口转发.
3.DSM 黑群晖
- [dsm]
- type = https #黑群晖 DSM 的 Web 用 https, 所以类别是 https
- local_ip = 192.168.1.7 #黑群晖的地址
- local_port = 5001 #群晖的 https 端口是 5001
- remote_port = 8443 #外网 https 端口对应是 8443
- custom_domains = dsm.f.anys.ga
- use_encryption = true
- use_compression = true
我黑群晖的内网地址是 192.168.1.7,https 端口是 8443, 对应访问域名就是 dsm.f.anys.ga:8443. 对于 https 的穿透, 需要导入相应证书, 否则不会有小绿锁哒~
群晖和梅林都有导入的地方, 比如群晖在这里:
frp 的作者还搞了一些高级用法, 特殊情况可以尝试用一下:
4. 转发 DNS 查询请求
可以通过 frp 转发自己的 DSN 请求, 在客户端配置文件中设置. 将 DNS 请求转发到 google 的 8.8.8.8
- [dns]
- type = udp
- local_ip = 8.8.8.8
- local_port = 53
- remote_port = 6000
5.stcp 类型的代理
stcp 利用了一个 sk 验证, 使得只有 sk 一直的两个客户端能够点对点互访, 防止公网上的随意访问.
家里的路由器:
- [secret_ssh]
- type = stcp #类型是 stcp
- sk = router1 # 只有 sk 一致的用户才能访问到此服务
- local_ip = 192.168.1.1
- local_port = 22
另外一台 PC:
- [secret_ssh_visitor]
- type = stcp
- role = visitor # 访问者
- server_name = secret_ssh # 对应穿透服务的名称与上面一直
- sk = router1 # 只有 sk 一致的用户才能访问到此服务
- bind_addr = 127.0.0.1
- bind_port = 8022 # 绑定本地的端口
在本地访问 SSH, 地址 127.0.0.1, 端口 8022 就会穿透到家里的路由器 22 端口.
测试
一个不知道什么时候就会消失的测试服务器, 注意人多容易重名, 不要当作正式用途.
Web 地址: 网址 admin/Qwert123
FRP 服务地址: f.anys.ga:7000
token:f.anys.ga
TCP/UDP 端口: 8089,443, 5000-5100
三级域名 *.f.anys.ga
其它问题
1. 修改 frps.INI 后需要重新启动容器 docker restart frps
2. 服务器端只适用于 64 位的系统
3.0.17 以后的版本和之前的不兼容, 注意客户端和服务器版本一致
4. 由于 frp 是封装在 docker 里面运行的, 如果要讨论效率的话我不好说.
说真的 FRP 真的很好用, 之前用 Vultr https://www.centos.bz/tag/vultr/ 做服务器的时候, 带宽足够可以在线看家里 NAS 的视频, 而且非常稳定, 不论是客户端还是服务端都很稳, 基本不用操心.
来源: https://juejin.im/entry/5bebd41be51d450b291bfe2b