Прокси для Transparent Proxy / iptables

В большинстве случаев, когда мы говорим о прокси, мы подразумеваем «обычный» или «непрозрачный» прокси. Он требует явной настройки в каждом приложении. Но существует и другой, гораздо более мощный подход — прозрачный прокси (Transparent Proxy).

Эта технология перехватывает и перенаправляет сетевой трафик незаметно для конечного пользователя и его приложений. Программы на компьютере пользователя даже не подозревают, что их трафик проходит через прокси.

Аналогия:
Обычный прокси — это как отправить посылку через курьерскую службу, которую вы сами выбрали и вызвали.

Прозрачный прокси — это как если бы всё почтовое отделение по умолчанию заворачивало все ваши посылки и отправляло их по специальному маршруту, не ставя вас в известность.

Механизм, который делает это возможным в мире Linux, называется iptables. В этом гайде мы разберёмся, как это работает, для чего это нужно, и как настроить такую систему на практике.

⛔️ Важное предупреждение перед началом
Этот гайд предназначен для продвинутых пользователей. Вы будете работать с iptables и получите полный root-доступ к системе. Неправильная команда может полностью заблокировать ваш доступ к сети (включая SSH).

  • Тестируйте в VM: Всегда тестируйте подобные настройки сначала в виртуальной машине.
  • Имейте план "Б": Убедитесь, что у вас есть консольный доступ к серверу (не SSH) на случай, если вы заблокируете себе сеть.
  • Доверенный провайдер: Вы доверяете весь свой трафик прокси-серверу. Убедитесь, что используете надежного и проверенного провайдера. Не проксируйте sensitive трафик (банкинг) без end-to-end шифрования.
  • Совместимость: Для новых дистрибутивов (Ubuntu 22+, Fedora) проверьте iptables --version — если nft, переключитесь: sudo update-alternatives --set iptables /usr/sbin/iptables-legacy. В контейнерах (Docker) redsocks требует cap_net_admin; используйте --privileged.

Часть 1. Зачем нужен прозрачный прокси?

Прозрачное проксирование — это тотальный контроль над трафиком на уровне сети.

  • Корпоративные сети и Wi-Fi: Для фильтрации контента, кэширования данных и централизованного анализа безопасности.
  • Управление устройствами (IoT): Вы можете проксировать трафик с устройств, где нельзя настроить прокси вручную (Smart TV, игровые консоли, IoT-гаджеты).
  • Обход цензуры для всей сети: Вместо настройки VPN на каждом устройстве, можно один раз настроить роутер, который будет весь трафик направлять через прокси.

Часть 2. Механизм работы: iptables

iptables — это инструмент для управления сетевыми пакетами в ядре Linux (Netfilter). Мы будем использовать таблицу nat (Network Address Translation).

Ключевой момент — это правильный выбор цепочки для перехвата:

  • Цепочка PREROUTING: Перехватывает трафик, который проходит СКВОЗЬ ваш сервер (транзитный трафик). Это ваш выбор, если вы настраиваете шлюз или роутер для других устройств в сети.
  • Цепочка OUTPUT: Перехватывает трафик, который генерирует САМ СЕРВЕР (например, curl, apt-get или скрипты, запущенные локально).

Часть 3. Практическая реализация с redsocks

Простой REDIRECT не умеет работать с удалёнными SOCKS5-прокси, требующими аутентификации. Нам понадобится redsocks.

redsocks — это демон, который принимает перенаправленный iptables трафик, а затем сам устанавливает соединение с вашим удалённым прокси.

Примечание: Оригинальный redsocks довольно старый (последние обновления ~2018). Рекомендуем использовать форк redsocks2 (REDSOCKS2), который имеет фиксы, новые фичи (авто-редирект без блэклиста, shadowsocks support, IPv6) и актуален в 2025. Если в вашем дистрибутиве есть пакет redsocks2 — используйте его.
Иначе:
git clone https://github.com/semigodking/redsocks && cd redsocks && make && sudo make install
(или аналогичный форк https://github.com/Intika-Linux-Proxy/Red-Socks-2).

Шаг 1. Сбор учётных данных прокси

Первый и самый важный шаг — убедиться, что у Вас есть полный набор данных для авторизации. Эти «ключи» позволят Вашему приложению или браузеру подключиться к прокси-серверу и направить трафик через него.

Обязательно подготовьте следующие данные:

  • IP-адрес (хост-сервер)
  • Порт для подключения
  • Логин и пароль для авторизации
  • Тип протокола (HTTP/HTTPS или SOCKS5)
*Рис. 1. На этом скриншоте показано, где в личном кабинете **CyberYozh App** находятся все необходимые поля для подключения к прокси-серверу.*
Шаг 2. Установка redsocks
sudo apt update
sudo apt install redsocks  # Для оригинала; для redsocks2 — см. выше
Шаг 3. Настройка redsocks (TCP + DNS)

Откройте файл конфигурации sudo nano /etc/redsocks.conf. Приведите его к следующему виду, подставив данные вашего прокси. Мы настроим redsocks для TCP-трафика, redudp для UDP/DNS и dnstc для TCP-DNS (чтобы захватывать редкие TCP-запросы).

base {
    log_debug = off;
    log_info = on;
    log = "file:/var/log/redsocks.log"; // Путь к логам для отладки
    daemon = on;
    user = redsocks;
    group = redsocks;
    redirector = iptables;
}

// Секция для TCP-трафика (HTTP, HTTPS и т.д.)
redsocks {
    local_ip = 0.0.0.0;
    local_port = 12345; // Порт, который будет слушать redsocks для TCP

    ip = 51.77.190.247;        // IP-адрес вашего удалённого SOCKS5-прокси
    port = 9595;         // Порт вашего удалённого SOCKS5-прокси
    type = socks5;       // Используем SOCKS5 (можно http-connect для HTTP-прокси или http-relay для чистого HTTP)

    login = "pcobLdlPkt-res-any";    // Логин от прокси
    password = "PC_7CJ2WQqdHNm42dHWj"; // Пароль от прокси
}

// Секция для DNS-трафика (UDP)
redudp {
    local_ip = 0.0.0.0;
    local_port = 10053; // Порт, который будет слушать redsocks для DNS
    
    ip = 51.77.190.247;        // Тот же IP SOCKS5-прокси
    port = 9595;         // Тот же порт SOCKS5-прокси
    type = socks5;

    login = "pcobLdlPkt-res-any";    // Тот же логин
    password = "PC_7CJ2WQqdHNm42dHWj"; // Тот же пароль
}

// Секция для TCP-DNS (чтобы захватывать редкие TCP-запросы)
dnstc {
    local_ip = 127.0.0.1;
    local_port = 5300;
}
Шаг 4. Настройка iptables (Самый важный шаг)

Эти правила — ядро нашей системы. Они предотвратят утечки и бесконечные циклы.

Важно: iptables не имеет встроенного "режима редактирования" как текстовый редактор. Правила хранятся в памяти ядра и управляются через команды. Для просмотра, удаления, вставки или замены используйте команды iptables. Для сложных правок выгрузите правила в файл, отредактируйте его и загрузите обратно. Это особенно удобно с iptables-persistent, где правила сохраняются в /etc/iptables/rules.v4.

Шаг 1. Просмотр текущих правил

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

# Просмотр всех правил в таблице nat с номерами строк
sudo iptables -t nat -L -n -v --line-numbers
  • -t nat: Таблица nat (для наших REDIRECT).
  • -L: Список правил.
  • -n: Числовые IP (без DNS).
  • -v: Подробно (счётчики пакетов).
  • --line-numbers: Номера правил (для удаления/вставки).

Пример вывода:

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REDSOCKS   all  --  *      *       0.0.0.0/0            0.0.0.0/0           
Шаг 2. Простое редактирование: Удаление, вставка и замена

Для мелких изменений:

  • Удалить правило по номеру: Укажите цепочку и номер.
    # Удалить правило №1 в PREROUTING
    sudo iptables -t nat -D PREROUTING 1
    
  • Вставить новое правило на позицию: Используйте -I (insert).
    # Вставить на позицию 1 в PREROUTING (например, с дополнительными портами)
    sudo iptables -t nat -I PREROUTING 1 -p tcp -m multiport --dports 80,443,8080 -j REDSOCKS
    
  • Заменить правило: Используйте -R (replace).
    # Заменить правило №1 в PREROUTING
    sudo iptables -t nat -R PREROUTING 1 -p tcp -m multiport --dports 80,443 -j REDSOCKS
    
Шаг 3. Редактирование через файл (для сложных изменений)

Выгрузите правила в текстовый файл, отредактируйте и загрузите.

  • Выгрузить правила:

    sudo iptables-save > /tmp/iptables.rules  # Временный файл
    # Или для persistent: sudo nano /etc/iptables/rules.v4
    
  • Отредактировать файл: Откройте в nano или vi. Файл выглядит так (пример):

    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :REDSOCKS - [0:0]
    -A REDSOCKS -d 1.2.3.4 -j RETURN
    -A REDSOCKS -d 10.0.0.0/8 -j RETURN
    # ... остальные исключения
    -A REDSOCKS -p tcp -m multiport --dports 80,443 -j REDIRECT --to-port 12345
    -A PREROUTING -j REDSOCKS
    -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 10053
    -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5300
    -A POSTROUTING -o eth0 -j MASQUERADE
    COMMIT
    

    Добавляйте/удаляйте строки с -A, -I и т.д. Сохраните файл.

  • Загрузить правила:

    sudo iptables-restore < /tmp/iptables.rules
    # Для persistent: sudo netfilter-persistent reload
    
Шаг 4. Очистка правил (если нужно сбросить)
  • Очистить цепочку: sudo iptables -t nat -F REDSOCKS (flush).
  • Удалить цепочку: sudo iptables -t nat -X REDSOCKS.
  • Полная очистка nat: sudo iptables -t nat -F (осторожно!).

Советы: После изменений проверьте правила (iptables -t nat -L) и протестируйте трафик (curl, dig). Для IPv6 используйте ip6tables. Если система на nftables, редактируйте /etc/nftables.conf и примените sudo nft -f /etc/nftables.conf.

Приступим к настройке iptables:

# ВАЖНО: Укажите IP вашего удаленного прокси
PROXY_IP="51.77.190.247"

# --- ОБЩАЯ НАСТРОЙКА ---
# Очищаем цепочку REDSOCKS (если существует, для теста)
sudo iptables -t nat -F REDSOCKS || true
sudo iptables -t nat -X REDSOCKS || true

# Создаём новую цепочку REDSOCKS для TCP
iptables -t nat -N REDSOCKS

# Исключаем сам прокси-сервер, чтобы избежать бесконечного цикла
iptables -t nat -A REDSOCKS -d $PROXY_IP -j RETURN

# Игнорируем локальные и зарезервированные сети
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN

# --- ИСПРАВЛЕНИЕ: Перенаправляем только ВЕБ-трафик ---
# Мы НЕ хотим ломать SSH, FTP и т.д. Перенаправляем только HTTP и HTTPS.
# Для email (25,465) или других портов добавьте в --dports
iptables -t nat -A REDSOCKS -p tcp -m multiport --dports 80,443 -j REDIRECT --to-port 12345

# (Опционально) Если вы уверены, что хотите проксировать ВЕСЬ TCP-трафик:
# iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port 12345

# --- ВЫБЕРИТЕ ВАШ СЦЕНАРИЙ ---

# === СЦЕНАРИЙ А: Прокси для шлюза (трафик ДРУГИХ устройств) ===
# Клиенты должны использовать сервер как default gateway (via DHCP или статично)

# 1. Включаем IP-форвардинг (постоянно)
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 2. Применяем правила к транзитному трафику
iptables -t nat -A PREROUTING -j REDSOCKS

# 3. Перехватываем DNS-трафик (UDP 53) и отправляем на redsocks
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 10053

# 4. Перехватываем TCP-DNS
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5300

# 5. Включаем MASQUERADE (КРИТИЧЕСКИ ВАЖНО для шлюза)
# Замените eth0 на ваш ВНЕШНИЙ сетевой интерфейс
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


# === СЦЕНАРИЙ Б: Прокси для самого сервера (ЛОКАЛЬНЫЙ трафик) ===

# 1. Применяем правила к локальному трафику
iptables -t nat -A OUTPUT -j REDSOCKS

# 2. Перехватываем локальный DNS-трафик
iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-port 10053

# 3. Перехватываем TCP-DNS
iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-port 5300

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

Шаг 5. Запуск redsocks
sudo systemctl start redsocks
# Убедитесь, что сервис запущен
sudo systemctl status redsocks

Часть 4. Проблемы и Продвинутые Решения

Утечки DNS (UDP vs TCP)

Этот гайд решает проблему, перехватывая DNS-запросы по UDP (порт 53) и TCP с dnstc. Однако, если прокси не поддерживает UDP-associate (для redudp), DNS не пройдёт — проверьте логи. Для полной защиты проверьте на dnsleaktest.com.

Проблема с HTTPS и SSL

У redsocks этой проблемы нет. Он работает на транспортном уровне (TCP) и не пытается расшифровать ваш HTTPS-трафик. Он просто берет ваш уже зашифрованный HTTPS-пакет и "заворачивает" его целиком в SOCKS5. Владелец прокси не может прочитать ваши данные.

Заметка о современных альтернативах

redsocks — мощный, но довольно старый инструмент. В 2025 году для новых систем, особенно использующих nftables, часто рекомендуют более современные альтернативы, такие как ss-redir (из shadowsocks-libev) или V2Ray/Xray, которые выполняют схожие задачи с лучшей производительностью и плагинами. Для UDP без redsocks рассмотрите TPROXY в iptables/nftables. Если в контейнерах или на Android/routers (GL.iNet) — redsocks работает, но требует кастомной прошивки.

Часть 5. Тестирование и Отладка

Если что-то не работает, вот ваш чек-лист:

  • Проверьте IP: curl ifconfig.me (должен показать IP вашего SOCKS5-прокси, а не сервера).
  • Проверьте DNS: dig google.com или nslookup google.com. Проверьте IP-адрес, который отвечает. Проверьте утечки: Откройте browserleaks.com или dnsleaktest.com.
  • Проверьте логи redsocks: Это ваш лучший друг.
    tail -f /var/log/redsocks.log
    # Или: journalctl -u redsocks
    
    Ищите сообщения об ошибках подключения или аутентификации (например, 'authentication failed' — неверный login/password).
  • Проверьте доступность прокси: Убедитесь, что ваш сервер может подключиться к прокси-серверу:
    nc -zv 51.77.190.247 9595
    # (Ожидаемый ответ: Connection to 51.77.190.247 9595 port [tcp/*] succeeded!)
    
  • Проверьте порты: ss -tuln (должны слушаться 12345, 10053, 5300).
  • Проверьте Firewall: Убедитесь, что ufw или firewalld не блокируют ваши новые правила. Если SSH сломан — отключите перенаправление всего TCP.
  • Common Issues: 'Connecting but not responding' — проверьте proxy-type (http-relay для HTTP). Бесконечный цикл? Убедитесь, что PROXY_IP исключён.

Часть 6. Сохранение правил iptables

Настройки iptables сбрасываются при перезагрузке. Чтобы сделать их постоянными, установите iptables-persistent.

sudo apt update
sudo apt install iptables-persistent

Во время установки он спросит, хотите ли вы сохранить текущие правила. Согласитесь. Если вы позже измените правила, для их сохранения выполните:

sudo netfilter-persistent save

Для очистки:
sudo iptables -t nat -F REDSOCKS; sudo iptables -t nat -X REDSOCKS; sudo iptables -t nat -D PREROUTING/OUTPUT ...
(удалите конкретные правила).

Заключение

Прозрачный прокси с iptables — это невероятно мощный инструмент. Благодаря redsocks (или redsocks2), его можно настроить для работы с современными SOCKS5-прокси. Главное — помнить о безопасности, избегать перехвата всего TCP-трафика (фильтруя порты), включать MASQUERADE для шлюзов и всегда перехватывать DNS-запросы, чтобы избежать утечек.

FAQ

  • Не работает подключение? Проверьте прокси в logs: 'authentication failed' — неверный login/password.
  • Бесконечный цикл? Убедитесь, что PROXY_IP исключён.
  • В контейнерах? Redsocks требует cap_net_admin; используйте --privileged в Docker.
  • Не работает с моим прокси? Если HTTP — используйте type = http-connect для HTTPS-совместимости.