web-dev-qa-db-ja.com

DNSを介したSOCKSプロキシ

https://www.smartdnsproxy.com によって提供されるサービスに似たものを実装しようとしていますが、クライアントはDNS設定を変更するだけでHTTP/SまたはSOCKS5プロキシに接続できます。個々のコンポーネントは理解していると思いますが、すべてをまとめるのに苦労しています。

私が望むことを達成するために、私はクライアントに以下のサービスを提供する必要があります:

  • DNSサーバー、私はdnsmasqを使用しています
  • SOCKSプロキシ、私はDanteを使用しています

次に、クライアントがDNSをサーバーに設定し、要求が送信されたら、次のことが目標になります。

  1. ユーザーはexample.comの場所を尋ねるDNS要求を実行します
  2. DNSサーバーが「それは<proxy-ip-address>」です。
  3. 次に、ユーザーはHTTP/SリクエストをプロキシのIPアドレスに送信します(例:)。
    GET /about.html HTTP/1.1
    Host: example.com
    
  4. プロキシサーバーは着信リクエストを処理し(おそらくポート80または443で)、クライアントに結果を返します

私は両方のサービスをセットアップすることができました、そしてそれらは独立してうまく機能するようです。プロキシの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は、着信接続をプロキシサーバーに転送する適切な方法ですか?もしそうなら、私は何が欠けていますか?

2
Oscar Wahltinez

見た目よりも少し複雑です。 SOCKSは独立したプロトコル(バイナリ)であり、HTTPとは異なります。ブラウザがHTTPリクエストをDanteに送信すると(DanteはプロトコルがHTTPではなくsockであることを期待します)、接続を切断します。

ブラウザがSOCKSを使用するためには(サポートされている場合)、socksプロキシを使用するように暗黙的に設定する必要があります。 DNS構成だけでそれを実行したい場合は、透過HTTP(s)プロキシを設定する必要があります。 80以外のポート(実際にはすべてのTCPポート)をサポートするには、追加の構成が必要になります。

また、サーバーがgatewayとして機能し、トラフィック転送を行うように、他のプロトコル(HTTPだけでなく)をサポートする必要があります。

HTTPSを構成するのは難しいでしょう-SSL証明書は元のサーバー証明書とは異なり、ブラウザーによって信頼される必要があるためです。

たとえばSquidプロキシを見てください-透過的なHTTP(s)プロキシをサポートしています。

3
k010mb0