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

Raspberry Pi: открытая Wi‑Fi сеть, заменяющая изображения на котиков

8 min read Raspberry Pi Обновлено 12 Dec 2025
Raspberry Pi: Wi‑Fi, заменяющий изображения на котиков
Raspberry Pi: Wi‑Fi, заменяющий изображения на котиков

Этот пошаговый гайд показывает, как превратить Raspberry Pi в открытую точку доступа Wi‑Fi и прослойку‑прокси, которая перехватывает HTTP‑запросы и подменяет все изображения на котиков (GIF) с TheCatAPI. Нужно: Pi, Wi‑Fi‑адаптер, Squid, Apache и Perl‑скрипт.

Что потребуется

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

Пользователь подключается к публичной Wi‑Fi на Raspberry Pi

Теория

Идея проста: сначала Raspberry Pi становится обычной точкой доступа. Далее между клиентом и интернетом ставится прозрачный прокси (Squid). Squid перенаправляет HTTP‑запросы через программу перенаправления (redirect_program) — в нашем случае Perl‑скрипт, который анализирует каждый HTTP‑URL и, если это изображение, возвращает локальную ссылку на GIF с котиком (скачивая его из TheCatAPI). Это действует только на незашифрованный HTTP; HTTPS не трогается.

Важно: этот подход вмешивается в HTTP‑трафик и подходит только для демонстраций и тестовых сетей, где пользователи предупреждены. Для продуктивных сетей есть юридические и этические ограничения — см. раздел «Безопасность и правовые замечания».

Изменённая страница BBC с котиками

Создание Wi‑Fi сети

Этот шаг аналогичен руководству по DIY Onion Router. Настройте точку доступа, как в том руководстве, до шага «Install Tor», затем измените вещание на открытую сеть вместо WPA.

Откройте /etc/hostapd/hostapd.conf и замените содержимое на конфигурацию ниже, затем перезапустите hostapd.

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

После этого у Raspberry Pi должна появиться общедоступная Wi‑Fi сеть с SSID Kittens.

Если сеть не работает, выполните:

        `ifconfig -a  
`
    

и проверьте наличие IP на wlan0. Если после перезагрузки IP не проявляется, отредактируйте /etc/default/ifplugd:

        `sudo nano /etc/default/ifplugd  
`
    

Измените значения с:

        `INTERFACES="auto"  
HOTPLUG_INTERFACES="all"  
`
    

на:

        `INTERFACES="eth0"  
HOTPLUG_INTERFACES="eth0"  
`
    

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

Squid Proxy и IPTables

Установите необходимые пакеты и создайте скрипт для политики NAT. Поскольку мы будем локально обслуживать заменённые изображения, нужен Apache.

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

Вставьте следующие правила в 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  
`
    

Сообщение об ошибке при копировании iptables скрипта

Можно игнорировать предупреждения — это предупреждение Debian‑стиля, а не фатальная ошибка.

Удалите или закомментируйте строку boot‑скрипта, которая восстанавливает старые правила iptables, из /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‑скрипт):

        `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  
nano /home/pi/cats.pl  
`
    

Скрипт cats.pl

Создайте /home/pi/cats.pl и вставьте скрипт из исходника. Этот Perl‑скрипт читает URL‑ы из Squid и подменяет URL изображений на локальные GIF, которые скачиваются с TheCatAPI. Ниже — оригинальный код (оставляйте код без изменений для совместимости):

        `#!/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 лога cats.log

Теперь попробуйте зайти на сайты с картинками (например, Pinterest) — все HTTP‑изображения будут подменены на GIF‑котиков.

Изображения на Pinterest заменены котиками

Альтернативный скрипт: upsidedown.pl

Если хотите вместо котиков переворачивать изображения — в архиве исходного автора есть upsidedown.pl. Пример кода приведён ниже; он скачивает оригинал, применяет mogrify -flip и отдаёт локальную ссылку.

        `#!/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 вместо cats.pl и перезапустите Squid:

        `sudo service squid3 restart  
`
    

Проверка и отладка

  • Убедитесь, что Squid работает: sudo service squid3 status
  • Проверяйте лог /tmp/cats.log: tail -f /tmp/cats.log
  • Проверьте доступность локальных изображений: http://127.0.0.1/images/
  • Если изображения не подменяются, проверьте правила iptables и то, что трафик HTTP действительно перенаправляется на порт 3128.

Безопасность и правовые замечания

Important: этот метод вмешивается в незашифрованный HTTP и может нарушать правила использования сети и приватность. Никогда не применяйте перехват трафика без явного согласия пользователей. HTTPS‑трафик не перехватывается этим методом; для работы с HTTPS нужен полноценный MITM с доверенными сертификатами, что ещё более рискованно и часто незаконно.

Рекомендации по безопасности:

  • Используйте проект только в тестовых или демонстрационных сетях.
  • Ограничьте сеть гостевым доступом и логируйте действия для аудита.
  • Не храните чувствительные данные в /var/www/images с правами 777 в продуктивных системах — вместо этого используйте ограниченные права и ротацию файлов.

Когда это не подходит

  • Когда большинство трафика идёт по HTTPS — подмена изображений не сработает.
  • В корпоративных сетях и публичных точках без явного согласия пользователей — юридические риски.
  • Если требуется высокая производительность — скачивание и обработка изображений увеличивает задержку.

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

  • Клиент подключается к Wi‑Fi SSID Kittens и получает IP адрес.
  • HTTP‑запросы с изображениями перенаправляются через Squid (порт 3128).
  • В логах /tmp/cats.log видно, что скрипт обрабатывает URL и отдает локальные ссылки на GIF.
  • На тестовых страница изображений отображаются GIF с котиками вместо оригиналов.

Чеклист для ролей

Администратор сети:

  • Настроить hostapd и убедиться, что wlan0 вещает.
  • Прописать корректные правила iptables.
  • Проверить, что Squid запущен и redirect_program указан.

Разработчик/скриптер:

  • Разместить cats.pl в /home/pi, сделать исполняемым.
  • Подготовить /var/www/images и задать права.

Тестер:

  • Подключиться и открыть HTTP‑страницу с изображениями.
  • Подтвердить замену и собрать логи.

Мини‑методология

  1. Поднять открытую точку доступа на Raspberry Pi.
  2. Перенаправить HTTP‑трафик на локальный Squid (iptables).
  3. Использовать redirect_program в Squid, чтобы инспектировать URL‑ы.
  4. Скрипт скачивает или подставляет котиков и возвращает локальные ссылки.
  5. Логи и периодическая очистка папки /var/www/images.

Небольшой чек‑лист команд (шаблон)

  • apt и установка: sudo apt-get install squid3 apache perl bridge-utils
  • Настройка hostapd: редактирование /etc/hostapd/hostapd.conf
  • Правила NAT: создать iptables.sh и разместить в /etc/init.d/
  • Squid: заменить /etc/squid3/squid.conf и перезапустить сервис
  • Скрипт: /home/pi/cats.pl, chmod +x, создать /var/www/images

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

  • Тест 1: Подключение к Wi‑Fi — ожидаемый результат: IP, доступ в интернет.
  • Тест 2: Открыть HTTP страницу с несколькими изображениями — ожидается подмена на GIF с котиками.
  • Тест 3: Проверка логов — cats.log содержит записи Input/Output для обработанных URL.

Глоссарий (одна строка)

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

Итог

Эта инструкция даёт быстрый путь к созданию демонстрационной Wi‑Fi среды, где все HTTP‑изображения заменяются на котиков. Подойдёт для шоу‑кейсов, розыгрышей или образовательных экспериментов. Не забудьте учитывать юридические и этические ограничения, особенно в публичных сетях. Если вы улучшили скрипты или добавили кэширование/очистку папки изображений — поделитесь ссылкой в комментариях.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Aero Glass в Windows 10 — как вернуть прозрачность
Windows

Aero Glass в Windows 10 — как вернуть прозрачность

Создать и управлять учётными записями в Windows 10
Windows

Создать и управлять учётными записями в Windows 10

Этичное использование ChatGPT для академического эссе
Образование

Этичное использование ChatGPT для академического эссе

Опросы в Microsoft Teams: создать и проводить
Руководство

Опросы в Microsoft Teams: создать и проводить

Произношение имени в LinkedIn: как записать
Карьера

Произношение имени в LinkedIn: как записать

Изменить направление прокрутки в Windows 10
Windows

Изменить направление прокрутки в Windows 10