Skip to content

Instantly share code, notes, and snippets.

@QiangZiBro
Last active April 12, 2022 13:53
Show Gist options
  • Save QiangZiBro/806d35bd6526ab92199297f2d47c5f03 to your computer and use it in GitHub Desktop.
Save QiangZiBro/806d35bd6526ab92199297f2d47c5f03 to your computer and use it in GitHub Desktop.
frp安全连接的配置生成脚本
#!/usr/bin/env sh
######################################################################
# @author : QiangZiBro (qiangzibro@gmail.com)
# @created : 星期一 4 11, 2022 15:27:11 CST
#
# @description : Generate safe connection file of frp
######################################################################
name=user # 被穿透机器要登录的用户名
base=9090 # 设定一个端口段为穿透端口
ip=1.1.1.1 # 跳板ip
sk=FuckSafe # 安全ssh的密钥
filename=m # 生成的文件夹名
for i in $@
do
mkdir -p $filename$i
port=$((base+i))
# ssh server_name 序号
printf -v N "%02d" $i
# 连接机配置文件
cat <<- EOF > $filename$i/visit.ini
[common]
server_addr = $ip
server_port = 7000
token = 1234567
[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_sshM$n
sk = $sk
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = $port
EOF
# 连接机脚本文件
cat << EOF > $filename$i/run.sh
#!/bin/bash
echo 接下来:
echo 【1】新开一个终端
echo 【2】"ssh -oPort=$port $name@localhost"
if [[ "\$OSTYPE" == "darwin"* ]]; then
echo "ssh -oPort=$port $name@localhost" | pbcopy
fi
# 使用alacritty终端
if command -v alacritty 2>&1 >/dev/null; then
alacritty &
elif [ -d /Applications/iTerm.app ]; then
open /Applications/iTerm.app
fi
# 本地frpc
http_proxy= && https_proxy= && frpc -c visit.ini
EOF
chmod +x $filename$i/run.sh
# 穿透机配置文件
cat <<- EOF > $filename$i/frpc.ini
[common]
server_addr = $ip
server_port = 7000
token = 1234567
[secret_sshM$N]
type = stcp
sk = $sk
local_ip = 127.0.0.1
local_port = 22
EOF
# 穿透机系统文件
mkdir -p $filename$i/systemd
cat << EOF > $filename$i/systemd/frpc.service
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
ExecReload=/usr/local/frp/frpc reload -c /usr/local/frp/frpc.ini
[Install]
WantedBy=multi-user.target
EOF
done
@QiangZiBro
Copy link
Author

QiangZiBro commented Apr 11, 2022

起因

frp是一款内网穿透工具,可进行ssh/https的内网穿透。直接穿透ssh端口有安全风险,因此采用安全的frp连接是更好的一种方式。

安全的frp连接基本原理是连接机、服务机和穿透机使用一个密钥,你想连接穿透机时,必须在连接机上运行frpc,才能正确连接。这样避免被脚本小子直接扫ssh端口,多一层防范。

但是,需要配置较多的内容,于是编写一个脚本自动生成所有配置。

运行示例

./gen.sh {0..99}

功能解释

以上脚本生成100个目录,每个目录内容如下

.
├── frpc.ini # 穿透机 frpc 配置
├── run.sh # 访问机 frpc 运行脚本
├── systemd # 穿透机 frpc 系统配置
│   └── frpc.service
└── visit.ini # 访问机 frpc 配置

配置包含穿透机和访问机的(本文忽略跳板机的配置部分)。

访问机上,直接运行run.sh脚本,包含一系列工作流:运行frpc加密连接、打开终端、把访问的ssh指令复制到粘贴板上。我们要做的事情就是直接在新终端上粘贴回车,就可以连接。

穿透机上,使用生成的 frpc.ini 进行连接。当然,还可使用 frpc.service 进行开机自启,步骤如下:

sudo cp systemd/frpc.service /lib/systemd/system/
sudo systemctl enable frpc.service # 允许开机自启
sudo systemctl start frpc.service # 运行 frpc
sudo systemctl restart frpc.service # 重启

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment