From eef05dc8773425fa203fe67c9a56b23d6eafa9bf Mon Sep 17 00:00:00 2001 From: xrgzs Date: Thu, 19 Dec 2024 09:42:42 +0800 Subject: [PATCH] Add frp-ssh --- apps/frp-ssh/9.1/data.yml | 78 +++++++++++++ apps/frp-ssh/9.1/docker-compose.yml | 14 +++ apps/frp-ssh/README.md | 166 ++++++++++++++++++++++++++++ apps/frp-ssh/data.yml | 18 +++ apps/frp-ssh/logo.png | Bin 0 -> 3333 bytes 5 files changed, 276 insertions(+) create mode 100644 apps/frp-ssh/9.1/data.yml create mode 100644 apps/frp-ssh/9.1/docker-compose.yml create mode 100644 apps/frp-ssh/README.md create mode 100644 apps/frp-ssh/data.yml create mode 100644 apps/frp-ssh/logo.png diff --git a/apps/frp-ssh/9.1/data.yml b/apps/frp-ssh/9.1/data.yml new file mode 100644 index 000000000000..6ddf31ce6981 --- /dev/null +++ b/apps/frp-ssh/9.1/data.yml @@ -0,0 +1,78 @@ +additionalProperties: + formFields: + - default: 127.0.0.1 + edit: true + envKey: LOCAL_ADDRESS + labelEn: Local Address + labelZh: 本地IP + required: true + type: text + - default: 12345 + edit: true + envKey: LOCAL_PORT + labelEn: Local Port + labelZh: 本地端口 + required: true + type: number + rule: paramPort + - default: 127.0.0.1 + edit: true + envKey: SERVER_ADDRESS + labelEn: Server Address + labelZh: 服务端IP + required: true + type: text + - default: 2200 + edit: true + envKey: SERVER_PORT + labelEn: Server Port + labelZh: 服务端端口 + required: true + type: number + rule: paramPort + - default: tcp + edit: true + envKey: LOCAL_PROTOCOL + labelEn: Protocol + labelZh: 协议 + required: true + type: select + values: + - label: TCP + value: tcp + - label: HTTP + value: http + - label: HTTPS + value: https + - label: TCPMUX + value: tcpmux + - label: STCP + value: stcp + - default: '' + edit: true + envKey: REMOTE_PORT + labelEn: Remote Port + labelZh: 远程端口(留空自动生成) + required: false + type: text + - default: '' + edit: true + envKey: PROXY_NAME + labelEn: Proxy Name + labelZh: 远程名称(留空自动生成) + required: false + type: text + - default: '' + edit: true + envKey: AUTH_USER + labelEn: Auth User + labelZh: 用户名 + required: false + type: text + - default: 'token123456' + edit: true + envKey: AUTH_TOKEN + labelEn: Auth Token + labelZh: 密钥 + required: true + type: text diff --git a/apps/frp-ssh/9.1/docker-compose.yml b/apps/frp-ssh/9.1/docker-compose.yml new file mode 100644 index 000000000000..f4d6834740fd --- /dev/null +++ b/apps/frp-ssh/9.1/docker-compose.yml @@ -0,0 +1,14 @@ +services: + frpc: + image: finalgene/openssh:9.1 + container_name: ${CONTAINER_NAME} + restart: always + network_mode: host + command: > + ssh -R ":80:${LOCAL_ADDRESS}:${LOCAL_PORT}" "v0@${SERVER_ADDRESS}" -p ${SERVER_PORT} ${LOCAL_PROTOCOL} + $([ ${REMOTE_PORT} ] && echo "--remote_port ${REMOTE_PORT}") + $([ ${PROXY_NAME} ] && echo "--proxy_name ${PROXY_NAME}") + $([ ${AUTH_USER} ] && echo "--user ${AUTH_USER}") + --token "${AUTH_TOKEN}" + labels: + createdBy: "Apps" diff --git a/apps/frp-ssh/README.md b/apps/frp-ssh/README.md new file mode 100644 index 000000000000..e4b6e789133b --- /dev/null +++ b/apps/frp-ssh/README.md @@ -0,0 +1,166 @@ +# frp SSH Tunnel Gateway + +*Added in v0.53.0* + +## 概念 + +SSH 支持反向代理能力 [rfc](https://www.rfc-editor.org/rfc/rfc4254#page-16)。 + +frp 支持在 frps 端监听一个 ssh 端口,通过走 ssh -R 协议来完成 TCP 协议代理,该模式下不需要依赖 frpc。 + +SSH 反向隧道代理和通过 frp 代理 SSH 端口是不同的 2 个概念。SSH 反向隧道代理本质上是在你不想使用 frpc 的时候,通过 ssh client 连接 frps 来完成基本的反向代理。 + +## 参数 + +```toml +# frps.toml + +sshTunnelGateway.bindPort = 0 +sshTunnelGateway.privateKeyFile = "" +sshTunnelGateway.autoGenPrivateKeyPath = "" +sshTunnelGateway.authorizedKeysFile = "" +``` + +| Field | Type | Description | Required | +| :--- | :--- | :--- | :--- | +| bindPort| int | frps 监听的 ssh server 端口。| YES | +| privateKeyFile | string | 默认为空。ssh server 使用的私钥文件,为空frps会读取 autoGenPrivateKeyPath 路径下的私钥文件。可复用本地 /home/user/.ssh/id_rsa 文件或自定义路径。| No | +| autoGenPrivateKeyPath | string |默认为 ./.autogen_ssh_key。文件不存在或内容为空,frps会自动生成 RSA 私钥文件内容存入该文件。|No| +| authorizedKeysFile | string |默认为空。空不对ssh客户端进行鉴权认证。不空可实现ssh免密登录认证,可复用本地 /home/user/.ssh/authorized_keys 文件或自定义路径。| No | + +## 基本使用 + +### 服务端 frps + +最简配置 + +```toml +sshTunnelGateway.bindPort = 2200 +``` + +将上述配置放入 frps.toml, 运行 `./frps -c frps.toml`,此时会在 2200 的端口监听,接受 ssh 反向代理的请求。 + +注意: +1. 使用最简配置,会在当前运行目录自动创建一个 `.autogen_ssh_key` 的私钥文件,frps 的 ssh server 会使用到该私钥文件,用来加解密数据。也可以复用本地已有的私钥文件,如 `/home/user/.ssh/id_rsa`。 +2. 最简配置模式下运行的frps,通过 ssh 连接 frps 是不鉴权的,强烈建议 frps 配置 token,在 ssh 命令行指定 token。 + +### 客户端 ssh + +命令格式为 + +```bash +ssh -R :80:{local_ip:port} v0@{frps address} -p {frps ssh listen port} {tcp|http|https|stcp|tcpmux} --remote_port {real remote port} --proxy_name {proxy_name} --token {frp token} + +``` + +1. `--proxy_name` 非必填,为空会随机生成一个。 +2. 登录 frps 的用户名统一为 v0,目前没有任何含义,即 `v0@{frps address}`。 +3. server 端的 proxy 监听的端口由 `--remote_port` 决定。 +4. `{tcp|http|https|stcp|tcpmux}` 支持的完整命令参数可通过 --help 获取。 如: `ssh -R :80::8080 v0@127.0.0.1 -p 2200 http --help` +5. token 非必填,为了安全强烈建议在frps配置上token。 + +#### TCP 代理 + +```bash +ssh -R :80:127.0.0.1:8080 v0@{frp address} -p 2200 tcp --proxy_name "test-tcp" --remote_port 9090 +``` + +在 frps 启动一个 9090 的端口代理本地的 8080 服务。 + +```bash +frp (via SSH) (Ctrl+C to quit) + +User: +ProxyName: test-tcp +Type: tcp +RemoteAddress: :9090 +``` + +等同于: + +```bash +frpc tcp --proxy_name "test-tcp" --local_ip 127.0.0.1 --local_port 8080 --remote_port 9090 +``` + +更多参数可执行 --help 获取。 + +#### HTTP 代理 + +```bash +ssh -R :80:127.0.0.1:8080 v0@{frp address} -p 2200 http --proxy_name "test-http" --custom_domain test-http.frps.com +``` + +等同于 + +```bash +frpc http --proxy_name "test-http" --custom_domain test-http.frps.com +``` + +可以通过以下命令访问 http 服务: + +`curl 'http://test-http.frps.com'` + +更多参数可执行 `--help` 获取。 + +#### HTTPS/STCP/TCPMUX 代理 + +通过如下命令获取使用方式: + +`ssh -R :80:127.0.0.1:8080 v0@{frp address} -p 2200 {https|stcp|tcpmux} --help` + +## 高级使用 + +### 复用本机的 id_rsa 文件 + +```toml +# frps.toml + +sshTunnelGateway.bindPort = 2200 +sshTunnelGateway.privateKeyFile = "/home/user/.ssh/id_rsa" +``` + +ssh 协议握手阶段需要交换公钥用来加密数据,所以 frps 端的 ssh server 需要指定一个私钥文件,可以复用本机已存在的;如果为空,frps会自动创建一个 rsa 私钥文件。 + +### 指定自动生成私钥文件地址 + +```toml +# frps.toml + +sshTunnelGateway.bindPort = 2200 +sshTunnelGateway.autoGenPrivateKeyPath = "/var/frp/ssh-private-key-file" +``` + +frps自动创建私钥文件并指定路径存储。 + +注意:frps 更换私钥文件,会导致 ssh 客户端登录失败,如果需要成功登录,可以删除 `/home/user/.ssh/known_hosts` 文件中的旧的记录。 + + +### 使用本机已存在的 authorized_keys 文件,实现 ssh 免密登录鉴权 + +```toml +# frps.toml + +sshTunnelGateway.bindPort = 2200 +sshTunnelGateway.authorizedKeysFile = "/home/user/.ssh/authorized_keys" +``` + +authorizedKeysFile 是 ssh 免密登录使用的文件,存放用户公钥信息,一行一个。 + +authorizedKeysFile 为空, frps 不对 ssh 客户端进行任何认证。frps 不支持 ssh 用户名+密码模式认证。 + +可复用本机已有的 `authorized_keys` 文件对客户端进行认证。 + +注意:authorizedKeysFile 是 ssh 登录阶段的用户认证,token 是 frps 已有的认证,2 者没有关联,ssh 认证在前,frps 认证 token 在后,强烈建议至少开启1个,如果 authorizedKeysFile 为空,强烈建议 frps 端开启 token 认证,否则有安全风险。 + +### 使用自定义的 authorized_keys 文件,实现 ssh 免密登录鉴权 + +```toml +# frps.toml + +sshTunnelGateway.bindPort = 2200 +sshTunnelGateway.authorizedKeysFile = "/var/frps/custom_authorized_keys_file" +``` + +自定义 `authorized_keys` 文件路径。 + +authorizedKeysFile 文件变动可能会导致 ssh 登录认证失败,可能需要重新将公钥信息放入 authorizedKeysFile。 diff --git a/apps/frp-ssh/data.yml b/apps/frp-ssh/data.yml new file mode 100644 index 000000000000..4cfe835d75f3 --- /dev/null +++ b/apps/frp-ssh/data.yml @@ -0,0 +1,18 @@ +name: frp ssh 客户端 +tags: + - 实用工具 +title: 通过 ssh 协议与 frps 完成反向代理 +description: 通过 ssh 协议与 frps 完成反向代理 +additionalProperties: + key: frp-ssh + name: frp ssh 客户端 + tags: + - Tool + shortDescZh: 通过 ssh 协议与 frps 完成反向代理 + shortDescEn: using ssh protocol with frps + type: tool + crossVersionUpdate: true + limit: 0 + website: https://github.com/fatedier/frp + github: https://github.com/fatedier/frp + document: https://github.com/gofrp/frp-doc/blob/master/content/zh-cn/docs/Features/common/ssh.md diff --git a/apps/frp-ssh/logo.png b/apps/frp-ssh/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..965411f860cc1d6060231161a505b103f1eefa01 GIT binary patch literal 3333 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 P00000NkvXXu0mjfUDiVS literal 0 HcmV?d00001