Контейнер и виртуальная машина для возможного предстоящего отключения интернета в Беларуси

Сделал серверный контейнер и клиентскую виртуальную машину для продвинутых пользователей, для применения в случае серьезной цензуры интернета.

Образ маскирует интернет-трафик под скачивание почты с Gmail (протокол IMAP с шифрованием, TLS-запросы на imap.gmail.com, порт 993) по умолчанию, также есть режим маскировки под DNS-запросы на фиктивный домен int.loc, с прямым подключением к серверу по порту DNS 53. Почта и DNS — наиболее «живучие» протоколы, которые будут блокироваться в последнюю очередь.

Интернет из виртуальной машины можно раздать на все устройства внутри домашней сети (компьютеры, смартфоны, приставки). Для этого необходимо указать IP-адрес виртуальной машины в качестве шлюза и DNS-сервера. Устанавливать дополнительное ПО на конечных устройствах не требуется.

Файлы здесь:
ftp://serv.valdikss.org.ru/Downloads/Temp/cenvm-belarus/

Внимание! Клиентская виртуальная машина предназначена для временного использования в случае цензурирования интернета, в сети с домашним маршрутизатором. Она маршрутизирует весь трафик, в ней нет фильтров по интерфейсам или IP-диапазонам.

Для технически неподкованных пользователей, без опыта работы с Linux, рекомендуется использовать Outline, установив его на собственный сервер. Он гораздо проще в установке и использовании, но, с большой вероятностью, не сможет обеспечить доступ в интернет в случае введения действительно жесткой интернет-цензуры.


rootfs.tar.xz — системный серверный контейнер, может быть запущен в systemd-nspawn или LXD. Содержит Cloak, dnstt в качестве фронт-энда, v2ray в качестве бек-енда.
Экспортирует порты 53 (5300 в контейнере, нужно делать маппинг 53 → 5300, см. пример ниже) и 993.

Пример для systemd. Предварительно загрузить rootfs.tar.xz на сервер, далее выполнить:

apt -y install systemd-container
machinectl import-tar rootfs.tar.xz cen
mkdir -p /etc/systemd/nspawn/
echo -e "[Network]\nVirtualEthernet=yes\nPort=tcp:993\nPort=udp:53:5300\nPort=tcp:53:5300" > /etc/systemd/nspawn/cen.nspawn
systemctl enable --now systemd-networkd.service
machinectl enable cen
machinectl start cen

sleep 10
systemctl -M cen disable --now ferm
machinectl copy-from cen /root/cloak_adminuid.txt cloak_adminuid.txt
machinectl copy-from cen /root/cloak_pubkey.txt cloak_pubkey.txt
machinectl copy-from cen /root/dnstt-server.pub dnstt-server.pub
machinectl copy-from cen /root/v2ray_uuid.txt v2ray_uuid.txt

Дополнительная настройка не требуется.


CenVM.ovaклиентский образ виртуальной машины для VirtualBox и других систем виртуализации. Представляет собой программный маршрутизатор, который нужно запустить в виртуальной машине, настроить, и далее использовать IP-адрес виртуальной машины в качестве шлюза и DNS-сервера для всех необходимых устройств в домашней сети.

  1. Установите VirtualBox, скачайте и импортируйте образ CenVM.ova.
  2. Убедитесь, что в настройках виртуальной машины, во вкладке Network у Adapter 1 указан сетевой интерфейс, через который вы получаете интернет на компьютер, а у Adapter 2 указан внутренний сетевой интерфейс VirtualBox (host-only adapter).
  3. Запустите виртуальную машину.
  4. Войдите под именем root, пароль 1.
  5. Скачайте файлы cloak_adminuid.txt, cloak_pubkey.txt, dnstt-server.pub, v2ray_uuid.txt с удалённого сервера в директорию /root, например, с помощью sftp:
sftp root@1.2.3.4
get cloak_adminuid.txt
get cloak_pubkey.txt
get dnstt-server.pub
get v2ray_uuid.txt
  1. Пропишите IP-адрес сервера в файле /usr/local/etc/config.sh, например, с помощью nano.
  2. Перезагрузите виртуальную машину.
  3. Настройте компьютер на использование IP-адреса виртуальной машины в качестве шлюза и DNS-сервера. Посмотреть IP-адрес виртуальной машины можно командой ip -br a, вам нужен адрес вида 192.168.56.xxx.

По умолчанию виртуальная машина настроена на маскировку под imap.gmail.com, порт 993. Чтобы использовать маскировку под DNS, замените порт 6001 на 6002 в файле /usr/local/etc/v2ray.json.template и перезагрузите машину.

  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "127.0.0.1",
        "port": 6001,  // ←←← ВОТ ЭТОТ
        "users": [{ "id": "==UUID==", "alterId": 64 }],
        "domainStrategy": "UseIP"
      }]
    }
  }],

Запустил виртуалку - чёрный экран.
И ещё не совсем понятно, что нужно использовать: виртуалку И серверный контейнер либо виртуалку ИЛИ серверный контейнер

Нужно использовать и виртуалку (на компьютере, в качестве маршрутизатора-шлюза), и контейнер на сервере (в качестве выходного туннеля для виртуалки).

Настраивать виртуалку следует согласно инструкции в посте.

Помогите пожалуйста с 8 пунктом. Вроде был все предыдущие шаги выполнил, но ничего загрузить не могу. Ниже прилагаю скриншоты. Спасибо

Вот output с удаленного сервера

Убедитесь, что в настройках виртуальной машины установлен bridge (мост) на сетевой интерфейс в интернет (Wi-Fi-интерфейс в вашем случае).

В настройках Windows шлюз и DNS у Wi-Fi-интерфейса («беспроводная сеть») необходимо убрать (чтобы он вообще не использовался), а у Host-интерфейса (Virtualbox Host-Only network) установить и шлюз, и DNS, в IP-адрес виртуальной машины.

Думаю, что я ошибаюсь где-то в простом месте. Извините за беспокойство
Вот скриншот, а интернет отсутствует. Спасибо

UPD: Ошибка: DNS-сервер не отвечает.

Вы сделали сетевую петлю: указали TAP Adapter VPN’а в качестве интернет-канала для виртуальной машины, а на компьютере настроили интернет через виртуальную машину.

Сетевой пакет с компьютера идёт в виртуальную машину, она его маршрутизирует в TAP-адаптер, который пытается его отправить в VPN через виртуальную машину (т.к. весь интернет теперь через ВМ) и так до бесконечности.

Либо укажите Wi-Fi-адаптер, либо настраивайте маршрутизацию до VPN через правильный интерфейс, и т.п.

Новости сообщают о проблемах с интернетом в Беларуси.
Пользователи контейнера+виртуалки, пожалуйста, напишите, работает ли эта связка, и насколько хорошо.

Блокировка трафика осуществляется по протоколам TCP и UDP, трафик фильтруется на хопе:

# traceroute google.com --tcp
traceroute to google.com (172.217.20.206), 30 hops max, 60 byte packets
 1  192.168.100.1 (192.168.100.1)  0.451 ms  0.630 ms  0.811 ms
 2  100.125.128.1 (100.125.128.1)  3.703 ms  3.679 ms  3.857 ms
 3  mm-57-80-84-93.dynamic.pppoe.mgts.by (93.84.80.57)  3.453 ms  3.795 ms  4.458 ms
 4  172.23.2.29 (172.23.2.29)  6.021 ms  6.157 ms  6.151 ms
 5  core1.net.belpak.by (93.85.80.45)  4.802 ms  5.337 ms  5.331 ms
 6  ie2.net.belpak.by (93.85.80.42)  5.325 ms  7.748 ms  10.464 ms
 7  asbr7.net.belpak.by (93.85.80.122)  3.261 ms  2.948 ms  3.391 ms
 8  * * *
 9  * * *
10  * * *
# traceroute google.com --icmp
traceroute to google.com (172.217.20.206), 30 hops max, 60 byte packets
 1  192.168.100.1 (192.168.100.1)  0.794 ms  0.972 ms  1.152 ms
 2  100.125.128.1 (100.125.128.1)  7.945 ms  8.293 ms  8.810 ms
 3  mm-57-80-84-93.dynamic.pppoe.mgts.by (93.84.80.57)  3.617 ms  3.774 ms  3.766 ms
 4  172.23.2.29 (172.23.2.29)  6.132 ms  6.270 ms  6.271 ms
 5  core1.net.belpak.by (93.85.80.45)  4.095 ms  4.276 ms  12.026 ms
 6  ie2.net.belpak.by (93.85.80.42)  11.151 ms  6.839 ms  6.821 ms
 7  asbr7.net.belpak.by (93.85.80.122)  3.648 ms  3.989 ms  4.165 ms
 8  209.85.148.70 (209.85.148.70)  30.560 ms  30.946 ms  31.114 ms
 9  108.170.251.145 (108.170.251.145)  25.022 ms  25.018 ms  25.494 ms
10  108.170.228.9 (108.170.228.9)  31.204 ms  30.775 ms  31.151 ms
11  216.239.56.81 (216.239.56.81)  25.905 ms  26.088 ms  26.277 ms
12  108.170.250.209 (108.170.250.209)  29.602 ms  29.777 ms  29.773 ms
13  216.239.41.171 (216.239.41.171)  26.084 ms  25.534 ms  25.545 ms
14  waw02s08-in-f14.1e100.net (172.217.20.206)  25.394 ms  25.496 ms  25.437 ms

Соединение на IP-адрес google.com (172.217.20.206) не устанавливается: ответ на SYN-пакет не приходит.
Соединение до imap.gmail.com:993 успешно устанавливается.

Анализ пакетов осуществляется с помощью DPI. Часть соединений отбрасывается на этапе TLS-хендшейка, в частности, на нестандартных портах (3143).

Контейнер+виртуальная машина работают на mgts.by в полной мере.

Приветствую.
Решил поднять виртуалку. Споткнулся на п. 5. После отправи sftp root@1.2.3.4 выводится:
ssh: connect to host 1.2.3.4 port 22: Connection timed out
Соответственно, не могу выкачать файлы *.txt. Че делать?

Вместо 1.2.3.4 необходимо вписать IP-адрес сервера, на котором установлен контейнер.

Установил контейнер на сервер. Настроил клиентскую vm, но что-то пакеты идут только к серверу, ответов назад не вижу. Фаервол на сервере выключен. В контенере пишутся логи? и если да как их искать. Спасибо

Логи не настроены. Попробуйте воспользоваться tcpdump на порт 53 на стороне сервера, чтобы хотя бы проверить, что сервер действительно не отвечает.

Также не забудьте перезагрузить ВМ после скачивания файлов.

Режим с маскировкой под почту (тот, который по умолчанию) будет работать заметно быстрее.


вот tcpdump, странно что идут dns запросы хоть в конфиге v2ray стоит 6001 порт, клиенскую vm перезагружал

Это нормально, это поддержание сессии.
Захватите трафик на порту 993, посмотрите ответы.


tcpdump


wireshark

такой вопрос
у меня файла /usr/local/etc/v2ray.json.template по дефолту нет это окей или должен его создать?

medfgh на клиентской vm он должен быть