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

Что понадобится
- Raspberry Pi model B
- SD‑карта 4 ГБ или больше
- Ethernet‑кабель
- Совместимый Wi‑Fi адаптер
- MicroUSB кабель питания и адаптер
Примечание: если вы новичок в Raspberry Pi, найдите базовый набор инструкций по установке ОС и подключению периферии перед началом.
Идея проекта
Проект превращает Raspberry Pi в точку доступа с открытым Wi‑Fi и прозрачным HTTP‑прокси (Squid). Прокси перенаправляет запросы на изображение через Perl‑скрипт, который подставляет локальный GIF с котиком (получаемый через TheCatAPI). Это простая демонстрация фильтрации/замены контента на уровне прокси.
Краткое определение: прозрачный прокси — прокси, который перехватывает трафик без дополнительной настройки клиентов.
Настройка 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 Примечание: предупреждения при установке скрипта можно игнорировать, они касаются формальностей 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 После запуска попробуйте открыть сайты, где много изображений — например, Pinterest — и вы увидите, как картинки подменяются GIF‑ами с котиками.
Вариант: переворачивать изображения
Если хотите, чтобы изображения были перевёрнуты, используйте 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 (для тестовых сред) — мощнее, но сложнее.
- На клиенте: браузерное расширение, которое заменяет изображения (без вмешательства в сеть).
Мини‑методология (быстрый чеклист для запуска)
- Подготовить Raspberry Pi и установить ОС.
- Настроить Hostapd на вещание открытой сети.
- Установить Squid, Apache, Perl и создать iptables правила.
- Разместить cats.pl, дать права и создать /var/www/images.
- Перезапустить службы, подключиться к 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 требует более сложного подхода и риска.
- Добавлены разделы с тестами, критериями приёмки, рисками и альтернативами для безопасного и осознанного использования.
Похожие материалы
Как найти идеальный сабреддит
Разблокировать Mac с iPhone через Near Lock
Сохраняйте статьи из Pinterest в Pocket через Zapier
Как улучшить старые фотографии с Remini
Как поделиться Apple Fitness+ с семьёй