Я пытаюсь реализовать что-то похожее на службу, предоставляемую https://www.smartdnsproxy.com , где клиентам нужно только изменить свои настройки DNS для подключения к Прокси HTTP / S или SOCKS5. Я думаю, что понимаю отдельные компоненты, но у меня возникают проблемы с их объединением.
Для достижения желаемого мне нужно предоставить клиентам следующие услуги:
] dnsmasq
Dante
Затем, когда клиент установил DNS для моего сервера и был отправлен запрос, цель состоит в следующем:
example.com
» ПОЛУЧИТЬ /about.html HTTP / 1.1
Хост: 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-сертификат будет отличаться от исходного сертификата сервера и ему следует доверять браузеру.
Взгляните, например, на прокси Squid - поддерживает прозрачный HTTP-прокси.