https://www.smartdnsproxy.com によって提供されるサービスに似たものを実装しようとしていますが、クライアントはDNS設定を変更するだけでHTTP/SまたはSOCKS5プロキシに接続できます。個々のコンポーネントは理解していると思いますが、すべてをまとめるのに苦労しています。
私が望むことを達成するために、私はクライアントに以下のサービスを提供する必要があります:
dnsmasq
を使用していますDante
を使用しています次に、クライアントがDNSをサーバーに設定し、要求が送信されたら、次のことが目標になります。
example.com
の場所を尋ねるDNS要求を実行します<proxy-ip-address>
」です。GET /about.html HTTP/1.1
Host: example.com
私は両方のサービスをセットアップすることができました、そしてそれらは独立してうまく機能するようです。プロキシのIPアドレスを使用してすべてのドメインを解決するようにdnsmasq
を構成しましたが、クライアントを正常にセットアップできます。ポート1080をリッスンするようにdante
を構成しました。便利な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はプロトコルがHTTPではなくsockであることを期待します)、接続を切断します。
ブラウザがSOCKSを使用するためには(サポートされている場合)、socksプロキシを使用するように暗黙的に設定する必要があります。 DNS構成だけでそれを実行したい場合は、透過HTTP(s)プロキシを設定する必要があります。 80以外のポート(実際にはすべてのTCPポート)をサポートするには、追加の構成が必要になります。
また、サーバーがgatewayとして機能し、トラフィック転送を行うように、他のプロトコル(HTTPだけでなく)をサポートする必要があります。
HTTPSを構成するのは難しいでしょう-SSL証明書は元のサーバー証明書とは異なり、ブラウザーによって信頼される必要があるためです。
たとえばSquidプロキシを見てください-透過的なHTTP(s)プロキシをサポートしています。