Гид по технологиям

Замена изображений в публичном Wi‑Fi на GIF с котиками

5 min read Raspberry Pi Обновлено 03 Jan 2026
Wi‑Fi с котиками — заменить все картинки
Wi‑Fi с котиками — заменить все картинки

cats-browser-wifi

Что понадобится

  • Raspberry Pi model B
  • SD‑карта 4 ГБ или больше
  • Ethernet‑кабель
  • Совместимый Wi‑Fi адаптер
  • MicroUSB кабель питания и адаптер

Примечание: если вы новичок в Raspberry Pi, найдите базовый набор инструкций по установке ОС и подключению периферии перед началом.

Идея проекта

Проект превращает Raspberry Pi в точку доступа с открытым Wi‑Fi и прозрачным HTTP‑прокси (Squid). Прокси перенаправляет запросы на изображение через Perl‑скрипт, который подставляет локальный GIF с котиком (получаемый через TheCatAPI). Это простая демонстрация фильтрации/замены контента на уровне прокси.

Краткое определение: прозрачный прокси — прокси, который перехватывает трафик без дополнительной настройки клиентов.

post-cat-bbc

Настройка Wi‑Fi сети

Следуйте инструкциям по созданию точки доступа на Raspberry Pi (как в руководстве по DIY Onion Router) до шага «Install Tor». Единственное отличие — вещаем открытую сеть вместо WPA.

Отредактируйте /etc/hostapd/hostapd.conf и вставьте:

interface=wlan0  
driver=nl80211  
ssid=Kittens  
hw_mode=g  
channel=6  
auth_algs=1  
wmm_enabled=0

Перезапустите службу hostapd и сеть, затем проверьте, что сеть вещает и к ней можно подключиться. Если что‑то не работает, используйте ifconfig -a и проверьте, есть ли IP на wlan0.

Если IP не назначается при перезагрузке, измените /etc/default/ifplugd от:

INTERFACES="auto"  
HOTPLUG_INTERFACES="all"  

на

INTERFACES="eth0"  
HOTPLUG_INTERFACES="eth0"  

Перезагрузитесь и убедитесь, что интернет доступен через точку доступа.

Squid, IPTables и Apache

Установите необходимые пакеты и создайте скрипт правил iptables. Нам также нужен веб‑сервер Apache для локальной выдачи картинок.

sudo apt-get install squid3 bridge-utils apache perl  
nano iptables.sh  

Вставьте:

iptables -t nat -A POSTROUTING -j MASQUERADE  
iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.42.1:3128  
iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128  

Сделайте исполняемым и установите автозапуск:

chmod +x iptables.sh  
sudo cp iptables.sh /etc/init.d/  
sudo update-rc.d iptables.sh start 99  

iptable-sh-error

Примечание: предупреждения при установке скрипта можно игнорировать, они касаются формальностей Debian, но правила будут работать.

Удалите строку автоматического восстановления старых правил из /etc/network/interfaces:

up iptables-restore < /etc/iptables.ipv4.nat  

(удалите или закомментируйте), затем перезагрузите.

Далее удалим стандартную конфигурацию Squid и создадим новую:

sudo rm /etc/squid3/squid.conf  
sudo nano /etc/squid3/squid.conf  

Вставьте конфигурацию (файл длинный, см. ниже) — она включает redirect_program, который будет вызывать Perl‑скрипт для замены URL изображений:

cache_mgr pi  
cachemgr_passwd pi all  
redirect_program /home/pi/cats.pl  
acl manager proto cache_object  
acl localhost src 127.0.0.1/32 ::1  
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1  
acl localnet src 192.168.42.0/24 # RFC1918 possible internal network  
acl SSL_ports port 443  
acl Safe_ports port 80 # http  
acl Safe_ports port 21 # ftp  
acl Safe_ports port 443 # https  
acl Safe_ports port 70 # gopher  
acl Safe_ports port 210 # wais  
acl Safe_ports port 1025-65535 # unregistered ports  
acl Safe_ports port 280 # http-mgmt  
acl Safe_ports port 488 # gss-http  
acl Safe_ports port 591 # filemaker  
acl Safe_ports port 777 # multiling http  
acl CONNECT method CONNECT  
http_access allow manager localhost  
http_access deny manager  
http_access deny !Safe_ports  
http_access deny CONNECT !SSL_ports  
http_access allow localnet  
http_access allow localhost  
http_access deny all  
http_port 3128 transparent  
umask 022  
cache_mem 128 MB  
cache_dir ufs /var/spool/squid3 1500 16 256  
coredump_dir /var/spool/squid3  
refresh_pattern ^ftp: 1440 20% 10080  
refresh_pattern ^gopher: 1440 0% 1440  
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0  
refresh_pattern . 0 20% 4320  

Инициализируйте кэши Squid:

sudo squid3 -z  

Perl‑скрипт замены изображений (cats.pl)

Создайте скрипт /home/pi/cats.pl и вставьте именно этот код — он принимает URLы из Squid и возвращает локальные URL‑адреса картинок с котиками:

#!/usr/bin/perl  
$|=1;  
$count = 0;  
$pid = $$;  
  
open (DEBUG, '>>/tmp/cats.log');  
autoflush DEBUG 1;  
  
print DEBUG "########################################################################\n";  
  
while (<>) {  
        chomp $_;  
        if (m/nosquid/) {  
              print DEBUG "Input NOSQUID: $url\n";  
              print "$_\n";  
              print DEBUG "Output NOSQUID: $_\n";  
        }  
        elsif ($_ =~ /(.*\.jpg)/i) {  
                $url = $1;  
                print DEBUG "Input: $url\n";  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.gif", "http://thecatapi.com/api/images/get?format=src&type=gif&nosquid");  
                chmod 0777,"/var/www/images/$pid-$count.gif";  
                print "http://127.0.0.1/images/$pid-$count.gif\n";  
        }  
        elsif ($_ =~ /(.*\.gif)/i) {  
                $url = $1;  
                print DEBUG "Input: $url\n";  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.gif", "http://thecatapi.com/api/images/get?format=src&type=gif&nosquid");  
                chmod 0777,"/var/www/images/$pid-$count.gif";  
                print "http://127.0.0.1/images/$pid-$count.gif\n";  
        }  
        elsif ($_ =~ /(.*\.png)/i) {  
                $url = $1;  
                print DEBUG "Input: $url\n";  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.gif", "http://thecatapi.com/api/images/get?format=src&type=gif&nosquid");  
                chmod 0777,"/var/www/images/$pid-$count.gif";  
                print "http://127.0.0.1/images/$pid-$count.gif\n";  
        }  
        elsif ($_ =~ /(.*\.jpeg)/i) {  
                $url = $1;  
                print DEBUG "Input: $url\n";  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.gif", "http://thecatapi.com/api/images/get?format=src&type=gif&nosquid");  
                chmod 0777,"/var/www/images/$pid-$count.gif";  
                print "http://127.0.0.1/images/$pid-$count.gif\n";   
        }  
        else {  
                print "$_\n";  
        }  
        $count++;  
}  

Сделайте скрипт исполняемым и подготовьте директории:

sudo chmod +x cats.pl  
sudo mkdir /var/www/images  
sudo chmod 777 /var/www/images  
sudo usermod -a -G www-data proxy  
sudo chown www-data:www-data /var/www  
sudo chown www-data:www-data /var/www/images  
touch /tmp/cats.log  
chmod 777 /tmp/cats.log  

Логи можно смотреть в реальном времени:

tail -f /tmp/cats.log  

tail-log

После запуска попробуйте открыть сайты, где много изображений — например, Pinterest — и вы увидите, как картинки подменяются GIF‑ами с котиками.

better-pinterest

Вариант: переворачивать изображения

Если хотите, чтобы изображения были перевёрнуты, используйте upsidedown.pl (оригинальный скрипт был модифицирован для совместимости):

#!/usr/bin/perl  
$|=1;  
$count = 0;  
$pid = $$;  
while (<>) {  
        chomp $_;  
        if ($_ =~ /(.*\.jpg)/i) {  
                $url = $1;  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.jpg", "$url");  
                system("/usr/bin/mogrify", "-flip","/var/www/images/$pid-$count.jpg");  
    chmod 0777,"/var/www/images/$pid-$count.jpg";  
                print "http://127.0.0.1/images/$pid-$count.jpg\n";  
        }  
        elsif ($_ =~ /(.*\.gif)/i) {  
                $url = $1;  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.gif", "$url");  
                system("/usr/bin/mogrify", "-flip","/var/www/images/$pid-$count.gif");  
                chmod 0777,"/var/www/images/$pid-$count.gif";  
print "http://127.0.0.1/images/$pid-$count.gif\n";  
  
        }  
        elsif ($_ =~ /(.*\.png)/i) {  
                $url = $1;  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.png", "$url");  
                system("/usr/bin/mogrify", "-flip","/var/www/images/$pid-$count.png");  
                chmod 0777,"/var/www/images/$pid-$count.png";  
print "http://127.0.0.1/images/$pid-$count.png\n";  
  
        }  
        elsif ($_ =~ /(.*\.jpeg)/i) {  
                $url = $1;  
                system("/usr/bin/wget", "-q", "-O","/var/www/images/$pid-$count.jpeg", "$url");  
                system("/usr/bin/mogrify", "-flip","/var/www/images/$pid-$count.jpeg");  
                chmod 0777,"/var/www/images/$pid-$count.jpeg";  
print "http://127.0.0.1/images/$pid-$count.jpeg\n";  
        }  
        else {  
                print "$_\n";;  
        }  
        $count++;  
}  

Замените redirect_program в squid.conf на /home/pi/upsidedown.pl и перезапустите Squid:

sudo service squid3 restart  

Когда это не сработает

  • HTTPS‑трафик не подменяется: прозрачный перехват работает только для HTTP (порт 80). HTTPS защищён и требует ман‑in‑the‑middle с сертификатами, что гораздо сложнее и незаконно без согласия пользователей.
  • Сайты с CSP/динамической загрузкой изображений через JavaScript могут не поддаться простому redirect_program.
  • Ограничения API TheCatAPI: если сервис недоступен, подмена не будет работать.

Альтернативные подходы

  • Использовать прокси на основе nginx с модулями для фильтрации контента.
  • HTTP‑манипуляции на уровне прозрачного прокси с mitmproxy (для тестовых сред) — мощнее, но сложнее.
  • На клиенте: браузерное расширение, которое заменяет изображения (без вмешательства в сеть).

Мини‑методология (быстрый чеклист для запуска)

  1. Подготовить Raspberry Pi и установить ОС.
  2. Настроить Hostapd на вещание открытой сети.
  3. Установить Squid, Apache, Perl и создать iptables правила.
  4. Разместить cats.pl, дать права и создать /var/www/images.
  5. Перезапустить службы, подключиться к Wi‑Fi и протестировать.

Роль‑базовые чек‑листы

  • Администратор сети: убедиться, что Pi в безопасной сети, и обеспечить физическую защиту устройства.
  • Разработчик: тестировать скрипты на отдельной тестовой среде; логировать ошибки.
  • Тестировщик: открыть сайты с разными форматами изображений и проверить подмену и поведение при недоступности API.

Критерии приёмки

  • Клиенты, подключающиеся к точке доступа, получают HTTP‑страницы с заменёнными изображениями на GIF с котиками.
  • HTTPS‑страницы не ломаются (запросы проходят, но изображения остаются оригинальными).
  • Squid и Apache не падают при стандартной нагрузке локальной тестовой сети.

Риски и меры смягчения

  • Правовые риски: не используйте подмену в чужой сети и не нарушайте приватность. Мера: применять только в тестовых/демонстрационных сетях с явным согласием.
  • Безопасность: открытая сеть — риск перехвата данных. Мера: ограничить доступ, использовать VLAN или физическую изоляцию.
  • Перегрузка Pi: лимитировать количество одновременных загрузок, мониторить нагрузку.

Тесты и приёмка

  • Тест 1: Открыть HTTP‑страницу с .jpg/.png/.gif — ожидается локальный GIF.
  • Тест 2: Открыть HTTPS‑страницу — содержимое должно загружаться без ошибок, изображения остаются оригинальными.
  • Тест 3: Отключить доступ к TheCatAPI — проверить поведение (скрипт должен логировать ошибки и не приводить к сбою Squid).

Короткая справка (глоссарий)

  • Squid: прозрачный/обратный прокси для HTTP.
  • redirect_program: опция Squid для передачи URL в внешний процесс и получения замещающего URL.
  • TheCatAPI: публичный сервис для случайных изображений котиков.

Важно: этот проект демонстрационный. Не применяйте подобные перехваты в продуктивных или чужих сетях без согласия.

Если вы добавите улучшения в скрипты (кэширование, ограничения размера, проверка MIME), оставьте в комментариях ссылку на Pastebin или аналогичный репозиторий.

Краткое резюме

  • Raspberry Pi + hostapd делает точку доступа; Squid перехватывает HTTP; Perl‑скрипт заменяет URL изображений.
  • Подмена работает только для HTTP; HTTPS требует более сложного подхода и риска.
  • Добавлены разделы с тестами, критериями приёмки, рисками и альтернативами для безопасного и осознанного использования.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как найти идеальный сабреддит
Сообщества

Как найти идеальный сабреддит

Разблокировать Mac с iPhone через Near Lock
Mac

Разблокировать Mac с iPhone через Near Lock

Сохраняйте статьи из Pinterest в Pocket через Zapier
Автоматизация

Сохраняйте статьи из Pinterest в Pocket через Zapier

Как улучшить старые фотографии с Remini
Фотография

Как улучшить старые фотографии с Remini

Как поделиться Apple Fitness+ с семьёй
How-to

Как поделиться Apple Fitness+ с семьёй

Intel Unison: синхронизация телефона с Windows 11
Приложения

Intel Unison: синхронизация телефона с Windows 11