在当今互联网时代,经常需要将内网服务暴露到公网,无论是远程访问家庭NAS、远程控制办公电脑,还是展示开发中的网站给客户。然而,由于IPv4地址资源紧张和安全考虑,大多数家庭和企业网络都位于NAT或防火墙后面,无法直接从外部访问。内网穿透技术应运而生,它能够帮助我们突破这些限制,安全地将内网服务暴露到公网。
FRP(Fast Reverse Proxy)是一个高性能的反向代理应用,专门用于内网穿透。它支持TCP、UDP、HTTP、HTTPS等多种协议,可以将内网服务安全地暴露到公网。FRP采用C/S架构,由服务端(frps)和客户端(frpc)组成,服务端运行在具有公网IP的服务器上,客户端运行在内网环境中。
主要特点:
diff体验AI代码助手代码解读复制代码支持多种协议:TCP/UDP/HTTP/HTTPS/STCP/XTCP 支持加密传输,保障数据安全 支持TCP多路复用,降低连接建立的延迟 -持Web管理界面,方便监控和管理 配置简单,使用灵活
文档:https://gofrp.org/zh-cn/docs/
首先,需要在服务端(公网服务器)和客户端(内网设备)上分别安装FRP。
执行如下命令下载、解压、安装:
bash体验AI代码助手代码解读复制代码wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz tar -zxvf frp_0.61.1_linux_amd64.tar.gz mv frp_0.61.1_linux_amd64 frp
解压frp后,有如下几个文件:
bash体验AI代码助手代码解读复制代码root@vm:/opt/frp# ls LICENSE frpc frpc.toml frps frps.toml
文件说明:
makefile体验AI代码助手代码解读复制代码frpc: 客户端可执行程序,运行在内网环境中 frpc.toml:客户端配置文件,定义如何连接服务端和暴露内网服务 frps:服务端可执行程序,运行在公网服务器上 frps.toml:服务端配置文件,定义服务端如何接收客户端连接和转发流量
服务端必须运行在具有公网IP的服务器上,否则无法实现内网穿透功能。
编辑frps.toml文件,配置服务端参数:
bash体验AI代码助手代码解读复制代码# 连接信息配置 bindAddr = "0.0.0.0" # 服务端监听地址,用于接收frpc的连接,默认监听0.0.0.0,表示监听所有网络接口 bindPort = 50011 # 服务端监听端口,默认值为7000,客户端通过此端口连接 userConnTimeout = 60 # 用户连接超时时间(单位:秒),客户端在指定时间内未完成连接则会被断开 # 鉴权配置 auth.method = "token" # 鉴权方法,此处使用token方式进行身份验证 auth.token = "123auth456" # 鉴权token,客户端需要使用此token连接服务端 # 服务端Dashboard配置 webServer.addr = "0.0.0.0" # 监听地址,默认为127.0.0.1,0.0.0.0表示监听所有网络接口 webServer.port = 50010 # 监听端口,用于访问Web管理界面 webServer.user = "admin" # 仪表盘用户名 webServer.password = "admin123" # 仪表盘密码 # frp日志配置 #log.to = "/var/log/frps.log" # 日志输出路径,若注释则不启用文件日志输出 log.level = "info" # 日志级别 log.maxDays = 3 # 日志文件最多保留天数
配置说明:
体验AI代码助手代码解读复制代码连接信息配置 :定义服务端如何接收客户端连接 鉴权配置 :设置客户端连接服务端时的身份验证方式 Dashboard配置 :配置Web管理界面,方便监控和管理 日志配置 :设置日志输出级别和保留时间
客户端运行在内网环境中,用于将内网服务暴露到公网。
编辑frpc.toml文件,配置客户端参数:
bash体验AI代码助手代码解读复制代码# 连接信息配置 serverAddr = "101.226.23.237" # 连接服务端的IP地址,客户端连接的目标地址 serverPort = 50011 # 连接服务端的端口,默认为7000,客户端通过此端口连接服务端 loginFailExit = true # 第一次登陆失败后是否退出,默认为true transport.dialServerTimeout = 60 # 连接服务端的超时时间(单位:秒) # 鉴权配置 auth.method = "token" # 鉴权方法,此处使用token方式进行身份验证 auth.token = "123auth456" # 鉴权token,客户端需要使用此token连接服务端 # 日志配置 #log.to = "/var/log/frpc.log" # 日志输出路径,若注释则不启用文件日志输出 log.level = "info" # 日志级别 log.maxDays = 3 # 日志文件最多保留天数 # 定义代理服务,用于将本地服务暴露到公网 [[proxies]] name = "ssh" # 代理名称 type = "tcp" # 代理类型,可选值为 tcp, udp, http, https, tcpmux, stcp, sudp, xtcp localIP = "127.0.0.1" # 被代理的本地服务 IP,默认为 127.0.0.1 localPort = 22 # 被代理的本地服务端口 remotePort = 50012 # 服务端绑定的端口,用户访问服务端此端口的流量会被转发到对应的本地服务
配置说明:
lua体验AI代码助手代码解读复制代码连接信息配置 :指定如何连接到服务端 鉴权配置 :必须与服务端的token一致 代理服务配置 :定义要暴露的内网服务 name : 代理服务名称,用于标识 type : 代理类型,根据服务协议选择 localIP 和 localPort : 内网服务的地址和端口 remotePort : 公网访问端口,访问此端口将转发到内网服务 可以定义多个 [[proxies]] 节点,暴露多个内网服务
用frps.toml文件配置启动frps,启动成功就可以看到下类似信息
bash体验AI代码助手代码解读复制代码[root@vm frp]# ./frps -c frps.toml 2025-01-23 08:59:58.167 [I] [frps/root.go:105] frps uses config file: frps.toml 2025-01-23 08:59:58.399 [I] [server/service.go:237] frps tcp listen on 0.0.0.0:50011 2025-01-23 08:59:58.399 [I] [frps/root.go:114] frps started successfully 2025-01-23 08:59:58.399 [I] [server/service.go:351] dashboard listen on 0.0.0.0:50010
用frpc.toml文件配置启动frpc,启动成功就可以看到下类似信息
bash体验AI代码助手代码解读复制代码root@DESKTOP-Q925TDL:/opt/frp# ./frpc -c frpc.toml 2025-01-23 09:04:53.946 [I] [sub/root.go:142] start frpc service for config file [frpc.toml] 2025-01-23 09:04:53.946 [I] [client/service.go:295] try to connect to server... 2025-01-23 09:04:54.053 [I] [client/service.go:287] [6b133e71f98e5052] login to server success, get run id [6b133e71f98e5052] 2025-01-23 09:04:54.054 [I] [proxy/proxy_manager.go:173] [6b133e71f98e5052] proxy added: [ssh] 2025-01-23 09:04:54.090 [I] [client/control.go:168] [6b133e71f98e5052] [ssh] start proxy success
1.访问服务端Dashboard
在浏览器中访问
http://服务器IP:50010,使用配置的用户名和密码登录。
2.访问映射服务
上面在客户端配置了一个关于SSH的连接,只需要使用服务端
IP:50012即可连接内网的SSH服务
bash体验AI代码助手代码解读复制代码ssh username@服务器IP -p 50012
说明 :访问公网服务器的50012端口,流量将被转发到内网设备的22端口。
如果需要使用域名,那么这里肯定是使用子域名,就需要添加子域名的DNS解析记录
1.配置服务端frps.toml
bash体验AI代码助手代码解读复制代码vhostHTTPPort = 50013 # HTTP类型代理监听的端口,启用后才能支持HTTP类型的代理 subDomainHost = "xxx.com" # 二级域名后缀
2.配置客户端frpc.toml
bash体验AI代码助手代码解读复制代码[[proxies]] name = "web" # 代理名称 type = "http" # 代理类型,可选值为 tcp, udp, http, https, tcpmux, stcp, sudp, xtcp localIP = "127.0.0.1" # 被代理的本地服务 IP,默认为 127.0.0.1 localPort = 8000 # 被代理的本地服务端口 subdomain = "frpc" # 子域名,DNS解析处所配置的子域名 通过subdomain.subDomainHost访问
3.DNS配置
需要根据
frpc.toml中配置的子域名,在DNS服务商处添加DNS记录,一个子域名需对应一个DNS记录
css体验AI代码助手代码解读复制代码记录类型:A 记录名称:frpc 记录值:填写服务器IP地址 其它:使用默认值
配置完成后,可以通过http://frpc.xxx.com:50013访问内网的Web服务。
为了让FRP在系统启动时自动运行,可以将其配置为系统服务。
创建服务文件:
bash体验AI代码助手代码解读复制代码vim /etc/systemd/system/frps.service
添加以下内容:
bash体验AI代码助手代码解读复制代码[Unit] Description=FRP server Service After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/frp ExecStart=/opt/frp/frps -c /opt/frp/frps.toml Restart=on-failure RestartSec=5s StandardOutput=append:/opt/frp/frps.log StandardError=append:/opt/frp/error.log [Install] WantedBy=multi-user.target
创建服务文件:
bash体验AI代码助手代码解读复制代码vim /etc/systemd/system/frpc.service
添加以下内容:
bash体验AI代码助手代码解读复制代码[Unit] Description=FRP Client Service After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/frp ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml Restart=on-failure RestartSec=5s StandardOutput=append:/opt/frp/frpc.log StandardError=append:/opt/frp/error.log [Install] WantedBy=multi-user.target
分别在服务端与客户端执行以下相关命令
重新加载 systemd 配置
bash体验AI代码助手代码解读复制代码systemctl daemon-reload
设置开机自启动
bash体验AI代码助手代码解读复制代码systemctl enable frpc systemctl enable frps
启动服务
bash体验AI代码助手代码解读复制代码systemctl start frpc systemctl start frps
查看服务状态
bash体验AI代码助手代码解读复制代码systemctl status frpc systemctl status frps
NPS(Not only Proxy Server)是一款轻量级、高性能、功能强大的内网穿透代理服务器,支持TCP、UDP、HTTP、HTTPS等多种协议。与FRP相比,NPS提供了更加友好的Web管理界面,支持用户权限管理、流量控制等高级功能。
主要特点:
scss体验AI代码助手代码解读复制代码完善的Web管理界面,操作简单直观 支持多用户、多客户端管理 支持流量限制、连接数限制等 支持TCP、UDP、HTTP(S)、SOCKS5等多种协议 支持P2P穿透模式,降低服务器负载
GitHub:https://github.com/ehang-io/nps
下载服务端程序
bash体验AI代码助手代码解读复制代码wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
使用命令解压缩
bash体验AI代码助手代码解读复制代码tar -zxvf linux_amd64_server.tar.gz
重命名目录
bash体验AI代码助手代码解读复制代码mv linux_amd64_server nps
安装
bash体验AI代码助手代码解读复制代码./nps install
安装完成后,NPS会自动创建配置文件和Web管理界面。
bash体验AI代码助手代码解读复制代码nps install # 安装NPS服务 nps start # 启动NPS服务 nps stop # 停止NPS服务 nps restart # 重启NPS服务 nps uninstall # 卸载NPS服务 nps-update update # 更新NPS
编辑nps.conf配置文件
bash体验AI代码助手代码解读复制代码vim /etc/nps/conf/nps.conf
以下是原始配置文件内容
bash体验AI代码助手代码解读复制代码appname = nps #Boot mode(dev|pro) runmode = dev #HTTP(S) proxy port, no startup if empty http_proxy_ip=0.0.0.0 http_proxy_port=80 https_proxy_port=443 https_just_proxy=true #default https certificate setting https_default_cert_file=conf/server.pem https_default_key_file=conf/server.key ##bridge bridge_type=tcp bridge_port=8024 bridge_ip=0.0.0.0 # Public password, which clients can use to connect to the server # After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file. public_vkey=123 #Traffic data persistence interval(minute) #Ignorance means no persistence #flow_store_interval=1 # log level LevelEmergency->0 LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7 log_level=7 #log_path=nps.log #Whether to restrict IP access, true or false or ignore #ip_limit=true #p2p #p2p_ip=127.0.0.1 #p2p_port=6000 #web web_host=a.o.com web_username=admin web_password=123 web_port = 8080 web_ip=0.0.0.0 web_base_url= web_open_ssl=false web_cert_file=conf/server.pem web_key_file=conf/server.key # if web under proxy use sub path. like http://host/nps need this. #web_base_url=/nps #Web API unauthenticated IP address(the len of auth_crypt_key must be 16) #Remove comments if needed #auth_key=test auth_crypt_key =1234567812345678 #allow_ports=9001-9009,10001,11000-12000 #Web management multi-user login allow_user_login=false allow_user_register=false allow_user_change_username=false #extension allow_flow_limit=false allow_rate_limit=false allow_tunnel_num_limit=false allow_local_proxy=false allow_connection_num_limit=false allow_multi_ip=false system_info_display=false #cache http_cache=false http_cache_length=100 #get origin ip http_add_origin_header=false #pprof debug options #pprof_ip=0.0.0.0 #pprof_port=9999 #client disconnect timeout disconnect_timeout=60
| 名称 | 含义 |
|---|---|
| web_port | web管理端口 |
| web_password | web界面管理密码 |
| web_username | web界面管理账号 |
| web_base_url | web管理主路径,用于将web管理置于代理子路径后面 |
| bridge_port | 服务端客户端通信端口 |
| https_proxy_port | 域名代理HTTPS代理监听端口 |
| http_proxy_port | 域名代理HTTP代理监听端口 |
| auth_key | web API密钥 |
| bridge_type | 客户端与服务端连接方式(kcp 或 tcp) |
| public_vkey | 客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 |
| ip_limit | 是否限制IP访问(true/false 或忽略) |
| flow_store_interval | 服务端流量数据持久化间隔(单位:分钟),忽略表示不持久化 |
| log_level | 日志输出级别 |
| auth_crypt_key | 获取服务端authKey时的AES加密密钥(16位) |
| p2p_ip | 服务端IP,使用P2P模式必填 |
| p2p_port | P2P模式开启的UDP端口 |
| pprof_ip | Debug pprof 服务端IP |
| pprof_port | Debug pprof 端口 |
| disconnect_timeout | 客户端连接超时(单位:5秒,默认值60,即300秒=5分钟) |
下载客户端程序
bash体验AI代码助手代码解读复制代码wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_client.tar.gz
解压
bash体验AI代码助手代码解读复制代码tar -zxvf linux_amd64_client.tar.gz
markdown体验AI代码助手代码解读复制代码1. 登录NPS Web管理界面 2. 新增客户端 3. 填写客户端信息 4. 保存后,系统会生成客户端连接信息
获取连接的命令
进入npc目录,使用生成的连接命令启动客户端
临时运行
bash体验AI代码助手代码解读复制代码./npc -server=IP:Port -vkey=7717pvyqjy8tujfd -type=tcp
注册为系统服务软件运行
bash体验AI代码助手代码解读复制代码./npc install -server=IP:Port -vkey=7717pvyqjy8tujfd -type=tcp
bash体验AI代码助手代码解读复制代码npc start
bash体验AI代码助手代码解读复制代码docker run -d --name=npc --restart=always --net=host ffdfgdfg/npc -server=IP:Port -vkey=7717pvyqjy8tujfd -type=tcp
bash体验AI代码助手代码解读复制代码https://github.com/ehang-io/nps/releases/download/v0.26.10/windows_amd64_client.tar.gz
bash体验AI代码助手代码解读复制代码npc.exe install 其他参数(复制的-server等后的内容) #注册 npc.exe start #启动 npc.exe stop #停止 npc.exe uninstall #如果需要更换命令内容需要先使用此命令卸载,再重新使用install注册
| 特性 | FRP | NPS |
|---|---|---|
| 配置方式 | 配置文件 | Web界面 + 配置文件 |
| 易用性 | 配置简单,但需要手动编辑配置文件 | Web界面操作,更加直观 |
| 功能丰富度 | 基础功能完善 | 功能更丰富,支持权限管理、流量控制等 |
| 性能 | 高性能 | 高性能 |
| 多用户支持 | 有限支持 | 完善支持 |
| 社区活跃度 | 非常活跃 | 活跃 |
| 适用场景 | 个人使用、小型团队 | 多用户管理、企业应用 |
使用内网穿透工具时,需要注意以下安全问题:
体验AI代码助手代码解读复制代码1.修改默认密码 :务必修改所有默认密码和密钥 2.限制访问IP :对管理界面设置IP访问限制 3.使用加密传输 :启用数据加密功能 4.最小权限原则 :只暴露必要的内网服务 5.定期更新 :保持软件版本为最新,修复已知安全漏洞 6.监控流量 :定期检查流量使用情况,发现异常及时处理
渝公网安备50022202000470
渝ICP备2023013153号-1 Powered by qibosoft X1.0 Code ©2003-2020