add: Прозрачный прокси контейнера через Shadowsocks и tun2socks (04)
This commit is contained in:
@@ -164,7 +164,7 @@ services:
|
|||||||
|
|
||||||
# [3] Audiobookshelf, использующий Privoxy для доступа к интернету
|
# [3] Audiobookshelf, использующий Privoxy для доступа к интернету
|
||||||
audiobookshelf:
|
audiobookshelf:
|
||||||
image: advplyr/audiobookshelf:2.28.0
|
image: advplyr/audiobookshelf:latest
|
||||||
container_name: audiobookshelf
|
container_name: audiobookshelf
|
||||||
restart: always
|
restart: always
|
||||||
network_mode: "service:tun2socks"
|
network_mode: "service:tun2socks"
|
||||||
@@ -182,7 +182,7 @@ services:
|
|||||||
|
|
||||||
Что тут происходит:
|
Что тут происходит:
|
||||||
|
|
||||||
**Первым стартует** контейнер `ss-ru`. Он ни от кого не зависит. Он подключается к моему Outline-серверу и предоставляет
|
*Первым стартует** контейнер `ss-ru`. Он ни от кого не зависит. Он подключается к моему Outline-серверу и предоставляет
|
||||||
SOCKS5-прокси на порту `1080`.
|
SOCKS5-прокси на порту `1080`.
|
||||||
|
|
||||||
Где брать параметры для подключения к Outline/VPS? В панели Outline Manager "Add new Key". Она предоставит строку вида:
|
Где брать параметры для подключения к Outline/VPS? В панели Outline Manager "Add new Key". Она предоставит строку вида:
|
||||||
@@ -200,7 +200,7 @@ services:
|
|||||||
**Вторым стартует** контейнер `tun2socks`. Он зависит от `ss-ru`, так что гарантированно запустится после него. Он
|
**Вторым стартует** контейнер `tun2socks`. Он зависит от `ss-ru`, так что гарантированно запустится после него. Он
|
||||||
использует `ss-ru` как SOCKS5-прокси и создает TUN-интерфейс `tun0` внутри контейнера. Так же он предоставляет
|
использует `ss-ru` как SOCKS5-прокси и создает TUN-интерфейс `tun0` внутри контейнера. Так же он предоставляет
|
||||||
HTTP-интерфейс на порту 80 внутри нашего проекта Docker Station (с него будет отвечать Audiobookshelf) который
|
HTTP-интерфейс на порту 80 внутри нашего проекта Docker Station (с него будет отвечать Audiobookshelf) который
|
||||||
проброшен наружу как 8000).
|
проброшен наружу как 8000 (его отпроксирует Nginx на хосте Orange Pi 5 Plus).
|
||||||
|
|
||||||
Контейнер tun2socks использует системный TUN-интерфейс Synology (`/dev/net/tun`). Поэтому контейнеру нужны права
|
Контейнер tun2socks использует системный TUN-интерфейс Synology (`/dev/net/tun`). Поэтому контейнеру нужны права
|
||||||
и доступ к этому устройству. Это достигается через:
|
и доступ к этому устройству. Это достигается через:
|
||||||
@@ -219,16 +219,16 @@ ls /dev/net/tun
|
|||||||
sudo modprobe tun
|
sudo modprobe tun
|
||||||
# И снова проверить, что устройство появилось
|
# И снова проверить, что устройство появилось
|
||||||
ls /dev/net/tun
|
ls /dev/net/tun
|
||||||
# Должно вывести: /dev/net/tun
|
# Должно вывести: "/dev/net/tun"
|
||||||
```
|
```
|
||||||
|
|
||||||
| Заметим |
|
| Заметим |
|
||||||
| ------- |
|
| ------- |
|
||||||
| Я пробовал други решения: (1) `Privoxy` -- Проблемы: axios внутри Audiobookshelf плохо работает с proxy, ломаются редиректы,SSRF фильтр, сами RSS загружаются, но SSRF будет блокировать запросы к iTunes, а, значит, не будут получаться метаданные, а без метаданных и mp3-файлы не скачиваются. (2) `redsocks` -- Проблемы: нестабильный iptables redirect (на Synology это вообще не работает, похоже), падение самого redsocks, сложная настройка NAT внутри Docker.
|
| Я пробовал други решения: (1) `Privoxy` -- Проблемы: axios внутри Audiobookshelf плохо работает с proxy, ломаются редиректы,SSRF фильтр, сами RSS загружаются, но SSRF будет блокировать запросы к iTunes, а, значит, не будут получаться метаданные, а без метаданных и mp3-файлы не скачиваются. (2) `redsocks` -- Проблемы: нестабильный iptables redirect (на Synology это вообще не работает, похоже), падение самого redsocks, сложная настройка NAT внутри Docker.
|
||||||
|
|
||||||
**Третьим стартует** контейнер `audiobookshelf`. В нем почти все по старому. Но теперь он зависит от `tun2socks`,
|
**Третьим стартует** контейнер `audiobookshelf`. В нём почти все по старому. Но теперь он зависит от `tun2socks`,
|
||||||
так что гарантированно запустится после него. Кроме того у него теперь нет проброса портов `8000:80` (они у нас
|
так что гарантированно запустится после него. Кроме того, у него нет проброса портов `8000:80` (они у нас теперь
|
||||||
теперь в контейнере tun2socks). Вместо этого у него `network_mode: "service:tun2socks"`. Это значит, что он будет
|
в контейнере tun2socks). Вместо этого у него `network_mode: "service:tun2socks"`. Это значит, что он будет
|
||||||
использовать сетевой стек контейнера tun2socks. В результате весь его трафик будет идти через TUN-интерфейс
|
использовать сетевой стек контейнера tun2socks. В результате весь его трафик будет идти через TUN-интерфейс
|
||||||
Дальше уже `tun2socks` определит что с ним делать. Если трафик пришел снаружи, с порта 8000, то он попадёт
|
Дальше уже `tun2socks` определит что с ним делать. Если трафик пришел снаружи, с порта 8000, то он попадёт
|
||||||
в Audiobookshelf, как и раньше. Если же сам Audiobookshelf начнет что-то скачивать, то запрос уйдет через
|
в Audiobookshelf, как и раньше. Если же сам Audiobookshelf начнет что-то скачивать, то запрос уйдет через
|
||||||
@@ -237,3 +237,41 @@ ls /dev/net/tun
|
|||||||
|
|
||||||
## Запуск и проверка
|
## Запуск и проверка
|
||||||
|
|
||||||
|
Конечно, первым делом проверить в интерфейсе Docker Station, что проект "зелененький" и все контейнеры тоже
|
||||||
|
"зелененькие". Ну или выполнить:
|
||||||
|
```bash
|
||||||
|
sudo docker ps
|
||||||
|
```
|
||||||
|
|
||||||
|
И увидим что-то типа:
|
||||||
|
```text
|
||||||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||||
|
8599f59103eb advplyr/audiobookshelf:2.28.0 "tini -- node index.…" 16s ago Up 17s audiobookshelf
|
||||||
|
038ea5878848 xjasonlyu/tun2socks "/entrypoint.sh -dev…" 16s ago Up 16s 0.0.0.0:8000->80/tcp, :::8000->80/tcp tun2socks
|
||||||
|
3bdb3269ed77 shadowsocks/shadowsocks-libev "ss-local -s 90.156.…" 16s ago Up 16s ss-ru
|
||||||
|
```
|
||||||
|
|
||||||
|
Для проверки, что тоннель работает и подкасты скачиваются выполним в терминале на Synology:
|
||||||
|
```bash
|
||||||
|
sudo docker exec -it audiobookshelf sh -c " node -e \"const https=require('https');const fs=require('fs');const file=fs.createWriteStream('/podcasts/test.mp3');https.get('https://aerostats.getmobileup.com/music/1074.mp3',res=>{res.pipe(file);file.on('finish',()=>console.log('Done'))})\""
|
||||||
|
```
|
||||||
|
|
||||||
|
Audiobookshelf работает на Node.js, а внутри контейнера нет ни `curl`. ни `wget`. Так что придется запустить такой
|
||||||
|
заковыристый js-скрипт для проверки скачивания файла.
|
||||||
|
|
||||||
|
В результате должен получим `test.mp3` в папке `/podcasts/` (а она у нас снаружи контейнера
|
||||||
|
в `/volume1/music/_podcasts`). Это выпуск №1074 подкаста "Аэростат" с альбомом Аквариума "Странные Новости с
|
||||||
|
Далёкой Звезды" (2026 год, очень рекомендую послушать). Этот подкаст размещен на DigitalOcean, так что если
|
||||||
|
он скачался, значит туннель работает и обход блокировок провайдера сработал.
|
||||||
|
|
||||||
|
Проверить что метаданные из iTunes тоже подгружаются, можно проверить только настроив автообновление подкастов
|
||||||
|
в интерфейсе Audiobookshelf (например через ять минут). К получение метаданных происходит "под капотом"
|
||||||
|
и иначе никак не диагностируется.
|
||||||
|
|
||||||
|
Должно все работать. Но если не работает, то "курите логи" контейнера `audiobookshelf`:
|
||||||
|
```bash
|
||||||
|
sudo docker logs audiobookshelf --tail 100
|
||||||
|
```
|
||||||
|
|
||||||
|
...и Google и ИИ-ассистенты в помощь. Node.js -- это не самая простая среда для отладки.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user