Назад | Перейти на главную страницу

SOCKS прокси через DNS

Я пытаюсь реализовать что-то похожее на услугу, предоставляемую https://www.smartdnsproxy.com, где клиентам нужно только изменить настройки DNS для подключения к прокси-серверу HTTP / S или SOCKS5. Я думаю, что разбираюсь в отдельных компонентах, но у меня проблемы с их объединением.

Чтобы добиться того, чего я хочу, мне необходимо предоставить клиентам следующие услуги:

Затем, когда клиент установил DNS для моего сервера и был отправлен запрос, цель состоит в следующем:

  1. Пользователь выполняет DNS-запрос, спрашивая, где находится example.com
  2. Мой DNS-сервер отвечает: "Это <proxy-ip-address>"
  3. Затем пользователь отправляет запрос HTTP / S на IP-адрес прокси, например
    GET /about.html HTTP/1.1
    Host: example.com
    
  4. Прокси-сервер обрабатывает входящий запрос (вероятно, через порт 80 или 443) и возвращает результат клиенту.

Мне удалось настроить обе службы, и, похоже, они хорошо работают независимо. Я настроил dnsmasq чтобы разрешить все домены с IP-адресом прокси, и я могу настроить клиента нормально. Я настроил dante для прослушивания порта 1080, и я могу убедиться, что клиент может использовать прокси, протестированный с помощью удобного socksify инструмент.

Затем, чтобы перенаправить входящие запросы с портов HTTP / S на сам прокси, я использую следующие правила IPTABLES:

#!/bin/bash
# Create new chain
iptables -t nat -N SOCKSPROXY

# Ignore LANs and some other reserved addresses.
iptables -t nat -A SOCKSPROXY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SOCKSPROXY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SOCKSPROXY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SOCKSPROXY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SOCKSPROXY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SOCKSPROXY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SOCKSPROXY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SOCKSPROXY -d 240.0.0.0/4 -j RETURN

# Anything else should be redirected to port 1080
iptables -t nat -A SOCKSPROXY -p tcp -j REDIRECT --to-ports 1080

# Any tcp connection made by our user should be redirected
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -j SOCKSPROXY

# Accept all HTTP and HTTPS connections
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

Но я вижу ошибки отказа в соединении. Является ли iptables правильным подходом для перенаправления входящих подключений на прокси-сервер? Если да, то что мне не хватает?

Это немного сложнее, чем кажется. SOCKS - это отдельный протокол (двоичный), отличный от HTTP. Когда браузер отправляет HTTP-запрос к Dante - Dante ожидает, что протокол будет socks, а не HTTP - поэтому он разрывает соединение.

Чтобы браузер мог использовать SOCKS (если он поддерживается), он должен быть неявно настроен для использования прокси-сервера socks. Если вы хотите сделать это только с помощью конфигурации DNS, вам необходимо настроить прозрачный HTTP-прокси. Для поддержки портов, отличных от 80 (фактически, всех портов TCP), потребуется дополнительная настройка.

Также вы должны поддерживать другие протоколы (не только HTTP), поэтому ваш сервер должен действовать как шлюз и делаем переадресацию трафика.

Настроить HTTPS будет сложно, потому что ваш SSL-сертификат будет отличаться от исходного сертификата сервера, и ему следует доверять браузеру.

Взгляни на Кальмар например прокси - он поддерживает прозрачный HTTP (s) прокси.