一:环境需求

一台有公网ip的机器,一台内网的机器(以树莓派为例)

使用软件:nginxfrp

frp软件地址:https://github.com/fatedier/frp

申请自己的域名,并将域名解析到公网ip(可以为三级或四级域名)

二:frp配置

我们首先需要根据自己的机型下载适合的版本,要注意的是服务器与客户端都要使用同一个frp版本

下载地址:https://github.com/fatedier/frp/releases

比如我使用的树莓派是arm系统的,就选择了最新版本的linux_arm版本,下载完成后解压,进入

服务器:

服务器修改的是frps.ini配置文件

[common]
 bind_port = 7000  # 绑定本机的端口
 vhost_http_port = 7001  #http访问的端口
 subdomail_host = pi.liunaijie.top # 自己的域名

然后后台启动即可:nohup ./frps -c ./frps.ini &

默认日志为nohup.out,可以查看这个文件查看frp是否正常启动

树莓派(或其他内网机器)

客户端修改frpc.ini配置文件

[common]
server_addr = x.x.x.x #公网的ip地址
server_port = 7000 # 服务器开启的端口

[ssh]  # 开启ssh
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 远程ssh端口

[web] # web服务
type = http 
local_port = 80 
custom_domains = pi.liunaijie.top  # 我们自己的域名,可以通过这个域名访问这个机器

然后后台启动服务nohup ./frpc -c ./frpc.ini &。要注意的是我们要先开启服务器的服务,不然本地是无法开启的。

三:nginx配置

如果按照官网的文档这样就配置完成了,但是我的服务器并不只是作为这个内网穿透的功能,还有其他的功能,并且是通过nginx进行转发,所以还需要配置ningx。

。。。其他设置。。。
server {
          listen 80; #监听http的80端口
          server_name pi.liunaijie.top;  # 这是我们设置的域名
          access_log  logs/pi_liunaijie.log  main; # 记录日志
          location / {
                  proxy_pass http://127.0.0.1:7001; # 转发到我们在frps.ini中设置的vhost_http_port端口
                  proxy_set_header    Host            $host:80;  #不添加这行时访问需要 域名:7001才能访问到内网的机器,如果加了就不再需要后面的端口,直接使用域名访问
                  proxy_set_header    X-Real-IP       $remote_addr;
                  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_hide_header   X-Powered-By;
          }
  
}
。。。其他设置。。。

四:https配置

首先在frps.ini中进行添加https的配置

[common]
 bind_port = 7000  # 绑定本机的端口
 vhost_http_port = 7001  #http访问的端口
 vhost_https_port = 7002 # https的端口
 subdomail_host = pi.liunaijie.top # 自己的域名

frpc.ini中修改配置

...省略...
type = https 
local_port = 443 
custom_domains = pi.liunaijie.top  # 我们自己的域名,可以通过这个域名访问这个机器

然后开启服务我们可以通过我们设置的域名加端口进行访问,例如以我上面的配置就需要https://pi.liunaijie.top:7002来进行访问。但是我不想使用后面的端口所以又进行修改了nginx的配置文件

...省略...
server {
	listen 443 ssl;
	server_name pi.liunaijie.top;
	charset utf-8;
	ssl_certificate /usr/local/nginx/cert/pi.liunaijie.top.pem;
	ssl_certificate_key /usr/local/nginx/cert/pi.liunaijie.top.key;
	access_log  logs/pi_liunaijie.log  main;
	location / {
		resolver 8.8.8.8;
		proxy_ssl_server_name on;
		proxy_pass https://$host:7002;
		proxy_set_header    Host            $host:$server_port;
		proxy_set_header    X-Real-IP       $remote_addr;
		proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_hide_header   X-Powered-By;
	}

}
其中有很重要的几条配置,一定要注意,不然还是没法不加端口进行访问
resolver 8.8.8.8; # 这个最重要 不加这个就是502,加了就好了 也不知道是为什么

我现在是http与https并存,如果只想使用https可以在nginx的80端口进行跳转

到此我们就完成了通过我们预定义的域名访问在内网中的机器。