/antizapret

Transparent bypassing censorship in Russia via OPNsense (pfSense) firewall

Primary LanguagePythonMIT LicenseMIT

AntiZapret

Прозрачный обход блокировок для локальной сети.

Мне это решение особенно нравится тем, что оно корректно отрабатывает любой трафик. В том числе и HTTPS. При этом никаких настроек на клиентах делать не надо.

Система отлично работает с роутерами на базе OPNsense (на роутерах на базе pfSense не проверял, но также должно работать без проблем). Возможно, также будет работать с другими роутерами, т.к. используются только базовые возможности файрвола.

Установка и настройка

NB. Для настройки системы понадобится доступ к командной строке через консоль или SSH. Все команды надо исполнять от имени root, т.к. иначе часть не сработает!

  1. Установите и настройте Tor.

    Для OPNsense ...
    сначала установите плагин os-tor через вкладку System > Firmware > Plugins. После перейдите на вновь появившуюся вкладку Services > Tor > Configuration и настройте его:
    Включить Advanced mode в верхнем левом углу.
    Включить Enable.
    При желании указать интерфейсы локальной сети в Listen Interfaces (надо, если вы планируете использовать Tor как-то ещё; для данного обхода блокировок поле можно оставить пустым)
    Включить Enable Transparent Proxy.

    Для других систем ...
    к сожалению, точно описать настройку не могу. Но нужно сделать всё по-аналогии.

  2. Установите этот плагин.

    Самое простое, зайдя в консоль (обязательно как root!) исполнить команды

    cd ~
    git clone https://github.com/Limych/antizapret.git
    cd antizapret
  3. Настройте правила файрвола.

    Для OPNsense ...
    сначала в настройках файрвола на вкладке Firewall > Aliases создайте алиас для удобства использования списка.
    Name = AntiZapret_IPs
    Type = External (advanced)\

    Дальше на вкладке Firewall > NAT > Port Forward создаём новое правило:
    Interface = LAN
    Protocol = TCP
    Destination = AntiZapret_IPs
    Destination port range = any
    Redirect target IP = 127.0.0.1 (адрес, где запущен Tor; в данном случае — та же машина)
    Redirect target port = 9040 (порт, на котором Tor принимает запросы как прозрачный прокси)
    Description = AntiZapret

    Для других систем ...
    к сожалению, точно описать настройку не могу. Но нужно сделать всё по-аналогии.

  4. Настройте регулярное обновление списков блокировки.

    Для OPNsense ...
    просто запустите скрипт

    sh opnsense/install.sh

    После этого в настройках cron (System > Settings > Cron) добавить новую задачу на ежесуточное обновление списка:
    Command = Renew AntiZapret IP-list.

    Для других систем ...
    необходимо в cron добавить что-то типа

    0   0   *   *   *   /root/antizapret/antizapret.pl | tee /usr/local/www/ipfw_antizapret.dat | xargs pfctl -t AntiZapret_IPs -T add
    

    после, чтобы не ждать сутки первого обновления списка, в консоле исполняем команду

    /root/antizapret/antizapret.pl | tee /usr/local/www/ipfw_antizapret.dat | xargs pfctl -t AntiZapret_IPs -T add
    
  5. Всё. :)

    Через некоторое время система сама подгрузит список и файрвол начнёт прозрачно перенаправлять любые обращения к заблокированным сайтам на Tor. В то же время весь прочий трафик будет идти напрямую, как обычно.

При необходимости вы всегда можете получать список заблокированных адресов со своего файрволла по адресу https://<firewall_ip>/ipfw_antizapret.dat

Troubleshooting

Если при создании алиаса вы получили сообщение Invalid argument, загляните на вкладку Firewall> Settings> Advanced, найдите там поле Firewall Maximum Table Entries и измените его значение.

Известно, что на версии OPNsense v21.1 был явный баг: при значении по-умолчанию мы имели почему-то лимит в 32 768 адресов (хотя в справке написано, что по-умолчанию он 200 000 записей). Если явно указать там лимит в 200 000 записей, по факту он был 131 072 записи...