Centos7安裝frp實現內網穿透 - 安全地暴露內網服務

frp介紹

frp 是一個可用於內網穿透的高性能的反向代理應用,支持 tcp, udp 協議,爲 http 和 https 應用協議提供了額外的能力,且嘗試性支持了點對點穿透。linux

frp的Github中文文檔

github.com/fatedier/fr…git

需求場景

目前我有一個雙機房訪問同一個redis服務端口號的場景,若是直接將redis的服務端口暴露在公網提供服務是一種很不安全的方式。github

可是又須要將一個機房的redis服務端口打通到另外一個機房進行訪問。下面來看看怎麼處理。redis

拓撲圖

對於這個需求場景,首先根據上面的這個拓撲圖進行部署構建。主要採用frp中的安全地暴露內網服務的步驟進行處理。django

安裝frp

首先須要在兩臺Centos7的系統上安裝frp。 能夠訪問從 Release 頁面下載最新版本的程序。vim

當前的最新版本:v0.29.1安全

下載frp

登錄其中一臺服務器,下載frp以下:bash

wget https://github.com/fatedier/frp/releases/download/v0.29.1/frp_0.29.1_linux_amd64.tar.gz
複製代碼

解壓並運行frps

# 解壓frp安裝包
tar -zxvf frp_0.29.1_linux_amd64.tar.gz
# 進入解壓包
cd frp_0.29.1_linux_amd64/
# 啓動frp服務
./frps -c frps.ini
複製代碼

默認啓動後的日誌以下:服務器

[root@server01 frp_0.29.1_linux_amd64]# ./frps -c frps.ini
2019/11/06 19:35:57 [I] [service.go:141] frps tcp listen on 0.0.0.0:7000
2019/11/06 19:35:57 [I] [root.go:205] start frps success
複製代碼

能夠看到默認啓動監聽7000的端口號。session

默認啓動的配置文件frps.ini以下:

[root@server01 frp_0.29.1_linux_amd64]# cat frps.ini 
[common]
bind_port = 7000
[root@server01 frp_0.29.1_linux_amd64]# 
複製代碼

安全地暴露內網redis服務

使用 stcp(secret tcp) 類型的代理能夠避免讓任何人都能訪問到要穿透的服務,可是訪問者也須要運行另一個 frpc。

如下示例將會建立一個只有本身能訪問到的 redis 服務代理。

在server01服務器,啓動frps服務

./frps -c frps.ini
複製代碼

在server01服務器,啓動 frpc,轉發內網的 redis 服務,配置以下,不須要指定遠程端口:

# vim frpc.ini

[common]
server_addr = 127.0.0.1
server_port = 7000

[secret_redis]
type = stcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 6379
複製代碼

啓動frpc,以下:

[root@server01 frp_0.29.1_linux_amd64]# ./frpc -c ./frpc.ini
2019/11/06 19:55:51 [I] [service.go:249] [20ccbb1705b307fc] login to server success, get run id [20ccbb1705b307fc], server udp port [0]
2019/11/06 19:55:51 [I] [proxy_manager.go:144] [20ccbb1705b307fc] proxy added: [secret_redis]
2019/11/06 19:55:51 [I] [control.go:164] [20ccbb1705b307fc] [secret_redis] start proxy success
複製代碼

另外,要注意server01的安全組要放行7000端口提供外部server02訪問。

在要訪問這個服務的機器server02上啓動另一個 frpc,配置以下:

[root@server02 frp_0.29.1_linux_amd64]# vim frpc.ini

[common]
server_addr = x.x.x.x # 配置server01提供服務的公網IP地址
server_port = 7000

[secret_redis_visitor]
type = stcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字
server_name = secret_redis
sk = abcdefg
# 綁定本地端口用於訪問 redis 服務
bind_addr = 127.0.0.1
bind_port = 6379
複製代碼

啓動frpc,以下:

[root@server02 frp_0.29.1_linux_amd64]# ./frpc -c ./frpc.ini
2019/11/06 20:30:13 [I] [service.go:249] [da9b4dcd948edb10] login to server success, get run id [da9b4dcd948edb10], server udp port [0]
2019/11/06 20:30:13 [I] [visitor_manager.go:74] [da9b4dcd948edb10] start visitor success
2019/11/06 20:30:13 [I] [visitor_manager.go:118] [da9b4dcd948edb10] visitor added: [secret_redis_visitor]
複製代碼

測試穿透的端口服務

在server02服務器,測試redis的6379端口號是否綁定正常,以下:

[root@server02 opt]# nc -vv 127.0.0.1 6379
Ncat: Version 7.50 ( https://nmap.org/ncat )
NCAT DEBUG: Using system default trusted CA certificates and those in /usr/share/ncat/ca-bundle.crt.
NCAT DEBUG: Unable to load trusted CA certificates from /usr/share/ncat/ca-bundle.crt: error:02001002:system library:fopen:No such file or directory
libnsock nsi_new2(): nsi_new (IOD #1)
libnsock nsock_connect_tcp(): TCP connection requested to 127.0.0.1:6379 (IOD #1) EID 8
libnsock nsock_trace_handler_callback(): Callback: CONNECT SUCCESS for EID 8 [127.0.0.1:6379]
Ncat: Connected to 127.0.0.1:6379.
libnsock nsi_new2(): nsi_new (IOD #2)
libnsock nsock_read(): Read request from IOD #1 [127.0.0.1:6379] (timeout: -1ms) EID 18
libnsock nsock_readbytes(): Read request for 0 bytes from IOD #2 [peer unspecified] EID 26
複製代碼

查看6379端口號對應的服務,以下:

[root@server02 redis-stable]# netstat -tunlp | grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      21795/./frpc        
[root@server02 redis-stable]# 
複製代碼

在server01服務器查看frp日誌顯示以下:

能夠看到有一個鏈接成功接入。

在server02訪問綁定的redis 6379服務,以下:

[root@server02 ~]# redis-cli 
127.0.0.1:6379> select 7
OK
127.0.0.1:6379[7]> KEYS &
(empty list or set)
127.0.0.1:6379[7]> KEYS *
 1) "task_info_207"
 2) ":1:django.contrib.sessions.cachewxv18olb5bzbckss3e9dndqy381ieiym"
 3) "task_info_882"
 4) "task_info_684"
 5) ":1:django.contrib.sessions.cachexy8g39n7hh2i6awnqj37xauo45ewwz0y"
 6) "task_info_661"
 7) "tc_locusts_ip"
 8) ":1:django.contrib.sessions.cacheckpnxdk6nke1bvieujbh02plfsp39icx"
複製代碼

能夠看到frpc很好地幫我將server01的redis服務打通到了server02上。上面在redis上查詢到的數據就是server01上存儲的。

相關文章
相關標籤/搜索