mirror of
https://github.com/xVRVx/autoXRAY.git
synced 2026-08-26 00:34:39 +00:00
581 lines
15 KiB
Bash
581 lines
15 KiB
Bash
#!/bin/bash
|
||
[[ $EUID -eq 0 ]] || { echo "❌ скрипту нужны root права"; exit 1; }
|
||
|
||
DOMAIN=$1
|
||
|
||
vless_url=$2
|
||
|
||
if [ -z "$DOMAIN" ]; then
|
||
echo "❌ Ошибка: домен не задан."
|
||
exit 1
|
||
fi
|
||
|
||
if [ -z "$vless_url" ]; then
|
||
echo "❌ Ошибка: конфиг vless не задан."
|
||
exit 1
|
||
fi
|
||
|
||
if [[ "$vless_url" != vless://* ]]; then
|
||
echo "❌ Ошибка: Неверный формат vless-ссылки."
|
||
exit 1
|
||
fi
|
||
|
||
|
||
# Функция URL-декодинга
|
||
urldecode() {
|
||
printf '%b' "${1//%/\\x}"
|
||
}
|
||
url_body="${vless_url#vless://}"
|
||
|
||
node_name_enc="${url_body##*#}"
|
||
node_nameVL="$(urldecode "$node_name_enc")"
|
||
|
||
url_body="${url_body%%#*}"
|
||
|
||
uuidVL="${url_body%@*}"
|
||
host_port_query="${url_body#*@}"
|
||
|
||
addressVL="${host_port_query%%:*}"
|
||
restVL="${host_port_query#*:}"
|
||
portVL="${restVL%%\?*}"
|
||
|
||
query_string="${restVL#*\?}"
|
||
|
||
# Разбор параметров в ассоциативный массив
|
||
declare -A params
|
||
IFS='&' read -ra pairs <<< "$query_string"
|
||
for pair in "${pairs[@]}"; do
|
||
key="${pair%%=*}"
|
||
value="${pair#*=}"
|
||
params["$key"]="$(urldecode "$value")"
|
||
done
|
||
|
||
|
||
# Вывод:
|
||
echo "== Основное =="
|
||
echo "UUID: $uuidVL"
|
||
echo "Address: $addressVL"
|
||
echo "Port: $portVL"
|
||
echo "Node Name: $node_nameVL"
|
||
|
||
echo ""
|
||
echo "== Параметры =="
|
||
TYPE="${params[type]}"; echo "TYPE=$TYPE"
|
||
FP="${params[fp]}"; echo "FP=$FP"
|
||
SNI="${params[sni]}"; echo "SNI=$SNI"
|
||
SPX="${params[spx]}"; echo "SPX=$SPX"
|
||
PBK="${params[pbk]}"; echo "PBK=$PBK"
|
||
SECURITY="${params[security]}"; echo "SECURITY=$SECURITY"
|
||
FLOW="${params[flow]}"; echo "FLOW=$FLOW"
|
||
SID="${params[sid]}"; echo "SID=$SID"
|
||
|
||
|
||
|
||
|
||
echo "Обновление и установка необходимых пакетов..."
|
||
apt update && apt install curl jq dnsutils openssl -y
|
||
|
||
|
||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||
DNS_IP=$(dig +short "$DOMAIN" | grep '^[0-9]')
|
||
|
||
if [ "$LOCAL_IP" != "$DNS_IP" ]; then
|
||
echo "❌ Внимание: IP-адрес ($LOCAL_IP) не совпадает с A-записью $DOMAIN ($DNS_IP)."
|
||
echo "Правильно укажите одну A-запись для вашего домена в ДНС - $LOCAL_IP"
|
||
|
||
read -p "Продолжить на ваш страх и риск? (y/N): " choice
|
||
if [[ ! "$choice" =~ ^[Yy]$ ]]; then
|
||
echo "Выполнение скрипта прервано."
|
||
exit 1
|
||
fi
|
||
echo "Продолжение выполнения скрипта..."
|
||
fi
|
||
|
||
|
||
# Включаем BBR
|
||
bbr=$(sysctl -a | grep net.ipv4.tcp_congestion_control)
|
||
if [ "$bbr" = "net.ipv4.tcp_congestion_control = bbr" ]; then
|
||
echo "BBR уже запущен"
|
||
else
|
||
echo "net.core.default_qdisc=fq" > /etc/sysctl.d/999-autoXRAY.conf
|
||
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/999-autoXRAY.conf
|
||
sysctl --system
|
||
echo "BBR активирован"
|
||
fi
|
||
|
||
cat <<EOF > /etc/security/limits.d/99-autoXRAY.conf
|
||
* soft nofile 65535
|
||
* hard nofile 65535
|
||
root soft nofile 65535
|
||
root hard nofile 65535
|
||
EOF
|
||
ulimit -n 65535
|
||
echo -e "Лимиты применены. Текущий ulimit -n: $(ulimit -n)"
|
||
|
||
apt install nginx -y
|
||
|
||
systemctl enable --now nginx
|
||
|
||
apt install certbot -y
|
||
|
||
certbot certonly --webroot -w /var/www/html -d $DOMAIN -m mail@$DOMAIN --agree-tos --non-interactive --deploy-hook "systemctl reload nginx"
|
||
|
||
CONFIG_PATH="/etc/nginx/sites-available/default"
|
||
|
||
echo "✅ Записываем конфигурацию в $CONFIG_PATH для домена $DOMAIN"
|
||
|
||
|
||
path_subpage=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20)
|
||
|
||
# конфиг nginx
|
||
bash -c "cat > $CONFIG_PATH" <<EOF
|
||
server {
|
||
server_name $DOMAIN;
|
||
listen unix:/dev/shm/nginx.sock ssl http2 proxy_protocol;
|
||
set_real_ip_from unix:;
|
||
real_ip_header proxy_protocol;
|
||
|
||
root /var/www/$DOMAIN;
|
||
index index.php index.html;
|
||
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
|
||
ssl_session_timeout 1d;
|
||
ssl_session_cache shared:MozSSL:10m;
|
||
ssl_session_tickets off;
|
||
|
||
ssl_certificate "/etc/letsencrypt/live/$DOMAIN/fullchain.pem";
|
||
ssl_certificate_key "/etc/letsencrypt/live/$DOMAIN/privkey.pem";
|
||
|
||
location = /${path_subpage}.json {
|
||
add_header profile-title "base64:YXV0b1hSQVk=";
|
||
add_header routing "happ://routing/onadd/eyJOYW1lIjoiYXV0b1hSQVkiLCJHbG9iYWxQcm94eSI6InRydWUiLCJSb3V0ZU9yZGVyIjoiYmxvY2stcHJveHktZGlyZWN0IiwiUmVtb3RlRE5TVHlwZSI6IkRvSCIsIlJlbW90ZUROU0RvbWFpbiI6Imh0dHBzOi8vZG5zLmdvb2dsZS9kbnMtcXVlcnkiLCJSZW1vdGVETlNJUCI6IjguOC40LjQiLCJEb21lc3RpY0ROU1R5cGUiOiJEb0giLCJEb21lc3RpY0ROU0RvbWFpbiI6Imh0dHBzOi8vY2xvdWRmbGFyZS1kbnMuY29tL2Rucy1xdWVyeSIsIkRvbWVzdGljRE5TSVAiOiIxLjEuMS4xIiwiR2VvaXB1cmwiOiJodHRwczovL2dpdGh1Yi5jb20vTG95YWxzb2xkaWVyL3YycmF5LXJ1bGVzLWRhdC9yZWxlYXNlcy9sYXRlc3QvZG93bmxvYWQvZ2VvaXAuZGF0IiwiR2Vvc2l0ZXVybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9Mb3lhbHNvbGRpZXIvdjJyYXktcnVsZXMtZGF0L3JlbGVhc2VzL2xhdGVzdC9kb3dubG9hZC9nZW9zaXRlLmRhdCIsIkxhc3RVcGRhdGVkIjoiMTc3NTIwNjEwOCIsIkRuc0hvc3RzIjp7fSwiRGlyZWN0U2l0ZXMiOlsiZ2Vvc2l0ZTpjYXRlZ29yeS1ydSIsImdlb3NpdGU6cHJpdmF0ZSJdLCJEaXJlY3RJcCI6WyJnZW9pcDpwcml2YXRlIl0sIlByb3h5U2l0ZXMiOltdLCJQcm94eUlwIjpbXSwiQmxvY2tTaXRlcyI6WyJnZW9zaXRlOmNhdGVnb3J5LWFkcyIsImdlb3NpdGU6d2luLXNweSJdLCJCbG9ja0lwIjpbXSwiRG9tYWluU3RyYXRlZ3kiOiJJUElmTm9uTWF0Y2giLCJGYWtlRE5TIjoiZmFsc2UiLCJVc2VDaHVua0ZpbGVzIjoiZmFsc2UifQ";
|
||
|
||
add_header routing-enable 0;
|
||
}
|
||
|
||
location ~ /\.ht {
|
||
deny all;
|
||
}
|
||
}
|
||
|
||
server {
|
||
listen 80;
|
||
server_name $DOMAIN;
|
||
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/html;
|
||
}
|
||
|
||
location / {
|
||
return 301 https://\$host\$request_uri;
|
||
}
|
||
}
|
||
EOF
|
||
|
||
echo "✅ Конфигурация nginx обновлена."
|
||
|
||
systemctl restart nginx
|
||
|
||
|
||
# Создание директории
|
||
WEB_PATH="/var/www/$DOMAIN"
|
||
mkdir -p "$WEB_PATH"
|
||
|
||
# Генерируем сайт маскировку
|
||
bash -c "$(curl -L https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/gen_page2.sh)" -- $WEB_PATH
|
||
|
||
# Установка Xray
|
||
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
|
||
|
||
|
||
# Определяем директорию скрипта
|
||
#SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
|
||
SCRIPT_DIR=/usr/local/etc/xray
|
||
|
||
# Генерируем переменные
|
||
xray_uuid_vrv=$(xray uuid)
|
||
|
||
key_output=$(xray x25519)
|
||
xray_privateKey_vrv=$(echo "$key_output" | awk -F': ' '/PrivateKey/ {print $2}')
|
||
xray_publicKey_vrv=$(echo "$key_output" | awk -F': ' '/Password/ {print $2}')
|
||
|
||
key_mldsa65=$(xray mldsa65)
|
||
seed_mldsa65=$(echo "$key_mldsa65" | awk -F': ' '/Seed/ {print $2}')
|
||
verify_mldsa65=$(echo "$key_mldsa65" | awk -F': ' '/Verify/ {print $2}')
|
||
|
||
xray_shortIds_vrv=$(openssl rand -hex 8)
|
||
|
||
xray_sspasw_vrv=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20)
|
||
|
||
ipserv=$(hostname -I | awk '{print $1}')
|
||
|
||
|
||
|
||
# Экспортируем переменные для envsubst
|
||
export xray_uuid_vrv xray_privateKey_vrv xray_publicKey_vrv xray_shortIds_vrv xray_sspasw_vrv DOMAIN path_subpage WEB_PATH TYPE FP SNI SPX PBK SECURITY FLOW SID uuidVL addressVL portVL
|
||
|
||
# Создаем JSON конфигурацию сервера
|
||
cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json"
|
||
{
|
||
"log": {
|
||
"dnsLog": false,
|
||
"loglevel": "none"
|
||
},
|
||
"dns": {
|
||
"servers": [
|
||
"https+local://8.8.4.4/dns-query",
|
||
"https+local://8.8.8.8/dns-query",
|
||
"https+local://1.1.1.1/dns-query",
|
||
"localhost"
|
||
],
|
||
"queryStrategy": "UseIPv4"
|
||
},
|
||
"inbounds": [
|
||
{
|
||
"tag": "VtcpRself",
|
||
"port": 443,
|
||
"listen": "0.0.0.0",
|
||
"protocol": "vless",
|
||
"settings": {
|
||
"clients": [
|
||
{
|
||
"flow": "xtls-rprx-vision",
|
||
"id": "${xray_uuid_vrv}"
|
||
}
|
||
],
|
||
"decryption": "none"
|
||
},
|
||
"sniffing": {
|
||
"enabled": true,
|
||
"destOverride": [
|
||
"http",
|
||
"tls",
|
||
"quic"
|
||
]
|
||
},
|
||
"streamSettings": {
|
||
"network": "raw",
|
||
"security": "reality",
|
||
"realitySettings": {
|
||
"show": false,
|
||
"xver": 1,
|
||
"target": "/dev/shm/nginx.sock",
|
||
"spiderX": "/",
|
||
"shortIds": [
|
||
"${xray_shortIds_vrv}"
|
||
],
|
||
"privateKey": "${xray_privateKey_vrv}",
|
||
"serverNames": [
|
||
"$DOMAIN"
|
||
],
|
||
"limitFallbackUpload": {
|
||
"afterBytes": 0,
|
||
"bytesPerSec": 65536,
|
||
"burstBytesPerSec": 0
|
||
},
|
||
"limitFallbackDownload": {
|
||
"afterBytes": 5242880,
|
||
"bytesPerSec": 262144,
|
||
"burstBytesPerSec": 2097152
|
||
}
|
||
}
|
||
}
|
||
}
|
||
],
|
||
"outbounds": [
|
||
{
|
||
"tag": "proxy",
|
||
"protocol": "vless",
|
||
"settings": {
|
||
"vnext": [
|
||
{
|
||
"port": ${portVL},
|
||
"users": [
|
||
{
|
||
"id": "$uuidVL",
|
||
"flow": "$FLOW",
|
||
"level": 0,
|
||
"encryption": "none"
|
||
}
|
||
],
|
||
"address": "$addressVL"
|
||
}
|
||
]
|
||
},
|
||
"streamSettings": {
|
||
"network": "raw",
|
||
"security": "$SECURITY",
|
||
"realitySettings": {
|
||
"show": false,
|
||
"fingerprint": "$FP",
|
||
"serverName": "$SNI",
|
||
"password": "$PBK",
|
||
"shortId": "$SID",
|
||
"mldsa65Verify": "",
|
||
"spiderX": "$SPX"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"tag": "direct",
|
||
"protocol": "freedom",
|
||
"settings": {
|
||
"domainStrategy": "ForceIPv4"
|
||
}
|
||
},
|
||
{
|
||
"tag": "block",
|
||
"protocol": "blackhole"
|
||
}
|
||
],
|
||
"routing": {
|
||
"rules": [
|
||
{
|
||
"ip": [
|
||
"geoip:private"
|
||
],
|
||
"outboundTag": "block"
|
||
},
|
||
{
|
||
"protocol": [
|
||
"bittorrent"
|
||
],
|
||
"outboundTag": "block"
|
||
},
|
||
{
|
||
"domain": [
|
||
"geosite:category-ads",
|
||
"geosite:win-spy",
|
||
"geosite:private"
|
||
],
|
||
"outboundTag": "block"
|
||
},
|
||
{
|
||
"domain": [
|
||
"testipv6.net",
|
||
"geosite:apple",
|
||
"geosite:apple-pki",
|
||
"geosite:huawei",
|
||
"geosite:xiaomi",
|
||
"geosite:category-android-app-download",
|
||
"geosite:f-droid",
|
||
"geosite:yandex",
|
||
"geosite:vk",
|
||
"geosite:microsoft",
|
||
"geosite:win-update",
|
||
"geosite:win-extra",
|
||
"geosite:google-play",
|
||
"geosite:steam",
|
||
"geosite:category-ru"
|
||
],
|
||
"outboundTag": "direct"
|
||
},
|
||
{
|
||
"inboundTag": [
|
||
"VtcpRself"
|
||
],
|
||
"outboundTag": "proxy"
|
||
}
|
||
],
|
||
"domainStrategy": "IPIfNonMatch"
|
||
}
|
||
}
|
||
|
||
EOF
|
||
|
||
# Создаем JSON конфигурацию клиента
|
||
cat << 'EOF' | envsubst > "$WEB_PATH/$path_subpage.json"
|
||
[
|
||
{
|
||
"log": {
|
||
"loglevel": "warning"
|
||
},
|
||
"dns": {
|
||
"servers": [
|
||
"https://8.8.4.4/dns-query",
|
||
"https://8.8.8.8/dns-query",
|
||
"https://1.1.1.1/dns-query"
|
||
],
|
||
"queryStrategy": "UseIPv4"
|
||
},
|
||
"routing": {
|
||
"domainStrategy": "IPIfNonMatch",
|
||
"rules": [
|
||
{
|
||
"domain": [
|
||
"geosite:category-ads",
|
||
"geosite:win-spy"
|
||
],
|
||
"outboundTag": "block"
|
||
},
|
||
{
|
||
"protocol": [
|
||
"bittorrent"
|
||
],
|
||
"outboundTag": "direct"
|
||
},
|
||
{
|
||
"domain": [
|
||
"habr.com"
|
||
],
|
||
"outboundTag": "proxy"
|
||
},
|
||
{
|
||
"domain": [
|
||
"geosite:private",
|
||
"geosite:apple",
|
||
"geosite:apple-pki",
|
||
"geosite:huawei",
|
||
"geosite:xiaomi",
|
||
"geosite:category-android-app-download",
|
||
"geosite:f-droid",
|
||
"geosite:yandex",
|
||
"geosite:vk",
|
||
"geosite:microsoft",
|
||
"geosite:win-update",
|
||
"geosite:win-extra",
|
||
"geosite:google-play",
|
||
"geosite:steam",
|
||
"geosite:category-ru"
|
||
],
|
||
"outboundTag": "direct"
|
||
},
|
||
{
|
||
"ip": [
|
||
"geoip:private"
|
||
],
|
||
"outboundTag": "direct"
|
||
}
|
||
]
|
||
},
|
||
"inbounds": [
|
||
{
|
||
"tag": "socks-in",
|
||
"protocol": "socks",
|
||
"listen": "127.0.0.1",
|
||
"port": 10808,
|
||
"settings": {
|
||
"udp": true
|
||
},
|
||
"sniffing": {
|
||
"enabled": true,
|
||
"destOverride": [
|
||
"http",
|
||
"tls",
|
||
"quic"
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"tag": "socks-sb",
|
||
"protocol": "socks",
|
||
"listen": "127.0.0.1",
|
||
"port": 2080,
|
||
"settings": {
|
||
"udp": true
|
||
},
|
||
"sniffing": {
|
||
"enabled": true,
|
||
"destOverride": [
|
||
"http",
|
||
"tls",
|
||
"quic"
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"tag": "http-in",
|
||
"protocol": "http",
|
||
"listen": "127.0.0.1",
|
||
"port": 10809,
|
||
"sniffing": {
|
||
"enabled": true,
|
||
"destOverride": [
|
||
"http",
|
||
"tls",
|
||
"quic"
|
||
]
|
||
}
|
||
}
|
||
],
|
||
"outbounds": [
|
||
{
|
||
"tag": "proxy",
|
||
"protocol": "vless",
|
||
"settings": {
|
||
"vnext": [
|
||
{
|
||
"address": "$DOMAIN",
|
||
"port": 443,
|
||
"users": [
|
||
{
|
||
"id": "${xray_uuid_vrv}",
|
||
"flow": "xtls-rprx-vision",
|
||
"encryption": "none",
|
||
"level": 0
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"streamSettings": {
|
||
"network": "raw",
|
||
"security": "reality",
|
||
"realitySettings": {
|
||
"show": false,
|
||
"fingerprint": "chrome",
|
||
"serverName": "$DOMAIN",
|
||
"password": "${xray_publicKey_vrv}",
|
||
"shortId": "${xray_shortIds_vrv}",
|
||
"mldsa65Verify": "",
|
||
"spiderX": "/"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"tag": "direct",
|
||
"protocol": "freedom"
|
||
},
|
||
{
|
||
"tag": "block",
|
||
"protocol": "blackhole"
|
||
}
|
||
],
|
||
"remarks": "🇪🇺 Bridge RU-EU vlsRAWrtyVISION"
|
||
}
|
||
]
|
||
EOF
|
||
|
||
# Перезапуск Xray
|
||
echo "Перезапуск Xray..."
|
||
systemctl restart xray
|
||
echo -e "Готово!\n"
|
||
|
||
# Формирование ссылок
|
||
subPageLink="https://$DOMAIN/$path_subpage.json"
|
||
|
||
# Формирование ссылок
|
||
link1="vless://${xray_uuid_vrv}@$DOMAIN:443?security=reality&sni=$DOMAIN&fp=chrome&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&type=tcp&flow=xtls-rprx-vision&encryption=none&spx=%2F#vlessAXbrEU"
|
||
|
||
echo -e "
|
||
Скопируйте подписку в специализированное приложение:
|
||
- iOS: Happ или v2RayTun или v2rayN
|
||
- Android: Happ или v2RayTun или v2rayNG
|
||
- Windows: конфиги winLoadXRAY или v2rayN или ядро Xray
|
||
для vless Happ(alpha) или v2RayTun или Throne
|
||
|
||
|
||
Ваша страничка подписки:
|
||
\033[32m$subPageLink\033[0m
|
||
|
||
Ваш конфиг для роутера:
|
||
$link1
|
||
|
||
Открыт локальный socks5 на порту 10808, 1080, 2080 и http на 10809.
|
||
|
||
Поддержать автора: https://github.com/xVRVx/autoXRAY
|
||
"
|