Всё описанное ниже — результат технического эксперимента. Материал не является рекламой, не призывает к каким-либо действиям, носит исключительно ознакомительный характер и подготовлен в рамках исследования.

Что понадобится:

  • Keenetic с поддержкой USB;
  • накопитель размером от 1Gb;
  • актуальная KeeneticOS и установленная система пакетов репозитория Entware;

Последний пункт хорошо расписан на сайте у Keenetic.

OpenSSH

После того как система поднялась и удалось зайти в cli, можно привести в порядок некоторые элементы. Можно и без этого, если задача только раскрутить Xray, то пропускаем.

  1. Обновиться и установить нужные пакеты
opkg update && opkg install mc ss bash curl ip-full iptables sudo micro
  1. Установить open-ssh, так как по умолчанию dropbear (можно пропустить)
opkg install openssh-server && ssh-keygen -A

Правим конфигурацию

mcedit /opt/etc/ssh/sshd_config

тут кому как нравится, но порт подправить точно надо:

Port 777
AddressFamily inet
ListenAddress 192.168.1.1 
LoginGraceTime 1m
PermitRootLogin yes
X11Forwarding no
MaxAuthTries 2
MaxSessions 2
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 2
MaxStartups 2:50:4
Subsystem sftp internal-sftp
Match group root
AllowTcpForwarding no
PasswordAuthentication yes

Создаем пользователя

adduser -D -H -s /bin/false sshd

Генерируем ключи

ssh-keygen -t rsa -f /opt/etc/ssh/ssh_host_rsa_key -N "" &&
ssh-keygen -t ed25519 -f /opt/etc/ssh/ssh_host_ed25519_key -N ""

Даём права

chmod 600 /opt/etc/ssh/ssh_host_*_key

Рестартуем и проверяем статус

/opt/etc/init.d/S40sshd restart && /opt/etc/init.d/S40sshd status

Перезаходим через ssh c новым портом. Если всё ок, то идем в dashboard keenetic и сносим дефолтный компонент - SSH, а затем сносим dropbear

opkg remove dropbear

Xray

В качестве готового инструмента будет использоваться форк от jameszeroX выложенный на GitHub. Стоит отдельно отметить и выразить благодарность за разработанный инструемент на Shell (Bash).

Как развернуть сервер Xray описывалось в заметке.

Установка Xkeen

opkg update && opkg upgrade && opkg install curl tar && cd /tmp
url="https://raw.githubusercontent.com/jameszeroX/XKeen/main/install.sh"
curl -OL --connect-timeout 10 -m 60 "$url"
chmod +x install.sh
./install.sh

Далее череда вопросов, дополнительных установок и конфигураций:

  • установить отсутствующие GeoIP
  • установить отсутствующие GeoSite
  • включить задачи автоматического обновления

Настройка роутера

Заходим на домашнюю страницу keenetic

Переходим в раздел “Интеренет” -> “Приоритеты подключений” -> “Политики доступа в интернет” -> “Добавить политику”

Создаем политику “Xkeen”

Галочку “Многопутевая передача” прожимаем, если необходимо суммировать несколько провайдеров

Выбираем провайдеров с доступом в интернет

Переходим в раздел “Интеренет” -> “Приоритеты подключений” -> “Применение политик”

Выбираем все подключенные устройства которые должны работать через Xray

Перемещаем в политику “Xkeen”

Переходим в “Интеренет” -> “Название провайдера интернета”:

  • Прожимаем галку “Игнорировать DNSv4 интернет провайдера”

  • В качестве DNS добавляем два сервера 1.1.1.1 и 8.8.8.8

  • Параметры IPv6 переводим в режим “Не используется”

Переходим в в CLI роутер, для этого в правом верхнем углу нажимаем шестеренку и выбираем пункт “Командная строка”

Переносим сервисы Keenetic с 443 порта на любой из портов:

  • 5083
  • 5443
  • 8083
  • 8443
  • 65083

Для этого прописываем команду:

ip http ssl port {port}

Вместо {port} подставляем любой из портов.

Даем возможность opkg управлять DNS:

opkg dns-override 

Сохраняем конфигурацию

system configuration save

Настройка Xray

  • для передачи будет использоваться vless и reality, как в ранее описанной заметке с конфигурацией сервера;
  • EXAMPLE-SITE.COM - адрес сервера;
  • 10.10.10.10 - ip адрес сервера.
  • UUID_FOR_KEENETIC - UUID для keenetic, полученный на сервере
  • PASSWORD - пароль, полученный на сервере
  • SHORT_ID - shortid, полученный на сервере

Заходим в консоль по SSH и перемещаемся в каталог с конфигурациями:

cd /opt/etc/xray/configs/

Начинаем править конфигурации:

log

mcedit 01_log.json

Вставляем

{
  "log": {
    "access": "/opt/var/log/xray/access.log",
    "error": "/opt/var/log/xray/error.log",
    "loglevel": "warning"
  }
}

dns

mcedit 02_dns.json

Вставляем

{
    "dns": {
    "hosts": {
      "EXAMPLE-SITE.COM": "10.10.10.10"
    },
    "servers": [
        "https://8.8.8.8/dns-query",
        "https://1.1.1.1/dns-query",
        {
            "address": "77.88.8.8",
            "port": 53,
            "domains": ["ext:geosite_v2fly.dat:category-ru"]
        }
    ]
  }
}

inbounds

mcedit 03_inbounds.json

Вставляем

{
  "inbounds": [
    {
    "tag": "dns-in",
    "protocol": "dokodemo-door",
    "port": 53,
    "listen": "127.0.0.1",
    "settings":
        {
        "network": "udp,tcp",
        "followRedirect": false
        }
    },
    {
      "port": 1181,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp",
        "followRedirect": true
      },
      "sniffing": {
        "enabled": true,
        "routeOnly": true,
        "destOverride": ["http","tls"]
      },
      "tag": "redirect"
    },
    {
      "port": 1181,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "udp",
        "followRedirect": true
      },
      "streamSettings": {
        "sockopt": {"tproxy": "tproxy"}
      },
      "sniffing": {
        "enabled": true,
        "routeOnly": true,
        "destOverride": ["quic"]
      },
      "tag": "tproxy"
    }
  ]
}

outbounds

mcedit 04_outbounds.json

Вставляем

{
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv4"
      },
      "streamSettings": {}
    },

    {
      "tag": "vless-reality",
      "protocol": "vless",
      "settings": {
        "address": "EXAMPLE-SITE.COM",
        "port": 443,
        "id": "UUID_FOR_KEENETIC",
        "encryption": "none",
        "flow": "xtls-rprx-vision",
        "level": 0
      },
      "streamSettings": {
        "network": "raw",
        "security": "reality",
        "realitySettings": {
          "serverName": "EXAMPLE-SITE.COM",
          "fingerprint": "chrome",
          "password": "PASSWORD",
          "shortId": "SHORT_ID"
        }
      }
    },

    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      }
    },

    {
      "tag": "dns-out",
      "protocol": "dns",
      "settings": {
        "network": "tcp,udp",
        "nonIPQuery": "drop"
      }
    }
  ]
}

routing

mcedit 05_routing.json

Вставляем

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": ["redirect", "tproxy"],
        "outboundTag": "block",
        "network": "udp",
        "port": "135,137,138,139,443"
      },
      {
        "inboundTag": ["redirect", "tproxy"],
        "type": "field",
        "domain": ["ext:geosite_v2fly.dat:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "inboundTag": ["redirect", "tproxy", "dns-in"],
        "port": 53,
        "outboundTag": "dns-out"
      },
      {
        "inboundTag": ["redirect", "tproxy"],
        "type": "field",
        "domain": ["ext:geosite_v2fly.dat:private", "ext:geosite_v2fly.dat:category-ru"],
        "outboundTag": "direct"
      },
      {
        "inboundTag": ["redirect", "tproxy"],
        "type": "field",
        "ip": ["ext:geoip_v2fly.dat:ru"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "outboundTag": "vless-reality",
        "network": "tcp,udp"
      }
    ]
  }
}

policy

Оставялем без изменений

После внесения изменений перезагружаем Xkeen и рестартуем роутер:

xkeen -restrart && reboot