内網穿透
内網穿透,即NAT穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 位址和源端口号的資料包不被 NAT 裝置屏蔽而正确路由到内網主機。對于沒有公網IP的使用者來說,用現成的内網穿透工具即可,如花生殼、NATAPP、cpolar等。本文主要介紹用frp+nginx實作内網穿透。
frp
frp是什麼
frp 是一個專注于内網穿透的高性能的開源反向代理應用,支援 TCP、UDP、HTTP、HTTPS 等多種協定。可以将内網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
安裝frp
首先,在frp官網下載下傳安裝包,本文使用frp版本為0.48.0。
用戶端(内網中搭載http服務的主機)和服務端(擁有公網IP的伺服器主機)執行如下指令:
$ wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
$ tar -xzvf frp_0.48.0_linux_amd64.tar.gz
$ sudo mv frp_0.48.0_linux_amd64 /usr/local/frp
$ cd /usr/local/frp
修改用戶端和服務端hosts檔案,加入如下配置:
your_server_ip frp.example.com
服務端配置
修改frp目錄下的frps.ini,加入如下配置:
[common]
bind_port = 7000 # 服務端監聽端口,接收 frpc 的連接配接
token = your_token # 鑒權使用的 token 值,用戶端需要設定一樣的值才能鑒權通過
dashboard_port = 7500 # 啟用 Dashboard 監聽的本地端口
dashboard_user = your_dashboard_user # Dashboard HTTP BasicAuth 使用者名
dashboard_pwd = your_dashboard_pwd # Dashboard HTTP BasicAuth 密碼
vhost_http_port = 7001 # 為 HTTP 類型代理監聽的端口,啟用後才支援 HTTP 類型的代理,預設不啟用
别忘了将以上端口加入防火牆白名單,或者關閉防火牆。
用戶端配置
修改frp目錄下的frpc.ini,加入如下配置:
[common]
server_addr = your_server_addr # 連接配接服務端的位址,預設0.0.0.0
server_port = 7000 # 連接配接服務端的端口,預設7000
token = your_token # 鑒權使用的 token 值,與服務端一緻
[web]
type = http # 代理類型,可選值:tcp, udp, http, https, stcp, sudp, xtcp, tcpmux
local_port = 7860 # 本地服務端口
custom_domains = frp.example.com # 伺服器綁定自定義域名,使用者通過 vhost_http_port 通路的 HTTP 請求如果 Host 在 custom_domains 配置的域名中,則會被路由到此代理配置的本地服務
配置supervisor使frp自啟動
服務端和用戶端執行如下指令:
# 安裝supervisor
$ sudo apt-get install supervisor
$ sudo systemctl start supervisor
# 配置supervisor開機自啟
$ sudo systemctl enable supervisor
服務端配置步驟如下:
$ sudo vim /etc/supervisor/frps.conf
# 加入如下配置
[program:frps]
process_name=%(program_name)s_%(process_num)02d
command=/usr/local/frp/frps -c /usr/local/frp/frps.ini
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/usr/local/frp/supervisord.log
stderr_logfile=/usr/local/frp/supervisord_err.log
stopwaitsecs=3600
$ sudo supervisorctl update
用戶端配置步驟如下:
$ sudo vim /etc/supervisor/frpc.conf
# 加入如下配置
[program:frpc]
process_name=%(program_name)s_%(process_num)02d
command=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/usr/local/frp/supervisord.log
stderr_logfile=/usr/local/frp/supervisord_err.log
stopwaitsecs=3600
$ sudo supervisorctl updat
nginx配置
服務端執行如下指令:
$ sudo apt-get install nginx
$ sudo vim /etc/nginx/conf.d/proxy.example.com.conf
# 加入如下配置
server
{
listen 80;
listen 443 ssl http2;
# proxy.example.com為外網通路的域名
server_name proxy.example.com;
location / {
proxy_pass http://frp.example.com:7001;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
index index.html index.htm default.php default.htm default.html;
ssl_certificate /etc/nginx/conf.d/cert/proxy.example.com.crt;
ssl_certificate_key /etc/nginx/conf.d/cert/proxy.example.com.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
access_log /var/log/nginx/proxy.example.com.log;
error_log /var/log/nginx/proxy.example.com.error.log;
}
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ nginx -s reload
測試内網穿透效果
服務開啟後,在任意浏覽器通路https://proxy.example.com,即可通路用戶端Web服務。
[文章轉載,侵删]