Я пытаюсь реализовать что-то похожее на услугу, предоставляемую https://www.smartdnsproxy.com, где клиентам нужно только изменить настройки DNS для подключения к прокси-серверу HTTP / S или SOCKS5. Я думаю, что разбираюсь в отдельных компонентах, но у меня проблемы с их объединением.
Чтобы добиться того, чего я хочу, мне необходимо предоставить клиентам следующие услуги:
dnsmasq
Dante
Затем, когда клиент установил DNS для моего сервера и был отправлен запрос, цель состоит в следующем:
example.com
<proxy-ip-address>
"GET /about.html HTTP/1.1
Host: example.com
Мне удалось настроить обе службы, и, похоже, они хорошо работают независимо. Я настроил 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) прокси.