之前写过一篇DDNS服务设计,用来实现具备公网条件但没有固定IP的环境下对外发布服务的需求,但是如果没有公网条件,这个方案就不适用了(很多运营商,尤其是小运营商,IP资源有限,不支持切换客户网络到公网)。

方案先决条件简述
VPN-发布搭载VPN服务的第三方服务器服务侧接入VPN服务器,由VPN服务器代为发布到公网。
VPN-直连搭载VPN服务的第三方服务器建立VPN服务器,客户侧和服务侧同时拨入,主要应用场景:外网访问内网安全级别较高的资源。
反弹连接搭载反弹连接服务的第三方服务器原理与“VPN-发布”相同,区别在于不使用VPN,而是使用反弹模式进行主动连接。
DDNS需要公网IP实时更新DNS记录的公网IP,使用户能定位到最新的IP地址。DNS更新具有延迟。

frps/frpc就是一种利用反弹连接进行内网穿透的方案。这种方案不需要网络有公网环境,但相对的,需要有一台具备公网环境的服务器做为中转,所以成本也更高昂。
* https://github.com/fatedier/frp,Windows、Linux均支持。

需要发布的服务类型不限,TCP (http、https、socket),UDP均可。对源服务器只有一个要求,可以访问互联网,而不需要直连公网的环境;通过主动向中转服务器发起连接,能够确保代理通道成功建立;一旦建立连接以后,访问中转服务器的特定端口即可访问发布的服务。

转发工作正常启动以后,还可以根据需要做一些额外的配置:例如,需要发布一个web应用,端口为 TCP 5000;通过穿透,服务被转发到外网服务器的 tcp 22223;更进一步地,还可以在外网服务器所在运营商处进行备案,借助nginx反向代理localhost:22223,发布标准443端口的https服务。

1. 软件部署:

frps和frpc只需要一个可执行文件和一个配置文件即可工作,无需额外进行部署 (./frpc -s frpc.ini;./frps -s frps.ini)。

2. 服务端配置文件(公网中转服务):

[common]
bind_port = 22222
token = abc20200323
# 开启frps的仪表盘,用于服务
# 状态查看和数据统计。
dashboard_port = 10099
dashboard_user = nimda
dashboard_pwd = adminnimda

3. 客户端配置文件(发布服务的真实服务器):

[common]
# 服务器地址 + 端口
server_addr = a.b.c.d
server_port = 22222
# 用于服务器客户端之间认证
token = abc20200323

[web]
# 以http方式发布,type支持
# http https tcp udp
type = http
local_ip = 127.0.0.1
local_port = 5000
remote_port = 22223
custom_domains = web01.example.com

[rdp]
# 也可以发布其他服务器的服务
# 只要frpc这台服务器能访问到
type = tcp
local_ip = 192.168.5.5
local_port = 3389
remote_port = 22221

4. Dashboard

5. HTTP还是TCP

在发布web应用时个人更倾向于TCP方式发布:

  • 最终网站发布出来以后必然需要配置HTTPS,如果直接以HTTPS方式发布,将无法修改https请求(一般做反向代理的时候会在header中添加X-Forwarded-For进行溯源、添加X-Real-IP进行访客IP感知),真实服务器将无法记录到访客来源(无论出于安全防护的目的,还是出于网站功能的完整性要求);
  • 如果以http进行发布(写一半忘了原因了,这么看的话也不是很重要,http和tcp随意吧,tcp胜在配置更简单灵活)。

6. 小细节

  • 类似http这种需要继续进行反向代理的服务,可以不发布到开放端口上,避免暴露原始服务(例如:服务器开放了80, 443, 5000 – 6000,那么可以将http发布到6001这个外网无法访问的端口上,然后反向代理6001到标准https的443端口,终端用户将无法访问到6001原始服务,而只能访问代理过的443);
  • 发布的服务可以不在本地,也可以是本机所在局域网的其他服务(比如路由器管理端口),甚至可以是公网的服务(比如http://cctv.cn);
  • dashboard是可选项,建议开启;
  • 安全起见,服务端最好开启token验证。

7. 放图

其实昨天在修复失联服务器的时候用的就是这个方案,进行转发的服务是Windows远程桌面 (tcp 3389), 再放一个发布网站的例子。

分类: articles