Linuxですべてのトラフィックが1つのインターフェイスを通過する方法

Linuxですべてのトラフィックが1つのインターフェイスを通過する方法

自己作成インターフェース tun0ターン/タップに基づいて)受信した内容を出力します。
このインターフェイスを通過するには、システムからのすべてのトラフィックが必要です。
このインターフェイスの機能は次のとおりです。

  1. 潜在的に検閲されたパケットを識別してトンネリングします。
  2. 他のすべての車両は邪魔されずに通過します。

推測できるように、私は検閲防止ツールを構築しようとしています。
トンネルの決定は tun0 プロセス内で行う必要があります。
なぜなら、そこでのみ信頼できるDNSを使用できるからです。

独自に作成されたインターフェイス tun0 を介してすべてのトラフィックフローを作成する方法を教えてくれる場合は、お手伝いが必要です。 tun0を変更する必要がある場合は、その変更を提供するように依頼してください。

以下は、tun0を介してすべてのトラフィックを取得しようとしましたが、失敗(ping失敗)した方法です。

編む

  1. gcc tun0.c
  2. sudo ./a.out

構成

  1. sudo ip addr add 10.0.0.1/24 dev tun0
  2. Johnテーブルの作成

    $ cat /etc/iproute2/rt_tables 
    #
    # reserved values
    #
    255     local
    254     main
    253     default
    0       unspec
    #
    # local
    #
    #1      inr.ruhep
    
    200 John
    

順序が重要です:

  1. sudo ip rule add from all lookup John
  2. sudo ip route add default dev tun0 table John
  3. 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 
    

トラブルシューティング

  1. sudo tcpdump -i wlp2s0 -qtln icmpこれにより、ping -I tun0 8.8.8.8パケットがキャプチャされていないことがわかります。これは、ルールを介してtun0からwlp2s0にパケットが送信されなかったことを意味しますiif tun0 lookup main

  2. tun0どこでも交換するとlo私に効果的です。

また試み

  1. リバースパスフィルタリングをオフにします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通過し、ローカルアドレスがあるため)。パケットをキャプチャしましたが、これまでは素晴らしかったです。今すぐパケットを送信します。tun010.0.0.1
tun0ソースアドレスはい10.0.0.1、パケットは別のインターフェイスを通過したい(wlp2s0あなたの場合)。それはルーティングまず、ルーティングを有効にしてみましょう。

sysctl -w net.ipv4.ip_forward=1

後で見ると、パケットにwlanインターフェイスのソースアドレスではなくソースアドレスがあることがわかりますtcpdump(予想していたようです)。したがって、ソースアドレスを変更する必要があります。wlp2s010.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インターフェイスからwlp2s0Webフィルタ送信元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/POSTROUTINGSNAT

方法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のチェーンに到達した可能性があります。wlp2s0WLAN インターフェイスの固定 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コンピュータで動作しますが、もっと自然でハッキングを使用しないので、まだ最初のアプローチをお勧めします。


次のようにアプリケーションの構築を検討することもできます。透明プロキシ。私はこれがトンデバイスから来るパケットを分析するよりもはるかに簡単だと思います。

関連情報