相关文档
服务端的配置
脚本能力
以下均在 deepin + x86_64 环境下测试
- 配置必备变量后自动下载并部署frp服务端
- 进行服务端的服务注册及自启动相关操作
- 提供服务异常崩溃退出后的自动重连
- 自动清理处理过程中的无用文件
- 部署后提供frp客户端的连接
- 为不同frp客户端传输数据。
- 提供frp服务端对客户端的监控
- 提供frp版本设置,便于固定与修改版本
一键脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
FRP_SERVER_PORT="27000"
FRPS_MONITOR_SERVER_PORT="27500"
FRPS_MONITOR_USER="xxx"
FRPS_MONITOR_PASSWORD="xxxxx"
FRPS_SUB_DOMAIN_HOST="xxx.xxxx.xx"
FRPS_TCPMUX_PORT=21337
mkdir -p /opt/frp cd /opt/frp release_latest_version=$(curl -s "https://github.com/fatedier/frp/releases" | grep 'data-view-component="true" class="Link--primary' -m 1 | sed -r 's:.*tag/(.*?)" data-view-component="true".*:\1:g' | cut -c2-) wget "https://github.com/fatedier/frp/releases/download/v${release_latest_version}/frp_${release_latest_version}_linux_amd64.tar.gz" tar -zxvf "frp_${release_latest_version}_linux_amd64.tar.gz" mv "frp_${release_latest_version}_linux_amd64/frp"* . rm -rf "frp_${release_latest_version}_linux_amd64" rm -rf "frp_${release_latest_version}_linux_amd64.tar.gz"
cat > frps.toml <<EOF bindPort = $FRP_SERVER_PORT webServer.addr = "0.0.0.0" webServer.port = $FRPS_MONITOR_SERVER_PORT webServer.user = "$FRPS_MONITOR_USER" webServer.password = "$FRPS_MONITOR_PASSWORD" subdomainHost="$FRPS_SUB_DOMAIN_HOST" vhostHTTPPort=$FRP_SERVER_PORT tcpmuxHTTPConnectPort=$FRPS_TCPMUX_PORT EOF
cat > /etc/systemd/system/frps.service <<-'EOF' [Unit] Description=frps After=network.target
[Service] Type=simple ExecStart=/opt/frp/frps -c /opt/frp/frps.toml Restart=always RestartSec=10 NoNewPrivileges=yes ProtectSystem=strict
[Install] WantedBy=default.target EOF
systemctl enable frps
systemctl start frps
|
设置后,服务端可以用 http://服务端IP:27500 来访问监控页面。
客户端的配置
脚本能力
以下均在 ubuntu + armv7 环境下测试
- 配置必备变量后自动下载并部署frp客户端
- 自动下载缺失必备命令行工具
- 进行客户端的服务注册及自启动相关操作
- 提供服务异常崩溃退出后的自动重连
- 自动清理处理过程中的无用文件
- 部署后frp客户端可自动连接到服务端(网络通畅的情况下)
- 提供frp客户端的监控查看
- 提供frp版本设置,便于固定与修改版本
- 提供相关环境的预检操作
- 对旧环境中 /etc/rc.local 启动项的清理
- 设置客户端的心跳配置与连接池,以保证客户端实时更新状态与长期可用
一键脚本
可以把脚本在客户端保存为 frpc.sh ,然后 nohup bash frpc.sh & 即可。运行后,脚本会自动被清理掉。
另外这里下载的 frp包 为 armv7 下的版本,其他情况下需根据实际情况修改下自动化脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
| #!/bin/bash
DEVNAME="1122433"
FRP_ROOT_PATH="/opt/frp"
FRP_SERVICE_ROOT_PATH="/etc/systemd/system"
FRP_SERVER_ADDRESS="1.2.3.4"
FRP_SERVER_PORT="27000"
FRPC_MONITOR_USER="xxx"
FRPC_MONITOR_PASSWORD="xxxxx"
function print_log() { echo "[$(date +%Y-%m-%dT%H:%M:%S)] $1" }
function pre_check() { local tools=(jq) for tool in ${tools[*]};do if ! command -v $tool >/dev/null 2>&1; then apt-get install -y jq fi done
if [ ! -f $FRP_ROOT_PATH/frpc ];then print_log "$FRP_ROOT_PATH/frpc 不存在,将自动下载文件" mkdir -p $FRP_ROOT_PATH cd $FRP_ROOT_PATH release_latest_version=$(curl -s "https://github.com/fatedier/frp/releases" | grep 'data-view-component="true" class="Link--primary' -m 1 | sed -r 's:.*tag/(.*?)" data-view-component="true".*:\1:g' | cut -c2-) wget --no-check-certificate "https://github.com/fatedier/frp/releases/download/v${release_latest_version}/frp_${release_latest_version}_linux_arm_hf.tar.gz" tar -zxvf "frp_${release_latest_version}_linux_arm_hf.tar.gz" mv "frp_${release_latest_version}_linux_arm_hf/frpc"* . rm -rf "frp_${release_latest_version}_linux_arm_hf.tar.gz" rm -rf "frp_${release_latest_version}_linux_arm_hf" rm -rf wget-log* cd - fi }
function init_frpc_toml() { if [ -z "${FRP_SERVER_ADDRESS:-}" ];then print_log "FRP_SERVER_ADDRESS(FRP服务端地址)不可为空值" return 1 fi if [ -z "${FRP_SERVER_PORT:-}" ];then print_log "FRP_SERVER_PORT(FRP服务端端口)不可为空值" return 1 fi if [ -z "${FRPC_MONITOR_USER:-}" ];then print_log "FRPC_MONITOR_USER(FRP客户端用户名)不可为空值" return 1 fi if [ -z "${FRPC_MONITOR_PASSWORD:-}" ];then print_log "FRPC_MONITOR_PASSWORD(FRP客户端密码)不可为空值" return 1 fi echo > "$FRP_ROOT_PATH/frpc.toml" tee $FRP_ROOT_PATH/frpc.toml > /dev/null <<EOF serverAddr = "$FRP_SERVER_ADDRESS" serverPort = $FRP_SERVER_PORT transport.heartbeatInterval = 30 transport.heartbeatTimeout = 90 transport.dialServerKeepalive = 60 transport.poolCount = 5 transport.tcpMux = true transport.tcpMuxKeepaliveInterval = 60
webServer.addr = "127.0.0.1" webServer.port = 7500 webServer.user = "$FRPC_MONITOR_USER" webServer.password = "$FRPC_MONITOR_PASSWORD"
[[proxies]] name = "$DEVNAME-monitor" type = "http" localIP = "127.0.0.1" localPort = 7500 transport.useCompression = true subdomain = "$DEVNAME-monitor" [[proxies]] name = "$DEVNAME-ssh" type = "tcpmux" localIP = "127.0.0.1" localPort = 22 multiplexer = "httpconnect" transport.useCompression = true subdomain = "$DEVNAME-ssh" EOF }
function init_frpc_service() { if ! systemctl list-unit-files | grep -q '^frpc\.service'; then tee $FRP_SERVICE_ROOT_PATH/frpc.service > /dev/null <<EOF [Unit] Description = frpc After = network.target syslog.target Wants = network.target
[Service] Type = simple ExecStart = $FRP_ROOT_PATH/frpc -c $FRP_ROOT_PATH/frpc.toml Restart=always RestartSec=60
[Install] WantedBy = multi-user.target EOF chmod 754 $FRP_SERVICE_ROOT_PATH/frpc.service systemctl enable frpc.service print_log "frpc服务已初始化" fi }
function start_frpc() { if $(ps aux | grep -v grep | grep -q './frpc -c') ;then ps aux | grep -v grep | grep './frpc -c' | awk '{print $2;}' | xargs kill -9 > /dev/null 2>&1 fi if systemctl is-active --quiet frpc.service; then systemctl restart frpc.service print_log "frpc已重启,可使用 systemctl status frpc.service 查看当前启动日志" else systemctl start frpc.service print_log "frpc服务已启动" fi }
function delete_useless_files() { local current_directory=$(pwd $(dirname $0)) local current_script_name=$(echo $0) rm -rf $current_directory/$current_script_name rm -rf $current_directory/nohup.out }
function main() { pre_check || exit 1 init_frpc_toml || exit 1 init_frpc_service || exit 1 start_frpc || exit 1 delete_useless_files }
main
|
配置之后,访问http服务可以使用 http://1122433-monitor.xxx.xxxx.xx:27500,即 设备名称 和 服务端子域名 和 服务端的vhostHTTPPort 拼起来即可。
SSH的连接,可以使用如下方式
1 2 3 4 5 6 7
| device_name="1122433-ssh"
ssh -o 'proxycommand socat - PROXY:服务端IP:%h:%p,proxyport=服务端tcpmuxHTTPConnectPort的端口' root@$device_name.xxx.xxxx.xx
|
FRPC的核心配置解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| serverAddr = "1.2.3.4"
serverPort = 27000
transport.heartbeatInterval = -1
transport.heartbeatTimeout = 90
transport.dialServerKeepalive = 60
transport.poolCount = 5
transport.tcpMux = true
transport.tcpMuxKeepaliveInterval = 60
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "xxx"
webServer.password = "xxxxx"
[[proxies]]
name = "1122433-monitor"
type = "http"
localIP = "127.0.0.1"
localPort = 7500
transport.useCompression = true
subdomain = "1122433-monitor"
[[proxies]]
name = "1122433-ssh"
type = "tcpmux"
localIP = "127.0.0.1"
localPort = 22
multiplexer = "httpconnect"
transport.useCompression = true
subdomain = "1122433-ssh"
[[proxies]]
name = "1122433-stream"
type = "tcp"
localIP="192.168.0.1"
localPort=1254
remotePort=1254
transport.useCompression = true
|
后续可尝试
目前只实现了 HTTP 和 SSH 服务的多路复用,如果网页中需要映射另一个服务的 websocket 服务,则无法直接映射,可基于现有情况再分析下如何配置来实现效果。
废弃
简单手动测试部署流程
该部分操作比较简单,可不参考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
mkdir -p ~/software/ cd ~/software/ wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz tar -zxvf frp_0.64.0_linux_amd64.tar.gz rm -rf frp_0.64.0_linux_amd64.tar.gz mv frp_0.64.0_linux_amd64 frp cd frp
./frps -c frps.toml
mkdir -p ~/software/ cd ~/software/ wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_android_arm64.tar.gz tar -zxvf frp_0.64.0_android_arm64.tar.gz rm -rf frp_0.64.0_android_arm64.tar.gz mv frp_0.64.0_android_arm64 frp cd frp
./frpc -c frpc.toml
|