Проксі для 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 (через 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.
  • Поширені проблеми: «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-сумісності.