frp 内网穿透实战:让家里的 OpenGrok 也能公网访问
FRP 配置架构梳理
frp 版本: 0.69.1
一、云服务器(frp 服务端)
IP: x.x.x.x | 域名: example.com
frps.toml — /opt/frp/frps.toml
[common]
vhost_http_port = 8080
bindAddr = "0.0.0.0"
bindPort = 7000
[webServer]
addr = "0.0.0.0"
port = 7500
user = "admin"
password = "your-password"
[auth]
token = "your-secure-token"
[log]
level = "info"
maxDays = 3
# 允许 8080 端口用于 HTTP 穿透
[[allowPorts]]
start = 8080
end = 8080
[[allowPorts]]
start = 8090
end = 8090
端口说明
| 端口 | 用途 |
|---|---|
| 7000 | frp 控制连接(frpc ↔ frps) |
| 7500 | frp Dashboard Web 管理界面 |
| 8080 | HTTP 虚拟主机端口(接收 HTTP 请求按域名路由) |
防火墙
# firewalld
sudo firewall-cmd --add-port=7000/tcp --permanent
sudo firewall-cmd --add-port=7500/tcp --permanent
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
# 或 iptables
sudo iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 7500 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
Apache 配置 — /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# OpenGrok 反向代理
ProxyPreserveHost On
ProxyPass /opengrok http://127.0.0.1:8080/opengrok
ProxyPassReverse /opengrok http://127.0.0.1:8080/opengrok
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
需要启用模块:
sudo a2enmod proxy proxy_http
systemd 开机自启
sudo tee /etc/systemd/system/frps.service << 'EOF'
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now frps
二、家庭电脑(frp 客户端)
frpc.toml — /opt/frp_0.69.1_linux_amd64/frpc.toml
[common]
serverAddr = "example.com"
serverPort = 7000
token = "your-secure-token"
[opengrok-web]
type = "http"
localPort = 8090
customDomains = ["example.com"]
locations = ["/opengrok"]
环境
| 项目 | 值 |
|---|---|
| 系统 | Ubuntu 22.04 |
| frp 安装目录 | /opt/frp_0.69.1_linux_amd64/ |
| frpc 二进制 | /home/user/.local/bin/frpc |
| OpenGrok 路径 | /opt/opengrok/apache-tomcat-10.1.40/ |
本地 Tomcat(OpenGrok)
| 项目 | 值 |
|---|---|
| 端口 | 8090 |
| 上下文路径 | /opengrok |
# 启动
/opt/opengrok/apache-tomcat-10.1.40/bin/startup.sh
# 停止
/opt/opengrok/apache-tomcat-10.1.40/bin/shutdown.sh
管理命令
# 启动 frpc
/home/user/.local/bin/frpc -c /opt/frp_0.69.1_linux_amd64/frpc.toml &
# 停止 frpc
pkill -f "frpc -c /opt/frp_0.69.1_linux_amd64/frpc.toml"
三、访问地址
| 方式 | 地址 |
|---|---|
| Apache 代理 | http://example.com/opengrok |
| frp 直连 | http://example.com:8080/opengrok/ |
| Dashboard | http://example.com:7500 |
四、架构流程
用户浏览器
│
▼
example.com:80 (Apache)
│ ProxyPass /opengrok → 127.0.0.1:8080
▼
frps :8080 (vhost_http_port)
│ 根据域名 example.com + locations /opengrok
│ 匹配 frpc 注册的代理,通过 TLS 隧道转发
▼
frpc(家庭电脑)
│ 转发到 localhost:8090/opengrok
▼
Tomcat :8090/opengrok(OpenGrok)
五、添加新服务模板
# frpc.toml 新增
[my-service]
type = "http"
localPort = 3000
customDomains = ["example.com"]
locations = ["/app"]
# 服务端 Apache 新增
ProxyPass /app http://127.0.0.1:8080/app
ProxyPassReverse /app http://127.0.0.1:8080/app
locationsvsroute_prefix:locations只做路径匹配不改写;route_prefix匹配后会去掉前缀再转发给本机服务。如果本机服务路径与 URL 路径一致,用locations即可。
