使用 frp 有很长一段时间了,但是一直没有写这方面的文章,每次重新配置都需要读官方的文档,略显吃力。从很长一段的文档里提取最核心的内容,显得并不那么容易。本文将讲述我是如何使用 frp 实现内网穿透,即在家里 ssh 公司的电脑以及 公司电脑上的 web 服务公开给大家使用。
frp 是我所见过 的 内网穿透解决方案里 我最喜欢的一个,功能足够强大,可以 穿透 ssh 和 web,并支持 kcp 协议。github 地址是 https://github.com/fatedier/frp ,拥有将近 30K star,足见其实力吧。下面回归主题,使用 frp 穿透 ssh 和 web 服务。
[common] server_addr = xxx.xxx.xxx.xxx server_port = 7000 protocol = kcp
如上,是 frp 客户端的基础配置,如果要配置 ssh 或者 web 服务,你继续追加即可。
frpc.ini 配置如下:
[common] server_addr = xxx.xxx.xxx.xxx server_port = 7000 protocol = kcp [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
这里的 ssh 可以换作别的名称,不影响使用,但是不能重复哦,重复注册不成功。
frps.ini 配置如下:
[common] kcp_bind_port = 7000 vhost_http_port = 8080 subdomain_host = kpromise.top
这里,subdomain_host 指你的主域名,7000 是 frp 主程序的监听地址,需要跟上文中 server_port 对应。8080 是 http 的监听端口。
frpc.ini 配置如下:
[common] server_addr = xxx.xxx.xxx.xxx server_port = 7000 protocol = kcp [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 [customerdev] type = http local_port = 8182 subdomain = customerdev
frps.ini 配置如上,这里不再赘述。之后你可以 frps -c frps.ini 以及 frpc -c frpc.ini 来启动客户端和服务端,启动后,你就可以通过 customerdev.kpromise.top:8080 来 访问内网服务了。如果你不想要 域名后面的 8080,那就只能通过 nginx 转发了,即 你请求 customerdev.kpromise.top 时,nginx 将流量转发到 本地的 8080 端口,配置如下:
server { listen 80; server_name customerdev.kpromise.top; server_tokens off; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name customerdev.kpromise.top; charset uft-8; location / { proxy_pass http://localhost:8080; gzip off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ssl_certificate /etc/letsencrypt/live/kpromise.top/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kpromise.top/privkey.pem; # managed by Certbot }
这样子,你还直接给 加了 https 呢,何乐而不为!记住一点 [customerdev] 这里 customerdev 是服务名称,你随便写,但是不能重复。而 common 部分你就不要改了,反正我没改!可以多个 client 连接 同一个 server,除了 common 外,其余 服务名称不得重复。另外,还支持 流量压缩与加密,以及客户端服务端鉴权。鉴权呢,服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。压缩与加密需要在 client 端指定,且只能在服务配置下,比如:
frpc.ini
[ssh] type = tcp local_port = 22 remote_port = 6000 use_encryption = true use_compression = true
压缩后可有效加快传输速度。