首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Centos7安装frp实现内网穿透 - 安全地暴露内网服务

Centos7安装frp实现内网穿透 - 安全地暴露内网服务

作者头像
Devops海洋的渔夫
修改2019-11-12 08:23:35
1.8K0
修改2019-11-12 08:23:35
举报
文章被收录于专栏:Devops专栏Devops专栏

frp介绍

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。

frp的Github中文文档

https://github.com/fatedier/frp/blob/master/README_zh.md

需求场景

目前我有一个双机房访问同一个redis服务端口号的场景,如果直接将redis的服务端口暴露在公网提供服务是一种很不安全的方式。

但是又需要将一个机房的redis服务端口打通到另一个机房进行访问。下面来看看怎么处理。

拓扑图

对于这个需求场景,首先根据上面的这个拓扑图进行部署构建。主要采用frp中的安全地暴露内网服务的步骤进行处理。

安装frp

首先需要在两台Centos7的系统上安装frp。 可以访问从 Release 页面下载最新版本的程序。

当前的最新版本:v0.29.1

下载frp

登陆其中一台服务器,下载frp如下:

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的端口号。

默认启动的配置文件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上存储的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • frp介绍
  • frp的Github中文文档
  • 需求场景
    • 拓扑图
    • 安装frp
      • 下载frp
        • 解压并运行frps
          • 安全地暴露内网redis服务
            • 测试穿透的端口服务
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档