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

locations vs route_prefix:locations 只做路径匹配不改写;route_prefix 匹配后会去掉前缀再转发给本机服务。如果本机服务路径与 URL 路径一致,用 locations 即可。