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 кабель питания и адаптер

Теория
Идея проста: сначала Raspberry Pi становится обычной точкой доступа. Далее между клиентом и интернетом ставится прозрачный прокси (Squid). Squid перенаправляет HTTP‑запросы через программу перенаправления (redirect_program) — в нашем случае Perl‑скрипт, который анализирует каждый HTTP‑URL и, если это изображение, возвращает локальную ссылку на GIF с котиком (скачивая его из TheCatAPI). Это действует только на незашифрованный HTTP; HTTPS не трогается.
Важно: этот подход вмешивается в HTTP‑трафик и подходит только для демонстраций и тестовых сетей, где пользователи предупреждены. Для продуктивных сетей есть юридические и этические ограничения — см. раздел «Безопасность и правовые замечания».
Создание 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
`
Можно игнорировать предупреждения — это предупреждение 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
`
Теперь попробуйте зайти на сайты с картинками (например, Pinterest) — все HTTP‑изображения будут подменены на GIF‑котиков.
Альтернативный скрипт: 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‑страницу с изображениями.
- Подтвердить замену и собрать логи.
Мини‑методология
- Поднять открытую точку доступа на Raspberry Pi.
- Перенаправить HTTP‑трафик на локальный Squid (iptables).
- Использовать redirect_program в Squid, чтобы инспектировать URL‑ы.
- Скрипт скачивает или подставляет котиков и возвращает локальные ссылки.
- Логи и периодическая очистка папки /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‑изображения заменяются на котиков. Подойдёт для шоу‑кейсов, розыгрышей или образовательных экспериментов. Не забудьте учитывать юридические и этические ограничения, особенно в публичных сетях. Если вы улучшили скрипты или добавили кэширование/очистку папки изображений — поделитесь ссылкой в комментариях.
Похожие материалы
Aero Glass в Windows 10 — как вернуть прозрачность
Создать и управлять учётными записями в Windows 10
Этичное использование ChatGPT для академического эссе
Опросы в Microsoft Teams: создать и проводить
Произношение имени в LinkedIn: как записать