iptables
すべての発信 UDP パケットをローカル ソケットにリダイレクトするルールを作成しようとしていますが、宛先情報も必要です。私はから始めました
sudo iptables -t nat -A sshuttle-12300 -j RETURN --dest 127.0.0.0/8 -p udp
sudo iptables -t nat -A sshuttle-12300 -j REDIRECT --dest 0.0.0.0/0 -p udp --to-ports 15000
これで、ポート 15000 のソケットを使用して、すべての送信 UDP パケットを取得できるようになりました。
ここで、宛先情報 (ターゲット ホストとポート番号) が必要なので、単純な UDP ソケットでは不十分です。完全な IP ヘッダーを取得するために raw ソケットが必要です。
しかし、結局のところ、受信したパケットはlocalhost:15000
. ソケットがある場所なので、これは理にかなっていますが、それは私が望んでいるものではありません。によってパケットがリダイレクトされる前のホスト/ポートが必要ですiptables
。
グーグルはこの質問につながり、答えは2つのアプローチを示唆していました.TPROXY
とSO_ORIGINAL_DST
、前者を推奨しているので、それを試してみました.
iptables
のルールを追加TPROXY
:
sudo iptables -t mangle -A PREROUTING -j TPROXY --dest 0.0.0.0/0 -p udp --on-port 15000
tproxy.txtから読み取ると、オプションを使用してリッスン ソケットを作成する必要がありIP_TRANSPARENT
ます (これはルートとして実行されます)。
from socket import *
s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
# The IP_TRANSPARENT option isn't defined in the socket module.
# Took the value (19) from the patch in http://bugs.python.org/issue12809
s.setsockopt(SOL_IP, 19, 1)
s.bind(('0.0.0.0', 15000))
s.recv(4096) # Will hang until it receives a packet
では、別のスクリプトを作成してテスト パケットを生成し、何かが起こるかどうかを確認してみましょう。
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.connect(('192.168.1.1', 9001))
s.send('hello')
しかし、受信側では何も起こりません。recv
通話がハングしたようで、データを受信していません。
したがって、全体的な質問は次のいずれかです。
TPROXY
ルールからデータを受け取るコードに何か問題がありますか?
また
- これを達成する別の方法はありますか (宛先情報を取得する方法で、すべての発信 UDP パケットをローカルソケットにリダイレクトします)?
編集:パケットが通過するときに検査するだけでなく、パケットをリダイレクト(したがって傍受)したいと主張する必要があります。