FRP内网穿透配置 - 基于Centos7

d2b5ca33bd123937

 

FRP服务端安装 & 配置 - Linux

下载解压

# 下载,若要下载最新版本请到官网查看最新的版本
wget https://github.com/fatedier/frp/releases/download/v0.46.0/frp_0.46.0_linux_amd64.tar.gz

# 解压
tar -zxvf frp_0.46.0_linux_amd64.tar.gz

# 进入到解压目录
cd frp_0.46.0_linux_amd64

# 将frps可执行文件移动到用户可执行目录下
mv frps /usr/bin

# 创建frp配置目录
mkdir /etc/frp

# 将frps的最小配置文件移动到配置目录下
mv frps.ini /etc/frp

配置通过systemd管理frps

新增&编辑配置服务文件

vim /etc/systemd/system/frps.service
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
Restart=on-failure
RestartSec=5s
ExecStart = /usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy = multi-user.target

编辑保存后设置自启

# 刷新服务配置文件
systemctl daemon-reload

# 设置frps自启动
systemctl enable frps

# 启动frps
systemctl start frps

# 查看frps运行状态
systemctl status frps

frps.ini配置文件 - 注释

# common 下面是通用配置
[common]
# 绑定tcp端口,默认是7000,服务端与客户端默认使用tcp传输
bind_port = 7000
# 绑定udp端口,若需要使用XTCP,需要绑定
bind_udp_port =7000
# 绑定kcp端口,若客户端与服务端使用kcp传输,需要绑定。kcp使用的是udp协议
kcp_bind_port = 7001
# 绑定quic端口,若客户端与服务端使用quic传输,需要绑定。quic使用的是udp协议
quic_bind_port = 7002
# http 和 https 端口绑定
vhost_http_port = 80
vhost_https_port = 443

# Dashboard 相关配置
# 访问端口
dashboard_port = 7500
# 访问的用户名和密码
dashboard_user = admin
dashboard_pwd = admin
# 若需要使用tls访问,可配置
dashboard_tls_mode = true
# 证书文件提前申请放到指定目录下
dashboard_tls_cert_file = /data/cert/frp/frp.idev.dev.cer
dashboard_tls_key_file = /data/cert/frp/frp.idev.dev.key
# 是否启用普罗米修斯监控
enable_prometheus = true

# Token,客户端与服务端认证的秘钥,请使用随机字符串,尽量超长。这里不支持某些特殊字符,若需要加入特殊字符,请手动加入可使用的特殊字符
token =  xxxxx

# 优化相关
# 是否启用tcp多路复用,默认启用
tcp_mux = true
# 连接池连接的最大数量
max_pool_count = 10

# 日志相关
# 日志文件输出路径
log_file = /var/log/frps.log
# 日志级别
log_level = info
# 日志最大保存天数,默认3天
log_max_days = 7

# TLS 双向认证,强烈建议开启TLS双向认证加密客户端与服务端数据传输。证书生成请看下面的tls整数生成配置
# 是否强制限制客户端通过tls连接服务端,若ca校验通过,会自动启用
tls_only = true
# 服务端证书文件
tls_cert_file = /data/cert/frp/server.crt
# 服务端证书秘钥文件
tls_key_file = /data/cert/frp/server.key
# ca证书文件
tls_trusted_ca_file = /data/cert/frp/ca.crt

frps.ini配置文件 - 无注释

[common]
bind_port = 7000
bind_udp_port =7000
kcp_bind_port = 7001
quic_bind_port = 7002
vhost_http_port = 80
vhost_https_port = 443

dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
dashboard_tls_mode = true
dashboard_tls_cert_file = /data/cert/frp/frp.idev.dev.cer
dashboard_tls_key_file = /data/cert/frp/frp.idev.dev.key
enable_prometheus = true

token =  xxxxx
tcp_mux = true
max_pool_count = 10

log_file = /var/log/frps.log
log_level = info
log_max_days = 7

tls_only = true
tls_cert_file = /data/cert/frp/server.crt
tls_key_file = /data/cert/frp/server.key
tls_trusted_ca_file = /data/cert/frp/ca.crt

FRP客户端安装 & 配置 - Linux

下载解压

# 下载,若要下载最新版本请到官网查看最新的版本 
wget https://github.com/fatedier/frp/releases/download/v0.46.0/frp_0.46.0_linux_amd64.tar.gz 

# 解压 
tar -zxvf frp_0.46.0_linux_amd64.tar.gz 

# 进入到解压目录 
cd frp_0.46.0_linux_amd64 

# 将frpc可执行文件移动到用户可执行目录下 
mv frpc /usr/bin 

# 创建frp配置目录 
mkdir /etc/frp 

# 将frpc的最小配置文件移动到配置目录下 
mv frpc.ini /etc/frp

配置通过systemd管理frpc

新增&编辑配置服务文件

vim /etc/systemd/system/frpc.service
[Unit]
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
Restart=on-failure
RestartSec=5s
ExecStart = /usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini

[Install]
WantedBy = multi-user.target

编辑保存后设置自启

# 刷新服务配置文件
systemctl daemon-reload 

# 设置frpc自启动
systemctl enable frpc

# 启动frpc
systemctl start frpc

# 查看frpc运行状态
systemctl status frpc

frpc.ini 基本配置

[common]
# 服务端的地址,可使用ip或者域名,使用域名先把IP解析到域名下
server_addr = frp.idev.dev
# 服务端的端口,这里是使用7000
server_port = 7000
# 通信协议,如果需要使用quic或者kcp,需要修改protocol,并且修改server_port为对应协议的服务端端口。使用前要确保服务端已经绑定了对应的端口
protocol = tcp

# admin 管理界面,如果需要使用frpc reload 热加载客户端的配置,必须开启
# 绑定的地址
admin_addr = 10.10.10.92
# 绑定的端口
admin_port = 7400
# 用户名和密码
admin_user = admin
admin_pwd = admin

# token需要和服务端一致
token =  xxxxx

# 优化
tcp_mux = true
# 连接池数量,不能超过服务端设置的max_pool_count,否则会以服务端设置的最大值为准
pool_count = 5

# 日志相关
log_file = /var/log/frpc.log
log_level = info
log_max_days = 7


# TLS双向认证
# 是否启用tls
tls_enable = true
# 客户端证书文件
tls_cert_file = /data/cert/frp/client.crt
# 客户端证书秘钥文件
tls_key_file = /data/cert/frp/client.key
# ca证书文件
tls_trusted_ca_file = /data/cert/frp/ca.crt

客户端案例配置

TCP & UDP

SSH

[ssh]
# 类型为tcp
type = tcp
# 指定穿透到局域网的哪个ip和端口
local_ip = 127.0.0.1
local_port = 22
# 指定远程服务端映射的端口
remote_port = 2001
# 启用压缩
use_compression = true

RDP远程控制 - 需要提前开启内网windows主机的远程控制

[rdp]
type = tcp
# 需要被控制的windows主机IP
local_ip = 10.10.10.120
# windows默认远程端口为3389
local_port = 3389
remote_port = 2002
use_compression = true

通过IP访问内网的HTTP服务

[web]
type = tcp
local_ip = 10.10.10.12
local_port = 80
remote_port = 2003
use_compression = true

DNS - UDP协议

[dns]
# 类型需要修改为udp
type = udp
local_ip = 10.10.10.12
local_port = 53
remote_port = 5353
use_compression = true

HTTP & HTTPS

提前准备好内网的WEB服务,这里使用NGINX演示

server {
        listen 80;
        server_name web.latata.me;

         location / {
                proxy_pass http://10.10.10.12;
        }
}
server {
        listen 443 ssl;
        server_name web.latata.me;
        ssl_certificate /data/cert/latata.me/latata.me.cer;
        ssl_certificate_key /data/cert/latata.me/latata.me.key;
        ssl_protocols    TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 30m;
        add_header Strict-Transport-Security "max-age=31536000";

        location / {
            proxy_pass http://10.10.10.12;
        }
}

HTTP

[http]
# 类型为http
type = http
# 我这里是转发到本地的nginx服务的80段鸥
local_port = 80
# 自定义的域名地址,需要提前解析到服务器的IP上
custom_domains = web.latata.me
# 启用压缩
use_compression = true

HTTPS可以通过NGINX等WEB服务器使用,也可以使用FRPC客户端插件实现

HTTPS - NGINX

[https]
# 类型为https
type = https
local_port = 443
custom_domains = web.latata.me
use_compression = true

HTTPS - PLUGIN

[https-plugin]
# 类型同样为https
type = https
custom_domains = web.latata.me
use_compression = true
# 需要指定插件的配置
# 指定使用的插件
plugin = https2http
# 插件处理后,代理到内网的哪个ip和端口
plugin_local_addr = 127.0.0.1:80
# TLS解密的证书和秘钥
plugin_crt_path = /data/cert/latata.me/latata.me.cer
plugin_key_path = /data/cert/latata.me/latata.me.key

STCP

客户端配置

[ssh-stcp]
# 类型为stcp
type = stcp
# 穿透的内网服务
local_ip = 127.0.0.1
local_port = 22
use_compression = true
# 指定秘钥
sk = gioahfawiofhawiof

访问端配置

[ssh-stcp-visitor]
# 类型为stcp
type = stcp
# 角色为访问者
role = visitor
# 指定要访问的客户端服务名称,上面是ssh-stcp
server_name = ssh-stcp
# 秘钥和客户端保持一致
sk = gioahfawiofhawiof
# 绑定一个内网访问的ip和端口
bind_addr = 127.0.0.1
bind_port = 6000

PLUGINS

STATIC_FILE - 静态文件服务器

[static-file]
# 类型为tcp
type = tcp
remote_port = 2004
use_compression = true

# 静态文件服务器插件的配置
plugin = static_file
# 指定需要访问的静态文件目录
plugin_local_path = /usr/share/nginx/html
# 访问的前缀
plugin_strip_prefix = static
# 指定用户名和密码
plugin_http_user = admin
plugin_http_passwd =admin

UNIX_DOMAIN_SOCKET - Unix域套接字

[docker]
type = tcp
remote_port = 2005
use_compression = true

# 插件配置
plugin = unix_domain_socket
# 指定套接字,这里映射到docker上
plugin_unix_path = /var/run/docker.sock

SOCKS5 - 代理

[socks5-proxy]
type = tcp
remote_port = 2006

# 插件配置
plugin = socks5
# 指定代理的用户名和密码
plugin_http_user = admin
plugin_http_passwd = admin

TLS证书自签

自行修改IP和域名信息,没有绑定域名可以把DNS配置删掉

# 生成ca
# 生成ca 秘钥
openssl genrsa -out ca.key 2048
# 生成ca证书,-subj 指定证书的信息,自行修改 C国家 ST省份 L城市 O组织 CN域名 emailAddress邮箱 -days 证书的有效期
openssl req -x509 -new -nodes -key ca.key -subj "/C=CN/ST=ZJ/L=HZ/O=Dev Share/CN=idev.dev/emailAddress=hi@idev.dev" -days 36000 -out ca.crt

# 生成frps服务端证书
# 创建服务端私钥
openssl genrsa -out server.key 2048
# 创建证书签名请求文件
openssl req -new -sha256 -key server.key \
    -subj "/C=CN/ST=ZJ/L=HZ/O=Dev Share/CN=idev.dev" \
    -reqexts SAN \
    -config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:修改为FRP服务端的IP,DNS:修改为解析到服务端的域名")) \
    -out server.csr

# 使用CA根证书签名服务器证书
openssl x509 -req -days 36500 -sha256 \
    -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(printf "subjectAltName=IP:修改为FRP服务端的IP,DNS:修改为解析到服务端的域名") \
    -out server.crt


# 生成frpc客户端证书
openssl genrsa -out client.key 2048
# 创建证书签名请求文件
openssl req -new -sha256 -key client.key \
    -subj "/C=CN/ST=ZJ/L=HZ/O=Dev Share/CN=idev.dev" \
    -reqexts SAN \
    -config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:修改为解析到服务端的域名")) \
    -out client.csr

# 使用CA根证书签名客户端证书
openssl x509 -req -days 36500 -sha256 \
    -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:修改为解析到服务端的域名") \
    -out client.crt
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享