Compare commits
15 Commits
6053d91091
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 29adab9118 | |||
| 172801ca6a | |||
| 1df2628253 | |||
| d546baa931 | |||
| 9cc1d71803 | |||
| 148a359cbf | |||
| 47a9a90520 | |||
| 6b528a5e78 | |||
| 7e66e8ad41 | |||
| 17e22fb33d | |||
| 2048897e63 | |||
| 464bfd9b77 | |||
| cb51761427 | |||
| b06337813d | |||
| ea5655cd96 |
485
hy2.sh
485
hy2.sh
@@ -3,7 +3,20 @@ set -Eeuo pipefail
|
||||
trap 'echo "[错误] 第 $LINENO 行执行失败:$BASH_COMMAND" >&2' ERR
|
||||
|
||||
CONFIG_FILE="/etc/hysteria/config.yaml"
|
||||
SERVICE_NAME="hysteria-server.service"
|
||||
HYSTERIA_BIN="/usr/local/bin/hysteria"
|
||||
HYSTERIA_WORK_DIR="/var/lib/hysteria"
|
||||
SYSTEMD_SERVICE_NAME="hysteria-server.service"
|
||||
OPENRC_SERVICE_NAME="hysteria-server"
|
||||
OPENRC_SERVICE_FILE="/etc/init.d/${OPENRC_SERVICE_NAME}"
|
||||
OPENRC_LOG_FILE="/var/log/${OPENRC_SERVICE_NAME}.log"
|
||||
SERVICE_NAME="${SYSTEMD_SERVICE_NAME}"
|
||||
DEVICE_USERS=(macminim4 iphone12p ipadmini5 pve_debian other)
|
||||
USERPASS_ENTRIES=()
|
||||
TRAFFIC_STATS_SECRET=""
|
||||
PACKAGE_MANAGER=""
|
||||
INIT_SYSTEM=""
|
||||
OS_ID=""
|
||||
OS_ID_LIKE=""
|
||||
|
||||
red() { printf '\033[31m%s\033[0m\n' "$*"; }
|
||||
green() { printf '\033[32m%s\033[0m\n' "$*"; }
|
||||
@@ -30,6 +43,70 @@ import json
|
||||
PY
|
||||
}
|
||||
|
||||
is_systemd() {
|
||||
[[ "${INIT_SYSTEM}" == "systemd" ]]
|
||||
}
|
||||
|
||||
is_openrc() {
|
||||
[[ "${INIT_SYSTEM}" == "openrc" ]]
|
||||
}
|
||||
|
||||
load_os_release() {
|
||||
if [[ -r /etc/os-release ]]; then
|
||||
OS_ID="$(awk -F= '/^ID=/{gsub(/"/, "", $2); print $2; exit}' /etc/os-release)"
|
||||
OS_ID_LIKE="$(awk -F= '/^ID_LIKE=/{gsub(/"/, "", $2); print $2; exit}' /etc/os-release)"
|
||||
fi
|
||||
}
|
||||
|
||||
platform_label() {
|
||||
printf '%s/%s/%s' "${OS_ID:-unknown}" "${PACKAGE_MANAGER:-unknown}" "${INIT_SYSTEM:-unknown}"
|
||||
}
|
||||
|
||||
detect_platform() {
|
||||
load_os_release
|
||||
|
||||
if command -v apk >/dev/null 2>&1 || [[ "${OS_ID}" == "alpine" ]] || [[ " ${OS_ID_LIKE} " == *" alpine "* ]]; then
|
||||
PACKAGE_MANAGER="apk"
|
||||
INIT_SYSTEM="openrc"
|
||||
SERVICE_NAME="${OPENRC_SERVICE_NAME}"
|
||||
if ! command -v rc-service >/dev/null 2>&1 || ! command -v rc-update >/dev/null 2>&1; then
|
||||
red "检测到 Alpine/apk,但未发现 OpenRC(rc-service/rc-update),无法继续。"
|
||||
exit 1
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
if command -v apt >/dev/null 2>&1; then
|
||||
PACKAGE_MANAGER="apt"
|
||||
INIT_SYSTEM="systemd"
|
||||
SERVICE_NAME="${SYSTEMD_SERVICE_NAME}"
|
||||
if ! command -v systemctl >/dev/null 2>&1; then
|
||||
red "检测到 APT 环境,但未发现 systemctl,当前脚本暂不支持该初始化系统。"
|
||||
exit 1
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
red "当前仅支持 Debian/Ubuntu(apt + systemd)和 Alpine(apk + OpenRC)。"
|
||||
exit 1
|
||||
}
|
||||
|
||||
detect_hysteria_arch() {
|
||||
case "$(uname -m)" in
|
||||
x86_64|amd64) echo "amd64" ;;
|
||||
i386|i686) echo "386" ;;
|
||||
armv5*|arm5*) echo "armv5" ;;
|
||||
armv6*|armv7*|arm) echo "arm" ;;
|
||||
aarch64|arm64) echo "arm64" ;;
|
||||
s390x) echo "s390x" ;;
|
||||
mips64le|mipsle|mips) echo "mipsle" ;;
|
||||
riscv64) echo "riscv64" ;;
|
||||
*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
random_subdomain_prefix() {
|
||||
openssl rand -hex 8 | cut -c1-8
|
||||
}
|
||||
@@ -89,8 +166,16 @@ wait_for_apt_lock() {
|
||||
}
|
||||
|
||||
generate_password() {
|
||||
openssl rand -base64 24 | tr -dc 'A-Za-z0-9' | head -c 24
|
||||
echo
|
||||
local length="${1:-36}"
|
||||
local password=""
|
||||
|
||||
while ((${#password} < length)); do
|
||||
password+="$(
|
||||
openssl rand -base64 48 | tr -dc 'A-Za-z0-9'
|
||||
)"
|
||||
done
|
||||
|
||||
printf '%s\n' "${password:0:length}"
|
||||
}
|
||||
|
||||
mask_secret() {
|
||||
@@ -103,6 +188,13 @@ mask_secret() {
|
||||
fi
|
||||
}
|
||||
|
||||
yaml_quote() {
|
||||
local value="$1"
|
||||
value="${value//\\/\\\\}"
|
||||
value="${value//\"/\\\"}"
|
||||
printf '"%s"' "$value"
|
||||
}
|
||||
|
||||
validate_domain() {
|
||||
local domain="$1"
|
||||
[[ -n "$domain" ]] || return 1
|
||||
@@ -119,7 +211,7 @@ get_server_ip() {
|
||||
}
|
||||
|
||||
apt_update_and_install_base() {
|
||||
if ! confirm_yn "即将执行 apt update 并安装基础依赖 curl sed ufw openssl python3,是否继续?"; then
|
||||
if ! confirm_yn "即将执行 apt update 并安装基础依赖 curl sed ufw openssl python3 ca-certificates,是否继续?"; then
|
||||
red "已取消。"
|
||||
exit 1
|
||||
fi
|
||||
@@ -132,7 +224,65 @@ apt_update_and_install_base() {
|
||||
|
||||
blue "==> 安装基础依赖"
|
||||
wait_for_apt_lock 300 || { red "APT 被占用,无法继续。"; exit 1; }
|
||||
apt install -y curl sed ufw openssl python3
|
||||
apt install -y curl sed ufw openssl python3 ca-certificates
|
||||
}
|
||||
|
||||
apk_update_and_install_base() {
|
||||
if ! confirm_yn "即将执行 apk update 并安装基础依赖 bash curl sed ufw ufw-openrc openssl python3 iptables ca-certificates,是否继续?"; then
|
||||
red "已取消。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
blue "==> 更新 APK 软件索引"
|
||||
apk update
|
||||
|
||||
blue "==> 安装基础依赖"
|
||||
apk add --no-cache bash curl sed ufw ufw-openrc openssl python3 iptables ca-certificates
|
||||
}
|
||||
|
||||
install_base_dependencies() {
|
||||
case "${PACKAGE_MANAGER}" in
|
||||
apt) apt_update_and_install_base ;;
|
||||
apk) apk_update_and_install_base ;;
|
||||
*)
|
||||
red "未知包管理器:${PACKAGE_MANAGER}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
service_exists() {
|
||||
local service="$1"
|
||||
|
||||
if is_systemd; then
|
||||
systemctl list-unit-files 2>/dev/null | grep -Eq "^${service}(\\.service)?"
|
||||
return $?
|
||||
fi
|
||||
|
||||
if is_openrc; then
|
||||
[[ -x "/etc/init.d/${service}" ]]
|
||||
return $?
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
stop_and_disable_service() {
|
||||
local service="$1"
|
||||
|
||||
if is_systemd; then
|
||||
systemctl stop "${service}" || true
|
||||
systemctl disable "${service}" || true
|
||||
return 0
|
||||
fi
|
||||
|
||||
if is_openrc; then
|
||||
rc-service "${service}" stop || true
|
||||
rc-update del "${service}" default || true
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
disable_existing_firewalls() {
|
||||
@@ -147,19 +297,22 @@ disable_existing_firewalls() {
|
||||
yellow "检测到 UFW,正在关闭并重置"
|
||||
ufw disable || true
|
||||
yes | ufw reset || true
|
||||
if is_openrc && service_exists ufw; then
|
||||
rc-service ufw stop || true
|
||||
fi
|
||||
fi
|
||||
|
||||
if systemctl list-unit-files 2>/dev/null | grep -q '^firewalld\.service'; then
|
||||
if service_exists firewalld; then
|
||||
yellow "检测到 firewalld,正在停止并禁用"
|
||||
systemctl stop firewalld || true
|
||||
systemctl disable firewalld || true
|
||||
systemctl mask firewalld || true
|
||||
stop_and_disable_service firewalld || true
|
||||
if is_systemd; then
|
||||
systemctl mask firewalld || true
|
||||
fi
|
||||
fi
|
||||
|
||||
if systemctl list-unit-files 2>/dev/null | grep -q '^nftables\.service'; then
|
||||
if service_exists nftables; then
|
||||
yellow "检测到 nftables,正在停止并禁用"
|
||||
systemctl stop nftables || true
|
||||
systemctl disable nftables || true
|
||||
stop_and_disable_service nftables || true
|
||||
fi
|
||||
|
||||
if command -v nft >/dev/null 2>&1; then
|
||||
@@ -216,9 +369,62 @@ configure_ufw() {
|
||||
ufw allow 443/udp || true
|
||||
yes | ufw enable || true
|
||||
|
||||
if is_openrc && service_exists ufw; then
|
||||
rc-update add ufw default || true
|
||||
rc-service ufw restart || rc-service ufw start || true
|
||||
fi
|
||||
|
||||
green "UFW 配置完成。"
|
||||
}
|
||||
|
||||
write_openrc_service_file() {
|
||||
mkdir -p "${HYSTERIA_WORK_DIR}"
|
||||
|
||||
cat > "${OPENRC_SERVICE_FILE}" <<EOF
|
||||
#!/sbin/openrc-run
|
||||
|
||||
description="Hysteria 2 server"
|
||||
command="${HYSTERIA_BIN}"
|
||||
command_args="server -c ${CONFIG_FILE}"
|
||||
command_background="yes"
|
||||
pidfile="/run/\${RC_SVCNAME}.pid"
|
||||
start_stop_daemon_args="--chdir ${HYSTERIA_WORK_DIR} --stdout ${OPENRC_LOG_FILE} --stderr ${OPENRC_LOG_FILE}"
|
||||
|
||||
depend() {
|
||||
need net
|
||||
use dns logger firewall
|
||||
}
|
||||
|
||||
start_pre() {
|
||||
checkpath --directory --owner root:root --mode 0755 ${HYSTERIA_WORK_DIR}
|
||||
checkpath --file --owner root:root --mode 0644 ${OPENRC_LOG_FILE}
|
||||
}
|
||||
EOF
|
||||
|
||||
chmod 755 "${OPENRC_SERVICE_FILE}"
|
||||
}
|
||||
|
||||
install_hysteria2_alpine() {
|
||||
local arch download_url tmp_bin
|
||||
|
||||
arch="$(detect_hysteria_arch)" || {
|
||||
red "当前架构 $(uname -m) 暂无对应的 Alpine 安装分支。"
|
||||
exit 1
|
||||
}
|
||||
|
||||
download_url="https://github.com/apernet/hysteria/releases/latest/download/hysteria-linux-${arch}"
|
||||
tmp_bin="$(mktemp)"
|
||||
|
||||
blue "==> 下载 Hysteria 2 二进制 (${arch})"
|
||||
curl -fsSL "${download_url}" -o "${tmp_bin}"
|
||||
|
||||
blue "==> 安装 Hysteria 2 二进制"
|
||||
install -m 755 "${tmp_bin}" "${HYSTERIA_BIN}"
|
||||
rm -f "${tmp_bin}"
|
||||
|
||||
write_openrc_service_file
|
||||
}
|
||||
|
||||
install_hysteria2() {
|
||||
if ! confirm_yn "即将安装 Hysteria 2,是否继续?"; then
|
||||
red "已取消 Hysteria 2 安装。"
|
||||
@@ -226,7 +432,13 @@ install_hysteria2() {
|
||||
fi
|
||||
|
||||
blue "==> 安装 Hysteria 2"
|
||||
bash <(curl -fsSL https://get.hy2.sh/)
|
||||
|
||||
if is_openrc; then
|
||||
install_hysteria2_alpine
|
||||
else
|
||||
bash <(curl -fsSL https://get.hy2.sh/)
|
||||
fi
|
||||
|
||||
green "Hysteria 2 安装完成。"
|
||||
}
|
||||
|
||||
@@ -369,12 +581,103 @@ backup_existing_config() {
|
||||
fi
|
||||
}
|
||||
|
||||
write_config() {
|
||||
set_config_permissions() {
|
||||
local service_user service_group
|
||||
|
||||
if is_openrc; then
|
||||
chown root:root "${CONFIG_FILE}"
|
||||
chmod 600 "${CONFIG_FILE}"
|
||||
green "已按 OpenRC 服务配置将配置文件权限设置为 root:root 600"
|
||||
return 0
|
||||
fi
|
||||
|
||||
service_user="$(systemctl show -p User --value "${SERVICE_NAME}" 2>/dev/null || true)"
|
||||
service_user="${service_user//$'\n'/}"
|
||||
|
||||
if [[ -n "${service_user}" && "${service_user}" != "root" ]]; then
|
||||
service_group="$(id -gn "${service_user}" 2>/dev/null || true)"
|
||||
if [[ -n "${service_group}" ]]; then
|
||||
chown root:"${service_group}" "${CONFIG_FILE}"
|
||||
chmod 640 "${CONFIG_FILE}"
|
||||
green "已按服务账户 ${service_user}:${service_group} 设置配置文件权限为 640"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
chown root:root "${CONFIG_FILE}"
|
||||
chmod 644 "${CONFIG_FILE}"
|
||||
yellow "未识别到可用的服务账户组,已回退为 root:root 且权限 644"
|
||||
}
|
||||
|
||||
render_userpass_block() {
|
||||
local indent="${1:-4}"
|
||||
local prefix="" entry username password
|
||||
|
||||
prefix="$(printf '%*s' "${indent}" '')"
|
||||
for entry in "${USERPASS_ENTRIES[@]}"; do
|
||||
username="${entry%%:*}"
|
||||
password="${entry#*:}"
|
||||
printf '%s%s: %s\n' "${prefix}" "${username}" "$(yaml_quote "$password")"
|
||||
done
|
||||
}
|
||||
|
||||
render_config() {
|
||||
local domain="$1"
|
||||
local email="$2"
|
||||
local cf_token="$3"
|
||||
local password="$4"
|
||||
local proxy_url="$5"
|
||||
local proxy_url="$4"
|
||||
|
||||
cat <<EOF
|
||||
listen: :443
|
||||
|
||||
acme:
|
||||
domains:
|
||||
- $(yaml_quote "$domain")
|
||||
email: $(yaml_quote "$email")
|
||||
type: dns
|
||||
dns:
|
||||
name: cloudflare
|
||||
config:
|
||||
cloudflare_api_token: $(yaml_quote "$cf_token")
|
||||
|
||||
auth:
|
||||
type: userpass
|
||||
userpass:
|
||||
EOF
|
||||
render_userpass_block 4
|
||||
cat <<EOF
|
||||
|
||||
trafficStats:
|
||||
listen: 127.0.0.1:9999
|
||||
secret: $(yaml_quote "$TRAFFIC_STATS_SECRET")
|
||||
|
||||
disableUDP: false
|
||||
udpIdleTimeout: 90s
|
||||
|
||||
resolver:
|
||||
type: https
|
||||
https:
|
||||
addr: 1.1.1.1:443
|
||||
timeout: 10s
|
||||
sni: cloudflare-dns.com
|
||||
insecure: false
|
||||
|
||||
speedTest: true
|
||||
|
||||
masquerade:
|
||||
type: proxy
|
||||
proxy:
|
||||
url: $(yaml_quote "$proxy_url")
|
||||
rewriteHost: true
|
||||
insecure: false
|
||||
EOF
|
||||
}
|
||||
|
||||
render_preview_config() {
|
||||
local domain="$1"
|
||||
local email="$2"
|
||||
local cf_token="$3"
|
||||
local proxy_url="$4"
|
||||
local masked_token
|
||||
|
||||
if ! validate_domain "$domain"; then
|
||||
@@ -383,32 +686,23 @@ write_config() {
|
||||
fi
|
||||
|
||||
masked_token="$(mask_secret "$cf_token")"
|
||||
render_config "$domain" "$email" "$masked_token" "$proxy_url"
|
||||
}
|
||||
|
||||
write_config() {
|
||||
local domain="$1"
|
||||
local email="$2"
|
||||
local cf_token="$3"
|
||||
local proxy_url="$4"
|
||||
|
||||
if ! validate_domain "$domain"; then
|
||||
red "域名无效,拒绝写入配置:${domain@Q}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
blue "==> 即将写入如下配置到 ${CONFIG_FILE}"
|
||||
cat <<EOF
|
||||
listen: :443
|
||||
|
||||
acme:
|
||||
domains:
|
||||
- ${domain}
|
||||
email: ${email}
|
||||
type: dns
|
||||
dns:
|
||||
name: cloudflare
|
||||
config:
|
||||
cloudflare_api_token: ${masked_token}
|
||||
|
||||
auth:
|
||||
type: password
|
||||
password: ${password}
|
||||
|
||||
masquerade:
|
||||
type: proxy
|
||||
proxy:
|
||||
url: ${proxy_url}
|
||||
rewriteHost: true
|
||||
EOF
|
||||
render_preview_config "$domain" "$email" "$cf_token" "$proxy_url"
|
||||
echo
|
||||
|
||||
if ! confirm_yn "是否确认写入配置文件?"; then
|
||||
@@ -419,32 +713,9 @@ EOF
|
||||
mkdir -p /etc/hysteria
|
||||
backup_existing_config
|
||||
|
||||
cat > "${CONFIG_FILE}" <<EOF
|
||||
listen: :443
|
||||
render_config "$domain" "$email" "$cf_token" "$proxy_url" > "${CONFIG_FILE}"
|
||||
|
||||
acme:
|
||||
domains:
|
||||
- ${domain}
|
||||
email: ${email}
|
||||
type: dns
|
||||
dns:
|
||||
name: cloudflare
|
||||
config:
|
||||
cloudflare_api_token: ${cf_token}
|
||||
|
||||
auth:
|
||||
type: password
|
||||
password: ${password}
|
||||
|
||||
masquerade:
|
||||
type: proxy
|
||||
proxy:
|
||||
url: ${proxy_url}
|
||||
rewriteHost: true
|
||||
EOF
|
||||
|
||||
chown root:root "${CONFIG_FILE}"
|
||||
chmod 644 "${CONFIG_FILE}"
|
||||
set_config_permissions
|
||||
green "配置已写入 ${CONFIG_FILE}"
|
||||
}
|
||||
|
||||
@@ -455,61 +726,103 @@ start_service() {
|
||||
fi
|
||||
|
||||
blue "==> 启动并设置开机自启"
|
||||
systemctl daemon-reload || true
|
||||
systemctl enable --now "${SERVICE_NAME}"
|
||||
systemctl restart "${SERVICE_NAME}"
|
||||
if is_systemd; then
|
||||
systemctl daemon-reload || true
|
||||
systemctl enable --now "${SERVICE_NAME}"
|
||||
systemctl restart "${SERVICE_NAME}"
|
||||
else
|
||||
rc-update add "${SERVICE_NAME}" default || true
|
||||
rc-service "${SERVICE_NAME}" restart || rc-service "${SERVICE_NAME}" start
|
||||
fi
|
||||
green "服务已启动。"
|
||||
}
|
||||
|
||||
show_service_status() {
|
||||
if is_systemd; then
|
||||
systemctl --no-pager --full status "${SERVICE_NAME}" || true
|
||||
else
|
||||
rc-service "${SERVICE_NAME}" status || true
|
||||
pgrep -af "${HYSTERIA_BIN##*/}" || true
|
||||
fi
|
||||
}
|
||||
|
||||
show_recent_logs() {
|
||||
if is_systemd; then
|
||||
journalctl --no-pager -n 30 -u "${SERVICE_NAME}" || true
|
||||
else
|
||||
if [[ -f "${OPENRC_LOG_FILE}" ]]; then
|
||||
tail -n 30 "${OPENRC_LOG_FILE}" || true
|
||||
else
|
||||
yellow "暂未找到 OpenRC 日志文件:${OPENRC_LOG_FILE}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
show_result() {
|
||||
local domain="$1"
|
||||
local password="$2"
|
||||
local proxy_url="$3"
|
||||
local ip_info="$4"
|
||||
local proxy_url="$2"
|
||||
local ip_info="$3"
|
||||
local ipv4="${ip_info%%|*}"
|
||||
local ipv6="${ip_info##*|}"
|
||||
|
||||
local share_link="hysteria2://${password}@${domain}:443/?sni=${domain}&insecure=0"
|
||||
local entry username password
|
||||
|
||||
echo
|
||||
green "================= HY2 节点信息 ================="
|
||||
echo "域名: ${domain}"
|
||||
echo "端口: 443"
|
||||
echo "密码: ${password}"
|
||||
echo "认证方式: userpass"
|
||||
echo "服务管理器: ${INIT_SYSTEM}"
|
||||
echo "伪装站点: ${proxy_url}"
|
||||
echo "流量统计监听: 127.0.0.1:9999"
|
||||
echo "流量统计密钥: ${TRAFFIC_STATS_SECRET}"
|
||||
[[ -n "${ipv4}" ]] && echo "IPv4: ${ipv4}"
|
||||
[[ -n "${ipv6}" ]] && echo "IPv6: ${ipv6}"
|
||||
echo
|
||||
echo "代理链接:"
|
||||
echo "${share_link}"
|
||||
echo "客户端连接参数:"
|
||||
echo " server: ${domain}:443"
|
||||
echo " sni: ${domain}"
|
||||
echo " auth: userpass"
|
||||
echo
|
||||
echo "设备账号:"
|
||||
for entry in "${USERPASS_ENTRIES[@]}"; do
|
||||
username="${entry%%:*}"
|
||||
password="${entry#*:}"
|
||||
echo " ${username}: ${password}"
|
||||
done
|
||||
echo
|
||||
echo "hysteria 状态:"
|
||||
systemctl --no-pager --full status "${SERVICE_NAME}" || true
|
||||
show_service_status
|
||||
echo
|
||||
echo "最近日志:"
|
||||
journalctl --no-pager -n 30 -u "${SERVICE_NAME}" || true
|
||||
show_recent_logs
|
||||
echo "================================================"
|
||||
}
|
||||
|
||||
main() {
|
||||
require_root
|
||||
detect_platform
|
||||
|
||||
if ! confirm_yn "本脚本将更新软件源、关闭现有防火墙、配置 UFW、安装并配置 Hysteria 2,是否继续?"; then
|
||||
if ! confirm_yn "本脚本将更新软件源、关闭现有防火墙、配置 UFW、安装并配置 Hysteria 2(检测到: $(platform_label)),是否继续?"; then
|
||||
red "用户取消执行。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
apt_update_and_install_base
|
||||
install_base_dependencies
|
||||
|
||||
require_cmd curl
|
||||
require_cmd sed
|
||||
require_cmd systemctl
|
||||
require_cmd ufw
|
||||
require_cmd openssl
|
||||
require_cmd python3
|
||||
if is_systemd; then
|
||||
require_cmd systemctl
|
||||
else
|
||||
require_cmd rc-service
|
||||
require_cmd rc-update
|
||||
fi
|
||||
require_python3_json || { red "python3 缺少 json 模块,无法解析 Cloudflare API 返回值。"; exit 1; }
|
||||
|
||||
local email zone subdomain proxy_url password ip_info ipv4 ipv6 domain
|
||||
local email zone subdomain default_subdomain proxy_url ip_info ipv4 ipv6 domain username
|
||||
|
||||
email="$(prompt_nonempty '请输入 ACME 邮箱: ')"
|
||||
zone="$(prompt_nonempty '请输入 Cloudflare Zone(例如 example.com): ')"
|
||||
@@ -522,7 +835,11 @@ main() {
|
||||
CF_API_TOKEN="$(prompt_nonempty '请输入 Cloudflare API Token: ')"
|
||||
export CF_API_TOKEN
|
||||
|
||||
password="$(generate_password)"
|
||||
USERPASS_ENTRIES=()
|
||||
for username in "${DEVICE_USERS[@]}"; do
|
||||
USERPASS_ENTRIES+=("${username}:$(generate_password 36)")
|
||||
done
|
||||
TRAFFIC_STATS_SECRET="$(generate_password 36)"
|
||||
|
||||
ip_info="$(get_server_ip)"
|
||||
ipv4="${ip_info%%|*}"
|
||||
@@ -549,9 +866,9 @@ main() {
|
||||
domain="$(prompt_nonempty '请输入已存在并已解析到本机的完整域名: ')"
|
||||
fi
|
||||
|
||||
write_config "${domain}" "${email}" "${CF_API_TOKEN}" "${password}" "${proxy_url}"
|
||||
write_config "${domain}" "${email}" "${CF_API_TOKEN}" "${proxy_url}"
|
||||
start_service
|
||||
show_result "${domain}" "${password}" "${proxy_url}" "${ip_info}"
|
||||
show_result "${domain}" "${proxy_url}" "${ip_info}"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
529
qilan_us.yaml
Normal file
529
qilan_us.yaml
Normal file
@@ -0,0 +1,529 @@
|
||||
# Qilan System Generated Clash Config
|
||||
# Updated: 2026-04-17 03:03:50 UTC
|
||||
# Total Proxies: 27
|
||||
|
||||
allow-lan: false
|
||||
external-controller: 127.0.0.1:0
|
||||
ipv6: true
|
||||
log-level: silent
|
||||
mixed-port: 7890
|
||||
mode: rule
|
||||
proxies:
|
||||
- cipher: none
|
||||
name: qilan.de | US Node | NAT RES
|
||||
password: 3e96ef7d-8637-42c2-ac73-75182196e755
|
||||
plugin: "v2ray-plugin;mode=websocket;path=3e96ef7d-8637-42c2-ac73-75182196e755/?ed=2560;mux=0;skip-cert-verify=true;host=mfvpn.fuchen.indevs.in;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 154.29.153.213
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 154.29.153.213
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #2'
|
||||
password: 3e96ef7d-8637-42c2-ac73-75182196e755
|
||||
plugin: "v2ray-plugin;mode=websocket;path=3e96ef7d-8637-42c2-ac73-75182196e755/?ed=2560;mux=0;skip-cert-verify=true;host=mfvpn.fuchen.indevs.in;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 45.8.157.80
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 45.8.157.80
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #3'
|
||||
password: 3e96ef7d-8637-42c2-ac73-75182196e755
|
||||
plugin: "v2ray-plugin;mode=websocket;path=3e96ef7d-8637-42c2-ac73-75182196e755/?ed=2560;mux=0;skip-cert-verify=true;host=mfvpn.fuchen.indevs.in;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 50.228.203.26
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 50.228.203.26
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #4'
|
||||
password: 3e96ef7d-8637-42c2-ac73-75182196e755
|
||||
plugin: "v2ray-plugin;mode=websocket;path=3e96ef7d-8637-42c2-ac73-75182196e755/?ed=2560;mux=0;skip-cert-verify=true;host=mfvpn.fuchen.indevs.in;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 173.70.8.178
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 8443
|
||||
server: 173.70.8.178
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #5'
|
||||
password: 3e96ef7d-8637-42c2-ac73-75182196e755
|
||||
plugin: "v2ray-plugin;mode=websocket;path=3e96ef7d-8637-42c2-ac73-75182196e755/?ed=2560;mux=0;skip-cert-verify=true;host=mfvpn.fuchen.indevs.in;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 193.46.217.233
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 8443
|
||||
server: 193.46.217.233
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #6'
|
||||
password: 3e96ef7d-8637-42c2-ac73-75182196e755
|
||||
plugin: "v2ray-plugin;mode=websocket;path=3e96ef7d-8637-42c2-ac73-75182196e755/?ed=2560;mux=0;skip-cert-verify=true;host=mfvpn.fuchen.indevs.in;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 38.143.109.82
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 38.143.109.82
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #7'
|
||||
password: 3e96ef7d-8637-42c2-ac73-75182196e755
|
||||
plugin: "v2ray-plugin;mode=websocket;path=3e96ef7d-8637-42c2-ac73-75182196e755/?ed=2560;mux=0;skip-cert-verify=true;host=mfvpn.fuchen.indevs.in;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 38.248.249.62
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 2053
|
||||
server: 38.248.249.62
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: chacha20-ietf-poly1305
|
||||
name: qilan.de | US 3688320 | RES
|
||||
password: hbGrpfvNrJsUmKmPbR3iY2
|
||||
port: 443
|
||||
server: tinkered-pennies-puppies.freesocks.work
|
||||
type: ss
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #8'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 8443
|
||||
server: 173.70.8.178
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #9'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 8443
|
||||
server: 193.46.217.233
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #10'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 443
|
||||
server: 23.177.185.138
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #11'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 443
|
||||
server: 23.177.185.25
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #12'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 443
|
||||
server: 23.177.185.20
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #13'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 443
|
||||
server: 38.143.109.82
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #14'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 443
|
||||
server: 45.8.157.80
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #15'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 443
|
||||
server: 50.228.203.26
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: 'qilan.de | US Node | NAT RES #16'
|
||||
password: "Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
port: 8443
|
||||
server: 69.143.174.201
|
||||
servername: x1.badmoos.qzz.io
|
||||
skip-cert-verify: true
|
||||
sni: x1.badmoos.qzz.io
|
||||
tls: true
|
||||
type: trojan
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #17'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 173.70.8.178
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 8443
|
||||
server: 173.70.8.178
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #18'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 23.177.185.20
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 23.177.185.20
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #19'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 23.177.185.138
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 23.177.185.138
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #20'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 23.177.185.25
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 23.177.185.25
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #21'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 38.143.109.82
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 38.143.109.82
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #22'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 45.8.157.80
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 45.8.157.80
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #23'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 50.228.203.26
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 443
|
||||
server: 50.228.203.26
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: none
|
||||
name: 'qilan.de | US Node | NAT RES #24'
|
||||
password: 14b02e2a-8930-4afb-8412-ea4a4954ca5b
|
||||
plugin: "v2ray-plugin;mode=websocket;path=14b02e2a-8930-4afb-8412-ea4a4954ca5b/?ed=2560;mux=0;skip-cert-verify=true;host=ylnhh.us.ci;tls;sni=Telegram\U0001F1E8\U0001F1F3 @WangCai2"
|
||||
plugin-opts:
|
||||
host: 69.143.174.201
|
||||
mode: websocket
|
||||
path: ""
|
||||
port: 8443
|
||||
server: 69.143.174.201
|
||||
type: ss
|
||||
udp: true
|
||||
- cipher: chacha20-ietf-poly1305
|
||||
name: qilan.de | US 14000135 | NAT RES
|
||||
password: hbGrpfvNrJsUmKmPbR3iY2
|
||||
port: 443
|
||||
server: 38.135.24.131
|
||||
type: ss
|
||||
udp: true
|
||||
- client-fingerprint: chrome
|
||||
name: qilan.de | US Node | NF YT GM NAT RES
|
||||
password: qQe1z5kU8kN6SlKnDt9Ru3Qp
|
||||
port: 443
|
||||
server: vpn-us-019.fastervpn.world
|
||||
servername: vpn-us-019.fastervpn.world
|
||||
skip-cert-verify: true
|
||||
sni: vpn-us-019.fastervpn.world
|
||||
tls: true
|
||||
type: hysteria2
|
||||
udp: true
|
||||
proxy-groups:
|
||||
- name: "\U0001F680 节点选择"
|
||||
proxies:
|
||||
- ♻️ 自动选择
|
||||
- ⚖️ 负载均衡
|
||||
- "\U0001F52E 故障转移"
|
||||
- qilan.de | US Node | NAT RES
|
||||
- 'qilan.de | US Node | NAT RES #2'
|
||||
- 'qilan.de | US Node | NAT RES #3'
|
||||
- 'qilan.de | US Node | NAT RES #4'
|
||||
- 'qilan.de | US Node | NAT RES #5'
|
||||
- 'qilan.de | US Node | NAT RES #6'
|
||||
- 'qilan.de | US Node | NAT RES #7'
|
||||
- qilan.de | US 3688320 | RES
|
||||
- 'qilan.de | US Node | NAT RES #8'
|
||||
- 'qilan.de | US Node | NAT RES #9'
|
||||
- 'qilan.de | US Node | NAT RES #10'
|
||||
- 'qilan.de | US Node | NAT RES #11'
|
||||
- 'qilan.de | US Node | NAT RES #12'
|
||||
- 'qilan.de | US Node | NAT RES #13'
|
||||
- 'qilan.de | US Node | NAT RES #14'
|
||||
- 'qilan.de | US Node | NAT RES #15'
|
||||
- 'qilan.de | US Node | NAT RES #16'
|
||||
- 'qilan.de | US Node | NAT RES #17'
|
||||
- 'qilan.de | US Node | NAT RES #18'
|
||||
- 'qilan.de | US Node | NAT RES #19'
|
||||
- 'qilan.de | US Node | NAT RES #20'
|
||||
- 'qilan.de | US Node | NAT RES #21'
|
||||
- 'qilan.de | US Node | NAT RES #22'
|
||||
- 'qilan.de | US Node | NAT RES #23'
|
||||
- 'qilan.de | US Node | NAT RES #24'
|
||||
- qilan.de | US 14000135 | NAT RES
|
||||
- qilan.de | US Node | NF YT GM NAT RES
|
||||
type: select
|
||||
- interval: 300
|
||||
name: ♻️ 自动选择
|
||||
proxies:
|
||||
- qilan.de | US Node | NAT RES
|
||||
- 'qilan.de | US Node | NAT RES #2'
|
||||
- 'qilan.de | US Node | NAT RES #3'
|
||||
- 'qilan.de | US Node | NAT RES #4'
|
||||
- 'qilan.de | US Node | NAT RES #5'
|
||||
- 'qilan.de | US Node | NAT RES #6'
|
||||
- 'qilan.de | US Node | NAT RES #7'
|
||||
- qilan.de | US 3688320 | RES
|
||||
- 'qilan.de | US Node | NAT RES #8'
|
||||
- 'qilan.de | US Node | NAT RES #9'
|
||||
- 'qilan.de | US Node | NAT RES #10'
|
||||
- 'qilan.de | US Node | NAT RES #11'
|
||||
- 'qilan.de | US Node | NAT RES #12'
|
||||
- 'qilan.de | US Node | NAT RES #13'
|
||||
- 'qilan.de | US Node | NAT RES #14'
|
||||
- 'qilan.de | US Node | NAT RES #15'
|
||||
- 'qilan.de | US Node | NAT RES #16'
|
||||
- 'qilan.de | US Node | NAT RES #17'
|
||||
- 'qilan.de | US Node | NAT RES #18'
|
||||
- 'qilan.de | US Node | NAT RES #19'
|
||||
- 'qilan.de | US Node | NAT RES #20'
|
||||
- 'qilan.de | US Node | NAT RES #21'
|
||||
- 'qilan.de | US Node | NAT RES #22'
|
||||
- 'qilan.de | US Node | NAT RES #23'
|
||||
- 'qilan.de | US Node | NAT RES #24'
|
||||
- qilan.de | US 14000135 | NAT RES
|
||||
- qilan.de | US Node | NF YT GM NAT RES
|
||||
tolerance: 50
|
||||
type: url-test
|
||||
url: http://www.gstatic.com/generate_204
|
||||
- interval: 300
|
||||
name: ⚖️ 负载均衡
|
||||
proxies:
|
||||
- qilan.de | US Node | NAT RES
|
||||
- 'qilan.de | US Node | NAT RES #2'
|
||||
- 'qilan.de | US Node | NAT RES #3'
|
||||
- 'qilan.de | US Node | NAT RES #4'
|
||||
- 'qilan.de | US Node | NAT RES #5'
|
||||
- 'qilan.de | US Node | NAT RES #6'
|
||||
- 'qilan.de | US Node | NAT RES #7'
|
||||
- qilan.de | US 3688320 | RES
|
||||
- 'qilan.de | US Node | NAT RES #8'
|
||||
- 'qilan.de | US Node | NAT RES #9'
|
||||
- 'qilan.de | US Node | NAT RES #10'
|
||||
- 'qilan.de | US Node | NAT RES #11'
|
||||
- 'qilan.de | US Node | NAT RES #12'
|
||||
- 'qilan.de | US Node | NAT RES #13'
|
||||
- 'qilan.de | US Node | NAT RES #14'
|
||||
- 'qilan.de | US Node | NAT RES #15'
|
||||
- 'qilan.de | US Node | NAT RES #16'
|
||||
- 'qilan.de | US Node | NAT RES #17'
|
||||
- 'qilan.de | US Node | NAT RES #18'
|
||||
- 'qilan.de | US Node | NAT RES #19'
|
||||
- 'qilan.de | US Node | NAT RES #20'
|
||||
- 'qilan.de | US Node | NAT RES #21'
|
||||
- 'qilan.de | US Node | NAT RES #22'
|
||||
- 'qilan.de | US Node | NAT RES #23'
|
||||
- 'qilan.de | US Node | NAT RES #24'
|
||||
- qilan.de | US 14000135 | NAT RES
|
||||
- qilan.de | US Node | NF YT GM NAT RES
|
||||
strategy: consistent-hashing
|
||||
type: load-balance
|
||||
url: http://www.gstatic.com/generate_204
|
||||
- interval: 300
|
||||
name: "\U0001F52E 故障转移"
|
||||
proxies:
|
||||
- qilan.de | US Node | NAT RES
|
||||
- 'qilan.de | US Node | NAT RES #2'
|
||||
- 'qilan.de | US Node | NAT RES #3'
|
||||
- 'qilan.de | US Node | NAT RES #4'
|
||||
- 'qilan.de | US Node | NAT RES #5'
|
||||
- 'qilan.de | US Node | NAT RES #6'
|
||||
- 'qilan.de | US Node | NAT RES #7'
|
||||
- qilan.de | US 3688320 | RES
|
||||
- 'qilan.de | US Node | NAT RES #8'
|
||||
- 'qilan.de | US Node | NAT RES #9'
|
||||
- 'qilan.de | US Node | NAT RES #10'
|
||||
- 'qilan.de | US Node | NAT RES #11'
|
||||
- 'qilan.de | US Node | NAT RES #12'
|
||||
- 'qilan.de | US Node | NAT RES #13'
|
||||
- 'qilan.de | US Node | NAT RES #14'
|
||||
- 'qilan.de | US Node | NAT RES #15'
|
||||
- 'qilan.de | US Node | NAT RES #16'
|
||||
- 'qilan.de | US Node | NAT RES #17'
|
||||
- 'qilan.de | US Node | NAT RES #18'
|
||||
- 'qilan.de | US Node | NAT RES #19'
|
||||
- 'qilan.de | US Node | NAT RES #20'
|
||||
- 'qilan.de | US Node | NAT RES #21'
|
||||
- 'qilan.de | US Node | NAT RES #22'
|
||||
- 'qilan.de | US Node | NAT RES #23'
|
||||
- 'qilan.de | US Node | NAT RES #24'
|
||||
- qilan.de | US 14000135 | NAT RES
|
||||
- qilan.de | US Node | NF YT GM NAT RES
|
||||
type: fallback
|
||||
url: http://www.gstatic.com/generate_204
|
||||
- name: "\U0001F3AC 媒体解锁"
|
||||
proxies:
|
||||
- "\U0001F680 节点选择"
|
||||
- ♻️ 自动选择
|
||||
- qilan.de | US Node | NAT RES
|
||||
- 'qilan.de | US Node | NAT RES #2'
|
||||
- 'qilan.de | US Node | NAT RES #3'
|
||||
- 'qilan.de | US Node | NAT RES #4'
|
||||
- 'qilan.de | US Node | NAT RES #5'
|
||||
- 'qilan.de | US Node | NAT RES #6'
|
||||
- 'qilan.de | US Node | NAT RES #7'
|
||||
- qilan.de | US 3688320 | RES
|
||||
- 'qilan.de | US Node | NAT RES #8'
|
||||
- 'qilan.de | US Node | NAT RES #9'
|
||||
- 'qilan.de | US Node | NAT RES #10'
|
||||
- 'qilan.de | US Node | NAT RES #11'
|
||||
- 'qilan.de | US Node | NAT RES #12'
|
||||
- 'qilan.de | US Node | NAT RES #13'
|
||||
- 'qilan.de | US Node | NAT RES #14'
|
||||
- 'qilan.de | US Node | NAT RES #15'
|
||||
- 'qilan.de | US Node | NAT RES #16'
|
||||
- 'qilan.de | US Node | NAT RES #17'
|
||||
- 'qilan.de | US Node | NAT RES #18'
|
||||
- 'qilan.de | US Node | NAT RES #19'
|
||||
- 'qilan.de | US Node | NAT RES #20'
|
||||
- 'qilan.de | US Node | NAT RES #21'
|
||||
- 'qilan.de | US Node | NAT RES #22'
|
||||
- 'qilan.de | US Node | NAT RES #23'
|
||||
- 'qilan.de | US Node | NAT RES #24'
|
||||
- qilan.de | US 14000135 | NAT RES
|
||||
- qilan.de | US Node | NF YT GM NAT RES
|
||||
type: select
|
||||
- name: "\U0001F916 智能AI"
|
||||
proxies:
|
||||
- "\U0001F680 节点选择"
|
||||
- ♻️ 自动选择
|
||||
- qilan.de | US Node | NAT RES
|
||||
- 'qilan.de | US Node | NAT RES #2'
|
||||
- 'qilan.de | US Node | NAT RES #3'
|
||||
- 'qilan.de | US Node | NAT RES #4'
|
||||
- 'qilan.de | US Node | NAT RES #5'
|
||||
- 'qilan.de | US Node | NAT RES #6'
|
||||
- 'qilan.de | US Node | NAT RES #7'
|
||||
- qilan.de | US 3688320 | RES
|
||||
- 'qilan.de | US Node | NAT RES #8'
|
||||
- 'qilan.de | US Node | NAT RES #9'
|
||||
- 'qilan.de | US Node | NAT RES #10'
|
||||
- 'qilan.de | US Node | NAT RES #11'
|
||||
- 'qilan.de | US Node | NAT RES #12'
|
||||
- 'qilan.de | US Node | NAT RES #13'
|
||||
- 'qilan.de | US Node | NAT RES #14'
|
||||
- 'qilan.de | US Node | NAT RES #15'
|
||||
- 'qilan.de | US Node | NAT RES #16'
|
||||
- 'qilan.de | US Node | NAT RES #17'
|
||||
- 'qilan.de | US Node | NAT RES #18'
|
||||
- 'qilan.de | US Node | NAT RES #19'
|
||||
- 'qilan.de | US Node | NAT RES #20'
|
||||
- 'qilan.de | US Node | NAT RES #21'
|
||||
- 'qilan.de | US Node | NAT RES #22'
|
||||
- 'qilan.de | US Node | NAT RES #23'
|
||||
- 'qilan.de | US Node | NAT RES #24'
|
||||
- qilan.de | US 14000135 | NAT RES
|
||||
- qilan.de | US Node | NF YT GM NAT RES
|
||||
type: select
|
||||
- name: "\U0001F6D1 广告拦截"
|
||||
proxies:
|
||||
- REJECT
|
||||
- DIRECT
|
||||
type: select
|
||||
- name: "\U0001F3AF 全球直连"
|
||||
proxies:
|
||||
- DIRECT
|
||||
- "\U0001F680 节点选择"
|
||||
type: select
|
||||
rules:
|
||||
- "DOMAIN-SUFFIX,google.com,\U0001F680 节点选择"
|
||||
- "DOMAIN-KEYWORD,openai,\U0001F916 智能AI"
|
||||
- "DOMAIN-KEYWORD,anthropic,\U0001F916 智能AI"
|
||||
- "DOMAIN-KEYWORD,netflix,\U0001F3AC 媒体解锁"
|
||||
- "DOMAIN-KEYWORD,disney,\U0001F3AC 媒体解锁"
|
||||
- "GEOIP,CN,\U0001F3AF 全球直连"
|
||||
- "MATCH,\U0001F680 节点选择"
|
||||
Reference in New Issue
Block a user