一:环境需求
一台有公网ip的机器,一台内网的机器(以树莓派为例)
使用软件:nginx
、frp
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端口进行跳转
到此我们就完成了通过我们预定义的域名访问在内网中的机器。