1、部署原因
在家里搭建了一套服务器做学习和测试使用,由于家里是联通的网络没有公网IP(电信自带公网IP、移动的公网IP最少,一分价钱一分货啦~~~),平时在外面没有办法SSH访问,所以打算用丐版的腾讯云服务器将端口暴露出来,方便在公司上班时摸鱼。
2、FRP简介
frp 是一个专注于内网穿透的高性能的反向代理应用。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。
官网: gofrp.org/
GitHub:github.com/fatedier/fr…
3、腾讯云服务器相关部署
腾讯云服务器选用1核 2GB 1Mbps 高性能云硬盘 网络:Default-VPC 的丐版云主机服务器(有公网IP就行)。
第一步:安装包
安装包下载并解压缩,从 Github Release 页面下载最新版本。(选择自己合适的版本)
wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz
tar -zxvf frp_0.37.0_linux_amd64.tar.gz
复制代码
云服务器做的是server端,所以可以将 frpc相关的全部删除,只保留frps相关的数据包。
第二部:服务端配置
我在这里直接修改了frps_full.ini
这个参考文件,修改了监听地址、日志地址、客户端认证token和WEB_UI等相关配置,其他的配置不做修改。
[root@host-cloud conf]# cat frps_full.ini
[common]
bind_addr = #服务监听地址(腾讯云服务器的内网IP)
bind_port = 7000
bind_udp_port = 7001
kcp_bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443
dashboard_addr = #服务监听地址
dashboard_port = 7500
dashboard_user = #WEB_UI用户
dashboard_pwd = #WEB_UI密码
enable_prometheus = true
log_file = /home/frp/logs/frps.log #日志地址
log_level = info
log_max_days = 3
disable_log_color = false
detailed_errors_to_client = true
authentication_method = token
authenticate_heartbeats = false
authenticate_new_work_conns = false
token = #客户端认证tocken
oidc_skip_expiry_check = false
oidc_skip_issuer_check = false
allow_ports = 2000-3000,3001,3003,4000-50000
max_pool_count = 5
max_ports_per_client = 0
tls_only = false
subdomain_host = frps.com
tcp_mux = true
udp_packet_size = 1500
复制代码
基础配置
参数 | 类型 | 说明 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|---|
bind_addr | string | 服务端监听地址 | 0.0.0.0 | ||
bind_port | int | 服务端监听端口 | 7000 | 接收 frpc 的连接 | |
bind_udp_port | int | 服务端监听 UDP 端口 | 0 | 用于辅助创建 P2P 连接 | |
kcp_bind_port | int | 服务端监听 KCP 协议端口 | 0 | 用于接收采用 KCP 连接的 frpc | |
proxy_bind_addr | string | 代理监听地址 | 同 bind_addr | 可以使代理监听在不同的网卡地址 | |
log_file | string | 日志文件地址 | ./frps.log | 如果设置为 console,会将日志打印在标准输出中 | |
log_level | string | 日志等级 | info | trace, debug, info, warn, error | |
log_max_days | int | 日志文件保留天数 | 3 | ||
disable_log_color | bool | 禁用标准输出中的日志颜色 | false | ||
detailed_errors_to_client | bool | 服务端返回详细错误信息给客户端 | true | ||
heart_beat_timeout | int | 服务端和客户端心跳连接的超时时间 | 90 | 单位:秒 | |
user_conn_timeout | int | 用户建立连接后等待客户端响应的超时时间 | 10 | 单位:秒 | |
udp_packet_size | int | 代理 UDP 服务时支持的最大包长度 | 1500 | 服务端和客户端的值需要一致 | |
tls_cert_file | string | TLS 服务端证书文件路径 | |||
tls_key_file | string | TLS 服务端密钥文件路径 | |||
tls_trusted_ca_file | string | TLS CA 证书路径 |
权限验证
参数 | 类型 | 说明 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|---|
authentication_method | string | 鉴权方式 | token | token, oidc | |
authenticate_heartbeats | bool | 开启心跳消息鉴权 | false | ||
authenticate_new_work_conns | bool | 开启建立工作连接的鉴权 | false | ||
token | string | 鉴权使用的 token 值 | 客户端需要设置一样的值才能鉴权通过 | ||
oidc_issuer | string | oidc_issuer | |||
oidc_audience | string | oidc_audience | |||
oidc_skip_expiry_check | bool | oidc_skip_expiry_check | |||
oidc_skip_issuer_check | bool | oidc_skip_issuer_check |
管理配置
参数 | 类型 | 说明 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|---|
allow_ports | string | 允许代理绑定的服务端端口 | 格式为 1000-2000,2001,3000-4000 | ||
max_pool_count | int | 最大连接池大小 | 5 | ||
max_ports_per_client | int | 限制单个客户端最大同时存在的代理数 | 0 | 0 表示没有限制 | |
tls_only | bool | 只接受启用了 TLS 的客户端连接 | false |
第三步:设置开机自启动
将system下的 frps.service
和[email protected]
放到/usr/lib/systemd/system
目录下,具体配置如下
[root@host-cloud system]# cat frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root #执行用户
Restart=on-failure
RestartSec=5s
ExecStart=/home/frp/bin/frps -c /home/frp/conf/frps_full.ini #执行命令+配置文件
[Install]
WantedBy=multi-user.target
=============================================
[root@host-cloud system]# cat [email protected]
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root #执行用户
Restart=on-failure
RestartSec=5s
ExecStart=/home/frp/bin/frps -c /home/frp/conf/frps_full.ini #执行命令+配置文件
[Install]
WantedBy=multi-user.target
复制代码
设置开机启动
[root@host-cloud system]# systemctl daemon-reload
[root@host-cloud ~]# systemctl start frps.service
[root@host-cloud ~]# systemctl enable frps.service
复制代码
配置腾讯云的安全组,打开对应的input 7000、7500端口、outpus 6000端口。
4、客户端服务部署
第一步:安装包
安装包下载并解压缩,从 Github Release 页面下载最新版本。(选择自己合适的版本)
wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz
tar -zxvf frp_0.37.0_linux_amd64.tar.gz
复制代码
云服务器做的是client端,所以可以将 frps相关的全部删除,只保留frpc相关的数据包。
第二部:配置文件
frpc配置文件
[root@host-machine frp]# cat conf/frpc.ini
[common]
server_addr = x.x.x.x #云服务器的IP公网IP
server_port = 7000
log_file = /home/frp/logs/frpc.log #日志地址
log_level = info
log_max_days = 3
token = xxxxxxx #服务端认证的token
admin_addr = 192.168.31.200 #服务器内网IP
admin_port = 7400
admin_user = fong
admin_pwd = qwer1234
pool_count = 5
tcp_mux = true
user = fong
login_fail_exit = true
protocol = tcp
tls_enable = true
[ssh]
type = tcp
local_ip = 192.168.31.200
local_port = 22
remote_port = 6000
复制代码
基础配置
参数 | 类型 | 说明 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|---|
server_addr | string | 连接服务端的地址 | 0.0.0.0 | ||
server_port | int | 连接服务端的端口 | 7000 | ||
http_proxy | string | 连接服务端使用的代理地址 | 格式为 {protocol}://user:[email protected]:8080 protocol 目前支持 http、socks5、ntlm | ||
log_file | string | 日志文件地址 | ./frpc.log | 如果设置为 console,会将日志打印在标准输出中 | |
log_level | string | 日志等级 | info | trace, debug, info, warn, error | |
log_max_days | int | 日志文件保留天数 | 3 | ||
disable_log_color | bool | 禁用标准输出中的日志颜色 | false | ||
pool_count | int | 连接池大小 | 0 | ||
user | string | 用户名 | 设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突 | ||
dns_server | string | 使用 DNS 服务器地址 | 默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址 | ||
login_fail_exit | bool | 第一次登陆失败后是否退出 | true | ||
protocol | string | 连接服务端的通信协议 | tcp | tcp, kcp, websocket | |
tls_enable | bool | 启用 TLS 协议加密连接 | false | ||
tls_cert_file | string | TLS 客户端证书文件路径 | |||
tls_key_file | string | TLS 客户端密钥文件路径 | |||
tls_trusted_ca_file | string | TLS CA 证书路径 | |||
tls_server_name | string | TLS Server 名称 | 为空则使用 server_addr | ||
heartbeat_interval | int | 向服务端发送心跳包的间隔时间 | 30 | ||
heartbeat_timeout | int | 和服务端心跳的超时时间 | 90 | ||
udp_packet_size | int | 代理 UDP 服务时支持的最大包长度 | 1500 | 服务端和客户端的值需要一致 | |
start | string | 指定启用部分代理 | 当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用 |
权限验证
参数 | 类型 | 说明 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|---|
authentication_method | string | 鉴权方式 | token | token, oidc | 需要和服务端一致 |
authenticate_heartbeats | bool | 开启心跳消息鉴权 | false | 需要和服务端一致 | |
authenticate_new_work_conns | bool | 开启建立工作连接的鉴权 | false | 需要和服务端一致 | |
token | string | 鉴权使用的 token 值 | 需要和服务端设置一样的值才能鉴权通过 | ||
oidc_client_id | string | oidc_client_id | |||
oidc_client_secret | string | oidc_client_secret | |||
oidc_audience | string | oidc_audience | |||
oidc_token_endpoint_url | string | oidc_token_endpoint_url |
第三步:开机自启
[root@host-machine systemd]# cat /usr/lib/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/home/frp/bin/frpc -c /home/frp/conf/frpc.ini
ExecReload=/home/frp/bin/frpc reload -c /home/frp/conf/frpc.ini
[Install]
WantedBy=multi-user.target
=======================================================================
[root@host-machine systemd]# cat /usr/lib/systemd/system/[email protected]
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=idle
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/home/frp/bin/frpc -c /home/frp/conf/%i.ini
ExecReload=/home/frp/bin/frpc reload -c /home/frp/conf/%i.ini
[Install]
WantedBy=multi-user.target
复制代码
[root@host-machine ~]# systemctl daemon-reload
[root@host-machine ~]# systemctl start frpc.service
[root@host-machine ~]# systemctl enable frpc.service
复制代码
修改本地的SSH服务,禁止root登陆,只使用密钥登陆。
Port 22 # default port
#AddressFamily any # listen ipv4 and ipv6
ListenAddress 192.168.31.200 # listen ipv4 ipaddress
#ListenAddress :: # listen ipv6 ipaddress
HostKey /etc/ssh/ssh_host_rsa_key # ssh rsa private key dir
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key # ssh ecdsa private key dir
HostKey /etc/ssh/ssh_host_ed25519_key # ssh ED25519 private key dir
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
LogLevel INFO # log level
# Authentication:
LoginGraceTime 2m # user auth max 2min
PermitRootLogin no # allow root account SSH login,(test yes,product no)
StrictModes yes #
MaxAuthTries 4 # maximum number of authentications allowed per connection
MaxSessions 20 # max connection
PubkeyAuthentication yes # public key to verify
AuthorizedKeysFile .ssh/authorized_keys # public key to verify dir
PasswordAuthentication no # Whether password authentication is allowed
复制代码
客户端连接成功后,访问 http://公网IP:7500
5、如何登陆
ssh -oPort=6000 用户@x.x.x.x(公网IP)
复制代码
frp 会将请求 x.x.x.x:6000
的流量转发到内网机器的 22 端口。