Всё описанное ниже — результат технического эксперимента. Материал не является рекламой, не призывает к каким-либо действиям, носит исключительно ознакомительный характер и подготовлен в рамках исследования.
Что понадобится:
- Keenetic с поддержкой USB;
- накопитель размером от 1Gb;
- актуальная KeeneticOS и установленная система пакетов репозитория Entware;
Последний пункт хорошо расписан на сайте у Keenetic.
OpenSSH
После того как система поднялась и удалось зайти в cli, можно привести в порядок некоторые элементы. Можно и без этого, если задача только раскрутить Xray, то пропускаем.
- Обновиться и установить нужные пакеты
opkg update && opkg install mc ss bash curl ip-full iptables sudo micro
- Установить 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