Знаете, скажем так, прошлая моя попытка к чему-то подобному (xray/tunsocks/byedpi) ни к чему рабочему не привела, особенно проблемно когда всё это настраиваешь в первый раз, да ещё и приходится на микротике, а не на нормальном сервере с линуксом.
Тут припёрло, пошел искать опять информацию, ну и наткнулся на эту тему, где очень подробная инструкция. И она сработала. И теперь стало хоть понятно, кто что где и зачем
Ваш докерхаб тоже попадался, может и где-то темы где-то тоже попадались, но вот решил остановиться и попробовать эту объемную, где всё расписано уж совсем для дураков (для меня).
Если нравится xray, в режиме туннеля будет более быстрым сборка с тегом wiktorbgu/vless-hev-socks5-tunnel-mikrotik:redirect
Т.е. просто создаю контейнер с переменными, вешаю на него интерфейс и на него делаю маршут для необходимых адресов/DNS?
Рад что кому-то пригодилось. Есть даже немного долполнить)
В последнее время ГРЦЧ начали как-то шибко задорно ломать траффик, в результате чего wireproxy стал достаточно регулярно и занимательно крашиться. В связи с этим добавил ещё несколько скриптов, которые пытаются автоматом чинить это безобразие. Первые два для микрота - мониторят логи на предмет ошибок wireguard и если их за минуту становится больше 7 - рестартят контейнер
XRAYmonitor
:local errlimit 7;
:global lasterrorXray;
:local currentBuf [ :toarray [ /log find where topics=wireguard,info ]];
:local buflen [ :len $currentBuf ]
:if ( :typeof $lasterrorXray = nil ) do={
:set lasterrorXray ( $currentBuf->($buflen -1 ));
};
:local i 1;
while ( ($currentBuf->($buflen - $i ) != $lasterrorXray) and ($i < $buflen)) do={
:set i ( $i +1 );
};
if (( $i > 1 ) and ($i < errlimit )) do={
:log warning message="Xray PLUS $i errors for last minute";
};
if (( $i > $errlimit ) and ($i < $buflen)) do={
/system/script/run restart_xray
:log warning message="Xray PLUS container restarted";
};
set lasterrorXray ( $currentBuf->($buflen - 1));
Ну и второй - на замену entrypoint.sh в контейнере
entrypoint.sh
#!/bin/busybox sh
#setting envs
export MYIP=$(ip -4 addr show dev eth0 | grep inet | awk -F' ' '{split($2, a, "/");print a[1]}') #because busybox needs some hacks
if hostname | grep -iq mikrotik; then MYHOST=$MYIP; else MYHOST=$(hostname); fi #if container hostname is not set, it will be router name
if [ ! "$WP_PORT" ]; then export WP_PORT=9998; fi #setting wireproxy port
if [ ! "$BDPI_PORT" ]; then export BDPI_PORT=9999; fi #setting byedpi port
if [ ! "$WG_WPIN_PRIVKEY" ]; then echo "$MYHOST: WG_WPIN_PRIVKEY is not set. Exiting"; exit 0 ; fi
if [ ! "$WG_WPIN_PUBKEY" ]; then echo "$MYHOST: WG_WPIN_PUBKEY is not set. Exiting"; exit 0 ; fi
if [ ! "$WG_BDPIIN_PRIVKEY" ]; then echo "$MYHOST: WG_BDPIIN_PRIVKEY is not set. Exiting"; exit 0 ; fi
if [ ! "$WG_BDPIIN_PUBKEY" ]; then echo "$MYHOST: WG_BDPIIN_PUBKEY is not set. Exiting"; exit 0 ; fi
#generating xray base conf from template
xray_conf_gen() {
mkfifo /opt/config/00_base_dyn.json
eval "cat <<EOF
$(cat /opt/xray-core/00_base.json)
EOF
" > /opt/config/00_base_dyn.json &
}
xray_conf_gen
#generating config for wireproxy with socks block
wireproxy_conf_gen() {
mkfifo /opt/awg.conf
eval "cat <<EOF
$(find /opt/config/ -maxdepth 1 -type f -name "*.conf" -exec cat {} \; -quit)
[Socks5]
BindAddress = $MYIP:$WP_PORT
EOF
" > /opt/awg.conf &
}
wireproxy_conf_gen
#starting all processes
log() { while read line; do echo "$MYHOST: ${1}: ${line}"; done; }
run_wireproxy() {
if [ ! "$LOGFILTER" ]; then #wireproxy produce too much logs. We can filter them
echo "Filеring logs for wireproxy disabled"
/opt/wireproxy -c /opt/awg.conf 2>&1 | log "WireproxyAWG" &
else
/opt/wireproxy -c /opt/awg.conf 2>&1 | grep -Eiv "$LOGFILTER" | log "WireproxyAWG" &
fi
}
run_wireproxy
/opt/ciadpi --ip $MYIP --port $BDPI_PORT $BDPI_ARGS 2>&1 | log "ByeDpi" &
/opt/xray-core/xray run -confdir /opt/config 2>&1 | log "Xray-core" &
while true; do
sleep 5
if [ `ps aux | grep wireproxy | grep -v grep | wc -l` -ne 1 ]; then
pkill -f wireproxy
wireproxy_conf_gen
echo "FATAL! Restarted on crash" | log "WireproxyAWG"
run_wireproxy
fi
if [ `ps aux | grep ciadpi | grep -v grep | wc -l` -ne 1 ]; then
pkill -f ciadpi
echo "FATAL! Restarted on crash" | log "ByeDpi"
/opt/ciadpi --ip $MYIP --port $BDPI_PORT $BDPI_ARGS 2>&1 | log "ByeDpi" &
fi
if [ `ps aux | grep xray-core | grep -v grep | wc -l` -ne 1 ]; then
pkill -f xray-core
xray_conf_gen
echo "FATAL! Restarted on crash" | log "Xray-core"
/opt/xray-core/xray run -confdir /opt/config 2>&1 | log "Xray-core" &
fi
done
Там соотв. добавлен мониторинг наличия всех трёх процессов и если какой-то падает - скрипт его рестартит. Пока тестирую, но вроде пока что всё самостоятельно и достаточно стабильно восстаёт из пепла в случае крашей.
у себя заметил, что иногда xray в контейнере падает. из-за этого, естественно, падает весь контейнер. Пока что просто в шедулере проверяю, запущен ли, и, если нет, запускаю. Посмотрим, насколько это будет часто происходить.