frp结合nginx实现内网穿透

在服务器上搭建frp内网穿透服务端,实现外网访问路由器主页、ftp服务器等本地功能,同时使用nginx实现frp与其他静态网站服务共用80端口。

frp在服务器上的搭建

搭建具体搭建以及配置方式参考github开源项目:frp
在该项目下载对应软件包配置好配置文件后运行即可,frps为服务端,frpc为客户端。

frps.ini配置

在服务器中运行的frps服务端配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
bind_port = 5443
bind_addr = 0.0.0.0

auth_token = frpofpadavan
vhost_http_port = 10080

subdomain_host = frp.yourwebsite.com

dashboard_port = 6443
dashboard_user = username
dashboard_pwd = password

max_pool_count = 50
tcp_mux = true

在云服务器安全组中开放端口: 5443,10080,6443。其中:

  • bind_port
    frp服务端监听的端口
  • bind_addr
    frp服务端公网ip,frps部署在服务器中,使用0.0.0.0即可
  • auth_token
    连接秘钥,需要与客户端相同
  • subdomain_host
    自定义二级域名,frpc设置subdomain的参数后,实现subdomain.subdomain_host访问web
  • dashboard
    frp服务状态监控,访问服务器域名加端口输入用户密码即可进入
  • max_pool_count
    开启最大连接池限定
  • tcp_mux
    开启tcp多路复用

frpc.ini配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 5443
auth_token = frpofpadavan

tcp_mux = true
protocol = tcp
pool_count = 2

[web]
type = http
local_ip = 192.168.2.1
local_port = 80
subdomain = padavan

[ssh]
type = tcp
remote_port= 2222
local_ip = 192.168.2.1
local_port = 22

[range:ftp]
type = tcp
local_ip = 192.168.2.1
local_port = 21,50000-50100
remote_port = 2121,50000-50100
  • server_addr
    服务器公网ip
  • server_port、auth_token、tcp_mux
    与frps中设置的相同
  • protocol
    底层通信使用kcp协议时另其至为kcp,不使用为tcp,默认tcp,可不设置
  • pool_count
    连接池数目,视具体情况而定

[web]

  • local_ip、local_port
    路由器控制台主页地址和登陆端口
  • subdomain
    二级域名设置

如果有需要可以继续照相同格式增加[web1]、[web2]等设置,实现二级域名访问其他本地网页功能

[range:ftp]

  • local_port
    除了映射到本地的ftp端口,还要映射完整被动模式的端口范围(注:该连续端口在路由器以及云服务器的防火墙中都要开放),因为padavan中ftp服务器默认开启pasv模式,在文件传输的时候需要使用该范围端口
  • remote_port
    设置访问ftp的端口(记得防火墙中开放)以及与上述ftp被动模式对应的端口范围

如果ftp服务器pasv下使用frp穿透不设置被动端口映射,将会出现用户授权成功但获取目录失败的情况。

配置完成后:

  • padavan.frp.yourdomain.com:10080访问路由器控制端口
  • 在putty等软件中配置地址yourdomain.com端口2222,即可访问路由器的shell
  • 在winscp等软件中配置地址yourdomain.com端口2121,即可访问本地ftp服务。

大多数人购买云服务器并不仅仅是为了实现内网穿透,还会搭建网站等,所以nginx的使用可以实现frp和其他网站共用80端口的功能,这样在访问路由器控制页的时候不需要输入端口号,直接输入网址padavan.frp.yourdomain.com即可。

nginx配置

在nginx中,在http中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
···
http {
···
server {
listen 443 ssl http2;
server_name *.frp.yourdomain.com;

ssl_certificate /etc/nginx/cert/certificate.pem;
ssl_certificate_key /etc/nginx/cert/certificate.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;


location / {

proxy_pass http://云服务器ip:10080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;


proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

server {
listen 80;
server_name *.frp.yourdomain.com;

return 301 https://$http_host$request_uri;
}
}

上述配置,监听80端口的并将其转发到443端口,在443中使用nginx反向代理功能,过滤*.frp.yourdomain.com的网址并将其发送至上游服务器(frp),proxy_pass中服务器端口为vhost_http_port端口。如此即可实现使用https和http都可访问路由器web服务且不用输入端口号的功能。

若服务器没有占用80端口的服务,可以直接设置frps.ini中的vhost_http_port为80而无需安装配置nginx,这样亦可以实现URL不输入端口直接访问路由器控制页等本地web服务。

参考

frp 和 nginx 搭建一个内网穿透服务器
padavan怎么利用frp内网穿透ftp服务器?