项目地址

github-frp

由于个人计算机以及可移动设备的数量增多,现在人们面临的很大的问题是“没有公网 IP!”这使得想要在外访问家里的电脑、NAS、树莓派、摄像头等网络设备或远程控制等,都无法轻松实现。

这时你就需要一款内网穿透工具来让外网与你家内网建立起连接,实现无公网 IP 的远程访问了。frp (fast reverse proxy)是一款流行的跨平台开源免费内网穿透工具,支持 Windows、macOS 与 Linux,也是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。你只需一台快速稳定、拥有固定公网 IP 的 VPS 服务器即可愉快地进行内网穿透,实现家中设备公网直接访问了。

开发状态

frp 仍然处于开发阶段,未经充分测试与验证,不推荐用于生产环境。

master 分支用于发布稳定版本,dev 分支用于开发,您可以尝试下载最新的 release 版本进行测试。

目前的交互协议可能随时改变,不保证向后兼容,升级新版本时需要注意公告说明同时升级服务端和客户端。

架构

在这里插入图片描述

使用示例

下载安装

根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。

也可以直接

$ wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
$ tar xzf frp_0.12.0_linux_amd64.tar.gz
$ mkdir /etc/frp/
$ mv frp_*/frps /etc/frp

注:版本号自行修改

1、将 frps 及 frps.ini 放到具有公网 IP 的机器上。

2、将 frpc 及 frpc.ini 放到处于内网环境的机器上。

通过 ssh 访问公司内网机器

修改 frps.ini 文件

$ vi /etc/frp/frps.ini

# frps.ini
[common]
#frp服务器监听地址,如果是IPV6地址必须用中括号包围
bind_addr = 0.0.0.0
#frp服务器监听端口,默认7000
bind_port = 7000
 
#kcp的udp监听端口,如果不设那就不启用
#kcp_bind_port = 7000
#指定使用的协议,默认tcp,可选kcp
#protocol = kcp
 
#如果要使用vitual host,就必须设置
#vhost_http_port = 80
#vhost_https_port = 443
 
#Web后台监听端口
dashboard_port = 7500
 
#Web后台的用户名和密码
dashboard_user = admin
dashboard_pwd = admin
 
#Web后台的静态资源目录,调试用的,一般不设
#assets_dir = ./static
 
#日志输出,可以设置为具体的日志文件或者console
log_file = /var/log/frps.log
 
#日志记录等级,有trace, debug, info, warn, error
log_level = info
#日志保留时间
log_max_days = 3
 
#启用特权模式,从v0.10.0版本开始默认启用特权模式,且目前只能使用特权模式
#privilege_mode = true
 
#特权模式Token,请尽量长点且复杂
privilege_token = 12345678
 
#特权模式允许分配的端口范围
privilege_allow_ports = 2000-3000,3001,3003,4000-50000
 
#心跳超时,不用改
#heartbeat_timeout = 90
 
#每个代理可以设置的连接池上限
#max_pool_count = 5
 
#认证超时时间,一般不用改
#authentication_timeout = 900
 
#如果配置了这个,当你的模式为http或https时,就能设置子域名subdomain
#subdomain_host = frps.com
 
#是否启用tcp多路复用,默认就是true,不用管
#tcp_mux = true

启动 frps:

./frps -c ./frps.ini

修改 frpc.ini 文件

假设 frps 所在服务器的公网 IP 为 x.x.x.x;

在内网机器上打开frpc.ini

    # frpc.ini
    [common]
    # server_addr 为 FRP 服务端 (VPS 服务器) 的公网 IP
    server_addr = x.x.x.x
    server_port = 7000
    
    [ssh]
    type = tcp
    #可以指定为其它IP,默认是本地127.0.0.1
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000
    #启用加密
    #use_encryption = true
    #启用压缩
    #use_compression = true
    
    #转发Web
    [web]
    type = http
    local_port = 80
    custom_domains = www.yourdomain.com
    #修改header中的host
    #host_header_rewrite = dev.yourdomain.com
    #启用简单HTTP认证
    #http_user = abc
    #http_pwd = abc
    #在服务端配置了subdomain_host的情况下用于自定义二级域名
    #subdomain = test
    #在存在多个相同域名的情况下通过请求的URL路由到不同的配置
    #locations = /news,/about
    
    #转发DNS请求
    [dns]
    type = udp
    local_ip = 8.8.8.8
    local_port = 53
    remote_port = 6001
    
    [DSM]
    type = tcp
    local_ip = 192.168.1.40 #群晖 NAS 在局域网中的内网 IP
    local_port = 5000
    remote_port = 7001
    
    [RDP]
    type = tcp
    local_ip = 192.168.1.30 #电脑在局域网中的内网 IP (如是本机,也可使用 127.0.0.1)
    local_port = 3389
    remote_port = 7002
    
    #HTTP代理
    [http_proxy]
    type = tcp
    remote_port = 6002
    plugin = http_proxy
    #配置http代理的简单认证
    #plugin_http_user = abc
    #plugin_http_passwd = abc

上述配置中简单说两个,例如在本地上新增了“DSM”和“RDP”两个可供公网访问的服务 (它们名称可以自己取),这里分别对应内网的群晖 NAS 的后台管理界面和 PC 远程桌面。如果需要添加更多的设备和服务供外网访问,那么只需照样画葫芦,指定正确的 IP 地址和端口号即可,如上述文件中所示。

每个服务的 remote_port 是远程访问时要用到的端口号,注意这些端口号也要在服务器的防火墙和安全组里放行才能顺利访问的,如上面的 7001、7002等。

启动 frpc:

./frpc -c ./frpc.ini

访问测试

外网设备通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@x.x.x.x

到现在,我们终于可以正式使用 Frp 内网穿透来进行远程访问内网里的设备了!按照上面的配置,我们想要访问群晖 NAS 的界面,只需打开浏览器,在地址栏输入服务器公网IP:7001即可访问到群晖后台管理界面。

而如果需要远程桌面连接到家里的 Windows 电脑,那么打开“微软远程桌面客户端”后,在地址栏里填入 服务器公网IP:7002 即可连接。

由此,借助 Frp,你就能轻松地为本地局域网内网的设备提供公网直接访问的能力了,你可以用 Frp 来转发包括但不限于 ssh、http、https、转发 Unix 域套接字等服务。

其他配置

安全地暴露内网服务

对于某些服务来说如果直接暴露于公网上将会存在安全隐患。

使用 stcp(secret tcp)类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc

示例

以下示例将会创建一个只有自己能访问到的 ssh 服务代理。

其中,frps 的部署步骤同上。

配置frpc

转发内网的 ssh 服务,配置如下,不需要指定远程端口:

    # frpc.ini
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [secret_ssh]
    type = stcp
    # 只有 sk 一致的用户才能访问到此服务
    sk = abcdefg
    local_ip = 127.0.0.1
    local_port = 22

在要访问这个服务的机器上启动另外一个 frpc,配置如下:

    # frpc.ini
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [secret_ssh_visitor]
    type = stcp
    # stcp 的访问者
    role = visitor
    # 要访问的 stcp 代理的名字
    server_name = secret_ssh
    sk = abcdefg
    # 绑定本地端口用于访问 ssh 服务
    bind_addr = 127.0.0.1
    bind_port = 6000

在这台机器上通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@127.0.0.1

客户端热加载配置文件

当修改了 frpc 中的代理配置,可以通过 frpc reload 命令来动态加载配置文件,通常会在 10 秒内完成代理的更新。

启用此功能需要在 frpc 中启用 admin 端口,用于提供 API 服务。配置如下:

    # frpc.ini
    [common]
    admin_addr = 127.0.0.1
    admin_port = 7400

之后执行重启命令:

frpc reload -c ./frpc.ini

等待一段时间后客户端会根据新的配置文件创建、更新、删除代理。

获取用户真实 IP

HTTP X-Forwarded-For

目前只有 http 类型的代理支持这一功能,可以通过用户请求的 header 中的 X-Forwarded-For 来获取用户真实 IP,默认启用。

Proxy Protocol

frp 支持通过 Proxy Protocol 协议来传递经过 frp 代理的请求的真实 IP,此功能支持所有以 TCP 为底层协议的类型,不支持 UDP。

Proxy Protocol 功能启用后,frpc 在和本地服务建立连接后,会先发送一段 Proxy Protocol 的协议内容给本地服务,本地服务通过解析这一内容可以获得访问用户的真实 IP。所以不仅仅是 HTTP 服务,任何的 TCP 服务,只要支持这一协议,都可以获得用户的真实 IP 地址。

需要注意的是,在代理配置中如果要启用此功能,需要本地的服务能够支持 Proxy Protocol 这一协议,目前 nginx 和 haproxy 都能够很好的支持。

这里以 https 类型为例:

    # frpc.ini
    [web]
    type = https
    local_port = 443
    custom_domains = test.yourdomain.com
    
    # 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
    proxy_protocol_version = v2

只需要在代理配置中增加一行 proxy_protocol_version = v2 即可开启此功能。

本地的 https 服务可以通过在 nginx 的配置中启用 Proxy Protocol 的解析并将结果设置在 X-Real-IP这个 Header 中就可以在自己的 Web 服务中通过 X-Real-IP 获取到用户的真实 IP。

通过密码保护你的 web 服务

由于所有客户端共用一个 frps 的 http 服务端口,任何知道你的域名和 url 的人都能访问到你部署在内网的 web 服务,但是在某些场景下需要确保只有限定的用户才能访问。

frp 支持通过 HTTP Basic Auth 来保护你的 web 服务,使用户需要通过用户名和密码才能访问到你的服务。该功能目前仅限于 http 类型的代理,需要在 frpc 的代理配置中添加用户名和密码的设置。

    # frpc.ini
    [web]
    type = http
    local_port = 80
    custom_domains = test.yourdomain.com
    http_user = abc
    http_pwd = abc

通过浏览器访问 http://test.yourdomain.com,需要输入配置的用户名和密码才能访问。

最后

希望这篇文章能对有远程访问需求的同学有所帮助。Frp 带来的便利性是非常大的,特别是需要出差移动办公的用户,值得大家去研究和折腾一番。与 Frp 同类的软件还有 Ngrok、n2n、cpolar、lanproxy 等,它们工作方式都大同小异,都需要一台服务器作为中转。

参考资料

https://www.iplaysoft.com/frp.html

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐