简介
以下提供了 linux 和 windows 机器上的配置方式。并且提供了基于 nginx 代理来处理一些无法登录机器的访问问题。
官网提供了很多类型连接,其实都是 TCP 的,不管你搞什么直接选 TCP 就完事了。它可以满足绝大多数场景。
建议在公网服务器上配置防火墙避免其他人访问你的内网环境。
应用场景:
- 在家访问公司任意电脑或服务器
- 在公司访问家里的任意电脑或服务器
- 在家或在公司访问内网的任意网站
- 在任意地点访问内网的任意网盘
常见限制:
-
公司内网没有公网 IP管理权限
-
家庭网络没有公网 IP
-
家庭网络 IP 会变呀
使用要求:
- 具有一台有公网 IP 的机器 (可以买云主机等)
配置完成后能实现的功能:
- 基于外网 IP 不同端口
- 访问到内网任意机器
- windwos 机器
- linux 机器
- 访问到内网任意 web 服务
- https 服务
- http 服务
- ftp 服务等
- 访问到内网任意机器
项目地址:https://github.com/fatedier/frp
安装
这里的安装的软件包含客户端和服务端,有公网的机器和内网机器都要安装,只是用到的文件不一样
服务端或客户端可以是 windows 也可以是 linux 都能实现以上功能
1. linux机器安装
# 安装目录
cd /opt
# 下载包
wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz
# 解压包
tar xf frp_0.59.0_linux_amd64.tar.gz
# 改名
mv frp_0.59.0_linux_amd64 frp
2. windows机器安装
点击链接下载:
https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_darwin_amd64.tar.gz
使用解压工具解压到想要保存的位置即可
windows 和 linux 安装完成后都会包含这几个文件
frpc # 客户端程序
frpc.toml # 客户端配置文件
frps # 服务端程序
frps.toml # 服务端配置文件
配置
通过端口访问内网机器
-
在具有公网 IP 的机器上配置 frps
编辑 frps.toml 文件
bindPort = 7000 # 可以改成你想要的端口
-
在需要访问的内网机器上配置 frpc
编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。以下是示例配置:
serverAddr = "x.x.x.x" # 服务端公网IP
serverPort = 7000 # 服务端端口
[[proxies]] # 固定写法
name = "test-01" # 机器备注信息 多个proxies时名字不要重复
type = "tcp" # 代理类型 保持默认即可
localIP = "127.0.0.1" # 需要代理的内网机器的 IP
localPort = 22 # 需要代理的内网机器的端口
remotePort = 6000 # 在服务端可以访问的端口 不能和现有端口重复
当你有多个机器需要代理时编辑 frpc.toml 文件
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]] # 第一个机器
name = "test-01"
type = "tcp"
localIP = "10.0.0.2" # 第一个机器的 内网IP
localPort = 22
remotePort = 6000 # 远程访问的端口 不能重复
[[proxies]] # 第二个机器
name = "test-01"
type = "tcp"
localIP = "10.0.0.3" # 第二个机器的 内网IP
localPort = 22
remotePort = 6001 # 远程访问的端口 不能重复
[[proxies]] # 第三个机器
......
注意:
当你在家里访问公司的内网端口时,就要输入公网 IP加你在内网配置文件中配置的 remotePort 来访问内网端口的
在使用frp 工具前你需要知道你要访问的端口
- ssh 默认端口:22
- windows 远程服务默认端口: 3389
- http服务默认端口:80
- https服务默认端口:443
在访问不同机器时,修改 [[proxies]] 下的 localIP 和 localPort 控制你要访问的内网机器和服务
当你想添加新的内网机器访问时,你需要在配置文件中复制一份 [[proxies]] 并修改成你想访问的 IP 和端口重启服务即可
不管你用的是 windows 或 linux 配置文件和程序都是相同的,只是启动方式略有区别
启动
linux 机器配置
1. 服务端 systemd 管理
cat >/usr/lib/systemd/system/frps.service<<'EOF'
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /opt/frp/frps -c /opt/frp/frps.toml
[Install]
WantedBy = multi-user.target
EOF
# 重载
sudo systemctl daemon-reload
# 启动frp
sudo systemctl start frps
# 停止frp
# sudo systemctl stop frps
# 重启frp
# sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 开机自启动
sudo systemctl enable frps
验证是否启动成功
sudo systemctl status frps # 查看状态
ps -ef|grep frps # 查看进程是否存在
tail -f /var/log/messages # 查看日志
2. 客户端systemd管理
cat >/usr/lib/systemd/system/frpc.service<<'EOF'
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /opt/frp/frpc -c /opt/frp/frpc.toml
[Install]
WantedBy = multi-user.target
EOF
# 重载
sudo systemctl daemon-reload
# 启动frp
sudo systemctl start frpc
# 停止frp
# sudo systemctl stop frpc
# 重启frp
# sudo systemctl restart frpc
# 查看frp状态
sudo systemctl status frpc
# 开机自启动
systemctl enable frpc
验证是否启动成功
sudo systemctl status frpc # 查看状态
ps -ef|grep frpc # 查看进程是否存在
tail -f /var/log/messages # 查看日志
windows 机器配置
1. 服务端启动
新建一个 startup.bat
文件, 记住后缀必须时 .bat
// 可能需要在 windows 上打开显示后缀名的功能 自行百度
输入以下内容
@echo off
REM 这里的文件路径改成你自己的路径就好了
start /MIN C:\frp_path\frps.exe -c C:\frp_path\frps.toml
配置完成后点击 startup.bat
文件就起来了
2. 客户端启动
新建一个 startup.bat
文件, 记住后缀必须时 .bat
// 可能需要在 windows 上打开显示后缀名的功能 自行百度
输入以下内容
@echo off
REM 这里的文件路径改成你自己的路径就好了
start /MIN C:\frp_path\frpc.exe -c C:\frp_path\frpc.toml
配置完成后点击 startup.bat
文件就起来了
小技巧
注意:
当你完成以上配置后,就可以通过配置的公网 IP+ remotePort 来访问它们了。
windows 机器开启安全防护时,会删除 frp 工具的文件,所以需要将文件加入白名单或关闭安全防护。
- 如果无法访问
- 是否开启了防火墙
- 是否开启了云主机的访问策略
- 服务是否正常
测试连接
- ssh 使用 xshell 等连接工具 输入公网 IP+remotePort 即可访问
- windows 机器打开远程桌面连接服务 输入 IP:端口 即可访问
- http 服务 在浏览器输入 IP: remotePort 即可访问
- https 服务就比较麻烦,有的需要用 nginx 代理一下,代理完成后在浏览器输入 IP: remotePort 即可访问
- 在 nginx 上需要配置 ssl 加密要不然就不行
- 也可以用 frp 自带的功能好像用不了,没整明白
配置 nginx 代理
我的内网有台机器上有个 https 的服务 比如 IP 是 10.0.0.67 ,配置 frpc 的机器 IP 为 10.0.0.66
cat /etc/nginx/conf.d/test.conf
server {
listen 666 ssl; # 自定义端口
server_name 10.0.0.66; # 请替换为你的域名或服务器的 IP 地址
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; # 记得配置证书 很关键
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; # 记得配置证书 很关键
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass https://10.0.0.67; # https 服务的地址端口不是 443时 需要指定端口
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 X-Forwarded-Proto $scheme;
# 忽略证书验证(如果目标服务器使用自签名证书)
#proxy_ssl_verify off;
#proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
proxy_ssl_server_name on;
proxy_ssl_name 10.0.0.66; # 改成你的IP
proxy_ssl_verify off; # 禁用对目标服务器 SSL 证书的验证
add_header 'Access-Control-Allow-Origin' 'https://10.0.0.66' always; # 改成你的IP
add_header 'Access-Control-Allow-Credentials' 'true' always;
proxy_connect_timeout 30s ;
proxy_read_timeout 86400s ;
proxy_send_timeout 30s ;
proxy_http_version 1.1 ;
proxy_set_header Upgrade $http_upgrade ;
proxy_set_header Connection "upgrade" ;
add_header X-Cache $upstream_cache_status ;
}
}
配置完成后重启 nginx 先在内网测试访问这个 IP 端口
添加一个 frp内网机器上的配置文件中新建一个 [[proxies]]
[[proxies]] name = "web01" type = "tcp" localIP = "10.0.0.3" localPort = 666 # nginx中的本地端口 remotePort = 6003 # 远程访问的端口 不能重复
搞完重启
当你完成以上步骤后,你将拥有全新的办公体验或在家悄悄挂机的快感。
nginx配置 ssl
如果不会配置 ssl 请看这里
1. 创建必要的目录
首先,创建缺失的目录:
sudo mkdir -p /etc/ssl/private
sudo mkdir -p /etc/ssl/certs
2. 生成自签名证书
-
生成私钥:
sudo openssl genrsa -out /etc/ssl/private/nginx-selfsigned.key 2048
-
创建证书签名请求 (CSR):
sudo openssl req -new -key /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.csr
-
自签名证书:
sudo openssl x509 -req -days 365 -in /etc/ssl/certs/nginx-selfsigned.csr -signkey /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
3. 测试并重启 Nginx
-
测试 Nginx 配置:
sudo nginx -t
-
重启 Nginx 服务:
sudo systemctl restart nginx
注意事项
- 自签名证书在浏览器中不会被信任,会显示“不安全”的警告。这适合内部测试和开发环境,但不适用于生产环境。
- 如果需要在生产环境中使用 HTTPS,建议从可信的证书颁发机构(CA)获取证书,或者使用 Let’s Encrypt 提供免费的证书服务。
封面图片由通义万象生成:https://tongyi.aliyun.com/wanxiang/