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
locationsvsroute_prefix:locationsonly matches the path without rewriting it.route_prefixstrips the matched prefix before forwarding to the local service. If your local service path matches the URL path, just uselocations.
