Прокси-сервер SOCKS через DNS

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

Для достижения желаемого мне нужно предоставить клиентам следующие услуги:

  • DNS-сервер, я использую ] dnsmasq
  • SOCKS прокси, я использую Dante

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

  1. Пользователь выполняет DNS-запрос, спрашивая, где находится example.com
  2. Мой DNS-сервер отвечает: «Это »
  3. Затем пользователь отправляет HTTP / S-запрос на прокси-сервер IP-адрес, например
     ПОЛУЧИТЬ /about.html HTTP / 1.1
    Хост: 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 правильным подходом для перенаправления входящих подключений на прокси-сервер? Если да, то что мне не хватает?

2
задан 14 April 2019 в 09:34
1 ответ

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

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

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

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

Взгляните, например, на прокси Squid - поддерживает прозрачный HTTP-прокси.

3
ответ дан 3 December 2019 в 10:31

Теги

Похожие вопросы