Sử dụng FRP để public localhost hỗ trợ SSL

Có khá nhiều feature, tốt hơn ngrok, localtunnel, nhưng ở đây chỉ bắt đầu với việc sử dụng frp để expose localhost dưới một subdomain bất kỳ, có SSL.

Cài đặt bao gồm 3 phần:

  1. Cài đặt domain
  2. Cài đặt frps trên server
  3. Cài đặt frpc trên máy local

Cài đặt domain

Tạo 2 record như sau, với value là IP của server mà bạn muốn dùng để cài đặt frp:

  1. frp.duocnguyen.dev.
  2. *.frp.duocnguyen.dev.

Cài đặt FRP server

Download file từ Github

wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz

Giải nén nó:

tar -zxvf frp_0.42.0_linux_amd64.tar.gz

Di chuyển vào thứ mục vừa giải nén:

cd frp_0.42.0_linux_amd64

Chép file frps vào thư mục bin:

cp frps /usr/bin

Chép file service:

cp systemd/frpc.service /etc/systemd/system/.
chmod 754 /etc/systemd/system/frps.service

Chép file config:

mkdir /etc/frp
cp frps.ini /etc/frp/.

Config file /etc/frp/frps.ini

[common]
bind_port = 7000
kcp_bind_port = 7000
vhost_http_port = 8090
token = 2J6R3xfPBeHyKX
tcp_mux = true
subdomain_host = frp.duocnguyen.dev
dashboard_port = 7500

dashboard_user = admin
dashboard_pwd = ipIf08D3a42

Enable service:

systemctl enable frps.service

Chạy service

systemctl start frps.service

Cài nginx

sudo apt update
sudo apt install nginx

Tạo config:

touch /etc/nginx/sites-available/frp.duocnguyen.dev.conf

Link nó qua bên enabled:

sudo ln -s /etc/nginx/sites-available/frp.duocnguyen.dev.conf /etc/nginx/sites-enabled/

Config file:

server {
    server_name *.frp.duocnguyen.dev;
    listen 80;
    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/frp.duocnguyen.dev/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/frp.duocnguyen.dev/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
    if ($host = .frp.duocnguyen.dev) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    return 404;
}

Cài đặt certbot

sudo apt install python3 python3-venv libaugeas0
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot certbot-nginx
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

Config cert bot và nginx

sudo certbot -d *.frp.duocnguyen.dev -d frp.duocnguyen.dev --manual --preferred-challenges dns-01 certonly

Cài đặt DNS theo như hướng dẫn là được.

Cài đặt client

Cài đặt client:

brew install frp

Hoặc tải tại trang Releases · fatedier/frp · GitHub

Config client:

[common]
server_addr = 128.199.148.122
server_port = 7000
protocol = kcp
token = 2J6R3xfPBeHyKX
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[fireass]
type = http
local_port = 8080
subdomain = fireass
use_compression = true

Run client:

frpc -c ./frpc.ini

Sử dụng

Chạy server của mình:

go run ./cmd/server/...

Chạy frp:

frpc -c ./frpc.ini

Truy cập vào trang:

https://fireass.frp.duocnguyen.dev/ping