内网穿透工具FRP部署

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_addrstring服务端监听地址0.0.0.0
bind_portint服务端监听端口7000接收 frpc 的连接
bind_udp_portint服务端监听 UDP 端口0用于辅助创建 P2P 连接
kcp_bind_portint服务端监听 KCP 协议端口0用于接收采用 KCP 连接的 frpc
proxy_bind_addrstring代理监听地址同 bind_addr可以使代理监听在不同的网卡地址
log_filestring日志文件地址./frps.log如果设置为 console,会将日志打印在标准输出中
log_levelstring日志等级infotrace, debug, info, warn, error
log_max_daysint日志文件保留天数3
disable_log_colorbool禁用标准输出中的日志颜色false
detailed_errors_to_clientbool服务端返回详细错误信息给客户端true
heart_beat_timeoutint服务端和客户端心跳连接的超时时间90单位:秒
user_conn_timeoutint用户建立连接后等待客户端响应的超时时间10单位:秒
udp_packet_sizeint代理 UDP 服务时支持的最大包长度1500服务端和客户端的值需要一致
tls_cert_filestringTLS 服务端证书文件路径
tls_key_filestringTLS 服务端密钥文件路径
tls_trusted_ca_filestringTLS CA 证书路径

权限验证

参数类型说明默认值可选值备注
authentication_methodstring鉴权方式tokentoken, oidc
authenticate_heartbeatsbool开启心跳消息鉴权false
authenticate_new_work_connsbool开启建立工作连接的鉴权false
tokenstring鉴权使用的 token 值客户端需要设置一样的值才能鉴权通过
oidc_issuerstringoidc_issuer
oidc_audiencestringoidc_audience
oidc_skip_expiry_checkbooloidc_skip_expiry_check
oidc_skip_issuer_checkbooloidc_skip_issuer_check

管理配置

参数类型说明默认值可选值备注
allow_portsstring允许代理绑定的服务端端口格式为 1000-2000,2001,3000-4000
max_pool_countint最大连接池大小5
max_ports_per_clientint限制单个客户端最大同时存在的代理数00 表示没有限制
tls_onlybool只接受启用了 TLS 的客户端连接false

第三步:设置开机自启动

将system下的 frps.servicefrps@.service放到/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 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]# systemctl daemon-reload
 [root@host-cloud ~]# systemctl start frps.service
 [root@host-cloud ~]# systemctl enable frps.service
复制代码

配置腾讯云的安全组,打开对应的input 7000、7500端口、outpus 6000端口。

访问http://公网IP:7500

413caf20a4c046488eafe8809fca06eetplv-k3u1fbpfcp-zoom-in-crop-mark1304000.awebp_-244

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_addrstring连接服务端的地址0.0.0.0
server_portint连接服务端的端口7000
http_proxystring连接服务端使用的代理地址格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm
log_filestring日志文件地址./frpc.log如果设置为 console,会将日志打印在标准输出中
log_levelstring日志等级infotrace, debug, info, warn, error
log_max_daysint日志文件保留天数3
disable_log_colorbool禁用标准输出中的日志颜色false
pool_countint连接池大小0
userstring用户名设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突
dns_serverstring使用 DNS 服务器地址默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
login_fail_exitbool第一次登陆失败后是否退出true
protocolstring连接服务端的通信协议tcptcp, kcp, websocket
tls_enablebool启用 TLS 协议加密连接false
tls_cert_filestringTLS 客户端证书文件路径
tls_key_filestringTLS 客户端密钥文件路径
tls_trusted_ca_filestringTLS CA 证书路径
tls_server_namestringTLS Server 名称为空则使用 server_addr
heartbeat_intervalint向服务端发送心跳包的间隔时间30
heartbeat_timeoutint和服务端心跳的超时时间90
udp_packet_sizeint代理 UDP 服务时支持的最大包长度1500服务端和客户端的值需要一致
startstring指定启用部分代理当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用

权限验证

参数类型说明默认值可选值备注
authentication_methodstring鉴权方式tokentoken, oidc需要和服务端一致
authenticate_heartbeatsbool开启心跳消息鉴权false需要和服务端一致
authenticate_new_work_connsbool开启建立工作连接的鉴权false需要和服务端一致
tokenstring鉴权使用的 token 值需要和服务端设置一样的值才能鉴权通过
oidc_client_idstringoidc_client_id
oidc_client_secretstringoidc_client_secret
oidc_audiencestringoidc_audience
oidc_token_endpoint_urlstringoidc_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/frpc@.service
 [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 端口。

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容