
すべてのネットワーク トラフィックが 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
- TCP over TCP は非常に悪い考えです:
- UDP over TCP は、通常それを使用しているアプリケーションに過度の遅延を追加します。UDP を使用するプログラムは、RTP の場合と同様に、独自の信頼性と輻輳制御を完全に制御する必要があります。
- DNSはトランスポートとしてTCPを使用することができます。UDPに限定されるわけではありませんが、好ましい輸送。
答え2
使用シャトル代わりに、sshuttle は、この程度の手間をかけずに DNS と TCP を正しく処理できると主張しています--dns
。これは単なるオプションです。
IME SOCKS は少し古くて、あまり愛されていないようです。また、ipfw と redsocks のこの使用法はよくわかりません。
ただし、SOCKS4 はトンネリング DNS をサポートしていないので、問題が発生しても不思議ではありません。SOCKS の以降のバージョンではサポートされているので、それを検討してください。 そしてどうやらSSHはSOCKS5をサポートしているようだ。
答え3
すでに使用しているものに加えて、sSH は、採用されているレイヤー 4 プロトコルとは無関係に、すべての IP トラフィックをトンネリングできます。リモート サーバーはPermitTunnel yes
、ディレクティブを使用してトンネルを要求しなければなりませんTunnel
。その後、その新しいリンクをデフォルト ゲートウェイとして使用できます。トンネルの詳しい説明はここをご覧ください。