FRP Intranet Penetration Practical Guide: Public Network Access to Local OpenGrok

FRP Configuration Architecture Guide

FRP version: 0.69.1


1. Cloud Server (FRP Server)

IP: x.x.x.x | Domain: 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

# Allow port 8080 for HTTP tunneling
[[allowPorts]]
start = 8080
end = 8080

[[allowPorts]]
start = 8090
end = 8090

Port Reference

Port Purpose
7000 FRP control channel (frpc ↔ frps)
7500 FRP Dashboard web admin panel
8080 HTTP virtual host port (routes incoming HTTP by domain)

Firewall

# 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

# or 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 Configuration — /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 reverse proxy
    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>

Enable required modules: sudo a2enmod proxy proxy_http

systemd Auto-start

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

2. Home Machine (FRP Client)

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"]

Environment

Item Value
OS Ubuntu 22.04
FRP directory /opt/frp_0.69.1_linux_amd64/
frpc binary /home/user/.local/bin/frpc
OpenGrok path /opt/opengrok/apache-tomcat-10.1.40/

Local Tomcat (OpenGrok)

Item Value
Port 8090
Context path /opengrok
# Start
/opt/opengrok/apache-tomcat-10.1.40/bin/startup.sh

# Stop
/opt/opengrok/apache-tomcat-10.1.40/bin/shutdown.sh

Management Commands

# Start frpc
/home/user/.local/bin/frpc -c /opt/frp_0.69.1_linux_amd64/frpc.toml &

# Stop frpc
pkill -f "frpc -c /opt/frp_0.69.1_linux_amd64/frpc.toml"

3. Access URLs

Method URL
Apache proxy http://example.com/opengrok
FRP direct http://example.com:8080/opengrok/
Dashboard http://example.com:7500

4. Architecture & Data Flow

User Browser
    │
    ▼
example.com:80 (Apache)
    │ ProxyPass /opengrok → 127.0.0.1:8080
    ▼
frps :8080 (vhost_http_port)
    │ Matches domain example.com + locations /opengrok
    │ Routes to registered frpc proxy via TLS tunnel
    ▼
frpc (Home Machine)
    │ Forwards to localhost:8090/opengrok
    ▼
Tomcat :8090/opengrok (OpenGrok)

5. Adding a New Service

# Add to frpc.toml
[my-service]
type = "http"
localPort = 3000
customDomains = ["example.com"]
locations = ["/app"]
# Add to server Apache config
ProxyPass /app http://127.0.0.1:8080/app
ProxyPassReverse /app http://127.0.0.1:8080/app

locations vs route_prefix: locations only matches the path without rewriting it. route_prefix strips the matched prefix before forwarding to the local service. If your local service path matches the URL path, just use locations.