いくつかのテストの目的で、単一のコンピュータで複数のソケットベースのアプリケーションを実行し、それらの間の「実際の」ネットワーク条件をシミュレートしようとしています。最も簡単な方法は、コンピュータが接続されているルータを介してアプリケーション間のすべてのトラフィックをリダイレクトすることです。直感的に、これは同じネットワークに接続されている複数のシステムとある程度似ている必要があり、ネットワーク自体はローカルシステム間のソケット接続ではなくルータ(100Mbps)の機能によって制限される必要があります。
マイコンピュータ(192.168.1.101)は、インターフェイスを介してルータ(192.168.1.2)に直接接続されますem1
。 IPパスを追加してこれを実行しようとしました。私のip Routeコマンドの結果は次のとおりです。
default via 192.168.1.2 dev em1 proto static metric 1024
192.168.1.0/24 dev em1 proto kernel scope link src 192.168.1.101
192.168.1.101 via 192.168.1.2 dev em1
しかし、これは何の効果もないようです。 localhostをpingすると、マイコンピュータ(192.168.1.101)の間接pingとほぼ同じ結果(約0.040ミリ秒)が返されるためです。同時に、ネットワーク上の他のコンピュータでpingを実行すると、ping時間は約0.3〜0.5ミリ秒になります。
私はTracerouteを試してみましたが、これは私が得たものです:
$traceroute 192.168.1.200 # my other computer
traceroute to 192.168.1.200 (192.168.1.200), 30 hops max, 60 byte packets
1 192.168.1.200 (192.168.1.200) 1.005 ms 0.972 ms 0.954 ms
$traceroute 192.168.1.101
traceroute to 192.168.1.101 (192.168.1.101), 30 hops max, 60 byte packets
1 localhost.localdomain (192.168.1.101) 0.051 ms 0.014 ms 0.013 ms
$traceroute 127.0.0.1
traceroute to 127.0.0.1 (127.0.0.1), 30 hops max, 60 byte packets
1 localhost.localdomain (127.0.0.1) 0.053 ms 0.015 ms 0.013 ms
私が何かを見逃しているのでしょうか、それとも完全に間違った方法でやっているのでしょうか?
答え1
問題は、テーブルlocal
に次のパスがあることです。
$ ip route show table local
[...]
local 192.168.1.101 dev eth0 scope host
[...]
[src = 192.168.1.101 dst = 192.168.1.101]にパケットを送信し、ルータが反射のためにそのパケットを再送信することを期待するとき(一部の人はこの種のものを拒否します)、発信パケットはそのパスをスキップしますしたいが返されたパケットではありません。
これを行うには、以下を変更できますip
rules
。
local
テーブルを削除するための包括的な規則
# ip rule del from all table local
192.168.1.101->192.168.1.101 パケットに対してこの操作を実行していないものと交換します。
# ip rule add not from 192.168.1.101 to 192.168.1.101 table local pref 0
次に、netfilterを使用して着信パケットを表示します。
# iptables -t mangle -I PREROUTING -s 192.168.1.101 -d 192.168.1.101 -j MARK --set-mark 1
local
そして、そのテーブルのみを使用するようにIPルールに指示します。
# ip rule add fwmark 1 table local pref 1
(もちろんip route add to 192.168.1.101 via 192.168.1.2
机の上にも必要ですmain
)