私自己作成インターフェース tun0(ターン/タップに基づいて)受信した内容を出力します。
このインターフェイスを通過するには、システムからのすべてのトラフィックが必要です。
このインターフェイスの機能は次のとおりです。
- 潜在的に検閲されたパケットを識別してトンネリングします。
- 他のすべての車両は邪魔されずに通過します。
推測できるように、私は検閲防止ツールを構築しようとしています。
トンネルの決定は tun0 プロセス内で行う必要があります。
なぜなら、そこでのみ信頼できるDNSを使用できるからです。
独自に作成されたインターフェイス tun0 を介してすべてのトラフィックフローを作成する方法を教えてくれる場合は、お手伝いが必要です。 tun0を変更する必要がある場合は、その変更を提供するように依頼してください。
以下は、tun0を介してすべてのトラフィックを取得しようとしましたが、失敗(ping失敗)した方法です。
編む
gcc tun0.c
sudo ./a.out
構成
sudo ip addr add 10.0.0.1/24 dev tun0
Johnテーブルの作成
$ cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 200 John
順序が重要です:
sudo ip rule add from all lookup John
sudo ip route add default dev tun0 table John
sudo ip rule add iif tun0 lookup main priority 500
$ ip rule 0: from all lookup local 500: from all iif tun0 lookup main 32765: from all lookup John 32766: from all lookup main 35000: from all lookup default
トラブルシューティング
sudo tcpdump -i wlp2s0 -qtln icmp
これにより、ping -I tun0 8.8.8.8
パケットがキャプチャされていないことがわかります。これは、ルールを介してtun0からwlp2s0にパケットが送信されなかったことを意味しますiif tun0 lookup main
。tun0
どこでも交換するとlo
私に効果的です。
また試み
- リバースパスフィルタリングをオフにします
rp_filter=0
。/etc/sysctl.conf
トラブルシューティング
iptables -I FORWARD -j LOG --log-prefix "filter/FORWARD "
iptables -t nat -I OUTPUT -j LOG --log-prefix "nat/OUTPUT "
iptables -t nat -I PREROUTING -j LOG --log-prefix "nat/PREROUTING "
iptables -t nat -I POSTROUTING -j LOG --log-prefix "nat/POSTROUTNG "
tail -f /var/log/syslog
回答の修正されたソースは次のとおりです。ここ。
答え1
したがって、設定からネットワークに送信するすべてのパケットは元々始まります(インターフェイスを10.0.0.1
通過し、ローカルアドレスがあるため)。パケットをキャプチャしましたが、これまでは素晴らしかったです。今すぐパケットを送信します。tun0
10.0.0.1
tun0
ソースアドレスはい10.0.0.1
、パケットは別のインターフェイスを通過したい(wlp2s0
あなたの場合)。それはルーティングまず、ルーティングを有効にしてみましょう。
sysctl -w net.ipv4.ip_forward=1
後で見ると、パケットにwlanインターフェイスのソースアドレスではなくソースアドレスがあることがわかりますtcpdump
(予想していたようです)。したがって、ソースアドレスを変更する必要があります。wlp2s0
10.0.0.1
ソースNAT。 Linuxでは、次のコマンドを使用すると簡単です。ネットワークフィルタ/iptables:
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.1 -j MASQUERADE
また、FORWARD
チェーンにポリシーがあることを確認してくださいACCEPT
。それ以外の場合は、次のことを行う必要があります。転送を許可次のようなもの:
iptables -A FORWARD -i tun0 -o wlp2s0 -s 10.0.0.1 -j ACCEPT
iptables -A FORWARD -i wlp2s0 -o tun0 -d 10.0.0.1 -j ACCEPT
今、すべてがうまくいくでしょう。Linuxカーネルルーティングのためのパケットをtun0
インターフェイスからwlp2s0
。Webフィルタ送信元IPは、インターフェイスから送信されるパケットの割り当てられたアドレス10.0.0.1
に変更する必要があります。wlp2s0
これはすべての接続を記憶し、応答パケットが戻ってくると(存在する場合)、インターフェイスwlp2s0
で割り当てられたアドレスの宛先アドレスを変更します10.0.0.1
(「conntrack」機能)。
まあ、そうすべきですが、そうではありません。そうだ、WebフィルタOUTPUT
人々は、この複雑なルーティング構成と同じパケットが最初にチェーンを通過し、その後ルーティングされてチェーンに到達するという事実によって混乱しますPREROUTING
。少なくともDebian 8ボックスでは動作しません。
問題を解決する最良の方法Webフィルタその特性は次のとおりですTRACE
。
modprobe ipt_LOG
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE
ICMPパケット追跡のみが有効になっています。他のフィルタを使用してデバッグできます。
パケットが通過するテーブルとチェーンが表示されます。パケットがチェーンを通って移動しなくなることがわかります(実際には、パケットをキャプチャするチェーンによってキャプチャされFORWARD
ません)。これを行ういくつかの方法は次のとおりです。nat/POSTROUTING
SNAT
方法1
混乱を解決する最良の方法Webフィルタつまり、アプリケーションはメッセージの送信元IPアドレスを変更しますtun0.c
。これは最も自然な方法でもあります。私たちはする必要があります10.0.0.1を10.0.0.2に変更出る道と10.0.0.2~10.0.0.1帰り道に。ソースアドレス変更コードで修正しました
。tun0.c
新しいファイルです。そしてパッチファイルですあなたのためのtun0.c
。 IP ヘッダーの変更には以下も含まれます。チェックサムの修正だから、次のコードを取得しました。OpenVPNプロジェクト。以下は、クリーン再起動と起動後に実行したコマンドの完全なリストです tun0_changeip.c
。
ifconfig tun0 inet 10.0.0.1/30 up
sysctl -w net.ipv4.ip_forward=1
ip route add default dev tun0 table John
ip rule add from all lookup John
ip rule add from 10.0.0.2 lookup main priority 500
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.2 -j MASQUERADE
閉じる必要はありません。リバースパスフィルタリングこの場合、すべてが正当であるため、tun0
そのサブネットに属するパケットのみが受信および送信されます。インターフェイスベースのルーティングの代わりにソースベースのルーティングを実行することもできます。
方法#2
これはSNAT
、パケットがインターフェイスに到達する前に実行できます。tun0
しかし、それは正しくありません。必ず閉じなければなりませんリバースパスフィルタリングこの場合:
sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0
次に、次の操作を行いますSNAT
。 iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source ip.address.of.your.wlan.interface
ここではソースアドレスを変更します。今後パケットがtun0
デバイスに到着します。tun0.c
コードは、これらのパケットを「現状のまま」(変更された送信元アドレスに)再送信し、WLANインターフェイスを介して正常にルーティングされます。しかし、wlanインターフェイスに動的IPがあり、それを使用しようとすることができますMASQUERADE
(インターフェイスアドレスを明示的に指定しないため)。使用できる方法は次のとおりですMASQUERADE
。
iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source 10.0.55.1
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.55.1 -j MASQUERADE
IPアドレスを参照してください10.0.55.1
。これは違います。ここではどのIPでも使用できます。気にしません。以前に送信元 IP を変更した場合は、パケットがインターフェイスnat/POSTROUTING
のチェーンに到達した可能性があります。wlp2s0
WLAN インターフェイスの固定 IP に依存しません。
方法#3
を使用することもできますfwmark
。この方法は必要ありませんが、発信パケットのみをSNAT
キャプチャします。
まず無効にする必要があります。リバースパスフィルタリングtun0
他のネットワークに属するパケットを転送するため:
sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0
Now let's alter the routing rules a bit:
# Delete old rules
ip rule del iif tun0 lookup main
ip rule del from all lookup John
# Packets will start going from wlan interface so they will have source address of it
iptables -t mangle -A OUTPUT -o wlp2s0 -j MARK --set-mark 1
ip rule add fwmark 0x1 lookup John
これは別の「ハッカー」ですルーティングそしてWebフィルタこれは私のDebian 8コンピュータで動作しますが、もっと自然でハッキングを使用しないので、まだ最初のアプローチをお勧めします。
次のようにアプリケーションの構築を検討することもできます。透明プロキシ。私はこれがトンデバイスから来るパケットを分析するよりもはるかに簡単だと思います。