SSH トンネル経由の DNS

SSH トンネル経由の DNS

すべてのネットワーク トラフィックが SSH トンネルを介して実行されるように OSX システムを設定したいと考えています。

この目的のために小さなスクリプトを作成しました。これによって実行されるコマンドは次のとおりです。

# setup tunnel
ssh -fN -D 1080 -p 22 user@remote

# start up redsocks
sudo redsocks -c /tmp/redsocks.conf -p /tmp/redsocks.pid

# forward all tcp traffic to tunnel
sudo ipfw add 0010 \
    fwd 127.0.0.1,12345 \
    tcp from me \
    to any not dst-port 12345 \
           not dst-port 1080 \
           not dst-ip REMOTE_IP

私はredsocksを使ってssh-tunnelへのhttpプロキシを作成します(転送できるように)全てipfw 経由で tcp トラフィックを送信する場合、redsocks.conf は次のようになります。

base {
    log_debug = on;
    log_info = on;
    log = "file:/tmp/redsocks.log";
    redirector = generic;
}
redsocks {
    local_ip = 127.0.0.1;
    local_port = 55660;
    ip = 127.0.0.1;
    port = 1080;
    type = socks4;
}

これまでのところすべて正常に動作しているようです。OSX システム上のすべての TCP トラフィックは ssh トンネルを介して行われますが、問題は UDP トラフィックにあり、そのために DNS クエリが機能していません。

ローカルマシン上の DNS を SSH トンネル経由で動作させるにはどうすればよいですか?

答え1

あなたのipfw …行は TCP トラフィックのみを転送します。次の行を追加してみてはいかがでしょうか?

sudo ipfw add 0011 fwd 127.0.0.1,12345 \
                   udp from me \
                   to any not dst-port 12345 \
                          not dst-port 1080 \
                          not dst-ip REMOTE_IP

set -xまた、 (デバッグ用) とset -e(いずれかのコマンドが失敗した場合に直ちに失敗するように)を追加することもお勧めします。

  • tun一般的に、 SSHを指す場合は「SSH トンネリング」という用語を使用しますtap
  • ポート転送はトンネリングの特定の形式ですが、この文脈では依然として「ポート転送」とのみ呼ばれるべきです。
  • 簡単なアドホック ジョブを除き、SSH トンネリング (および) -oTunnelを使用しないでください。-oTunnelDevice
  • DNSはトランスポートとしてTCPを使用することができます。UDPに限定されるわけではありませんが、好ましい輸送。

答え2

使用シャトル代わりに、sshuttle は、この程度の手間をかけずに DNS と TCP を正しく処理できると主張しています--dns。これは単なるオプションです。

IME SOCKS は少し古くて、あまり愛されていないようです。また、ipfw と redsocks のこの使用法はよくわかりません。

ただし、SOCKS4 はトンネリング DNS をサポートしていないので、問題が発生しても不思議ではありません。SOCKS の以降のバージョンではサポートされているので、それを検討してください。 そしてどうやらSSHはSOCKS5をサポートしているようだ

答え3

すでに使用しているものに加えて、sSH は、採用されているレイヤー 4 プロトコルとは無関係に、すべての IP トラフィックをトンネリングできます。リモート サーバーはPermitTunnel yes、ディレクティブを使用してトンネルを要求しなければなりませんTunnel。その後、その新しいリンクをデフォルト ゲートウェイとして使用できます。トンネルの詳しい説明はここをご覧ください。

関連情報