web-dev-qa-db-ja.com

ローカルIPトラフィックを外部インターフェイスに強制する

たとえば、私が好きなように構成できるいくつかのインターフェイスを備えたマシンがあります。

  • eth1:192.168.1.1
  • eth2:192.168.2.2

これらのローカルアドレスの1つに送信されたすべてのトラフィックを、他のインターフェイス経由で転送したいと思います。たとえば、192.168.1.1にあるiperf、ftp、httpサーバーへのすべての要求は、内部でルーティングされるだけでなく、eth2を介して転送される必要があります(外部ネットワークがパケットをeth1に再ルーティングします)。

Iptables、ip routeなどのいくつかのコマンドを試してみましたが、何も機能しませんでした。

私が得ることができる最も近い行動は、

ip route change to 192.168.1.1/24 dev eth2

内部でルーティングされている192.168.1.1を除いて、eth2ですべての192.168.1.xを送信します。 NAT eth1上の偽の192.168.1.2に向けられたすべてのトラフィックの転送を内部で192.168.1.1に再ルーティングできますか?私は実際にiptablesと格闘していますが、私には難しすぎます。

このセットアップの目標は、2台のPCを使用せずにインターフェイスドライバーのテストを行うことです。

私はLinuxを使用していますが、Windowsでそれを行う方法を知っている場合は購入します。

編集:

外部ネットワークは、eth1とeth2間の単なるクロスケーブルです。私のマシンにhttpサーバーがあるとします。同じサーバーからこのサーバーにアクセスしたいのですが、TCP/IPトラフィックにこのeth1/eth2ケーブルを強制的に通過させたいと思います。これのためにインターフェースをどのように構成する必要がありますか?

31
calandoa

応答パケットが見えなかったので、カラドナの答えを詳しく調べました。この例では:

  1. 私のローカルPCでは、異なるサブネットにNICがあります192.168.1/24192.168.2/24
  2. 両方のサブネットにアクセスできる外部ルーター/ PCがあります。
  3. ローカルPCのNICを介して双方向トラフィックを送信したい。
  4. この構成では、サブネットごとに2つの未使用のIPアドレスが必要です。

ローカルPCのiptableルートは、「偽の」IPへのSNATおよびDNAT発信トラフィックに設定されます。

iptables -t nat -A POSTROUTING -d 192.168.1.100 -s 192.168.2.0/24 -j SNAT --to-source      192.168.2.100
iptables -t nat -A PREROUTING  -d 192.168.1.100 -i eth0           -j DNAT --to-destination 192.168.1.1
iptables -t nat -A POSTROUTING -d 192.168.2.100 -s 192.168.1.0/24 -j SNAT --to-source      192.168.1.100
iptables -t nat -A PREROUTING  -d 192.168.2.100 -i eth1           -j DNAT --to-destination 192.168.2.1

ルールは次のことを行います。

  1. 発信パケットの192.168.2.1ソースを192.168.2.100に書き換えます
  2. 着信パケットの宛先192.168.1.100を192.168.1.1に書き換えます
  3. 発信パケットの192.168.1.1ソースを192.168.1.100に書き換えます
  4. 着信パケットで宛先192.168.2.100を192.168.2.1に書き換えます

要約すると、ローカルシステムはアドレス192.168.1.100および192.168.2.100の「仮想」マシンと通信できるようになりました。

次に、ローカルPCが外部ルーターを使用して偽のIPに到達するように強制する必要があります。これを行うには、ルーター経由でIPへの直接ルートを作成します。パケットを宛先サブネットの反対側に強制することを確認したいとします。

ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP 
ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP

最後に、これをすべて機能させるには、外部ルーターがローカルPC上の偽のIPに到達する方法を知っている必要があります。システムでプロキシARPをオンにすることで、シンを実行できます。

echo 1 | Sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp
echo 1 | Sudo tee /proc/sys/net/ipv4/ip_forward

この設定により、偽のIPをローカルPC上の実際のシステムとして扱うことができます。 .1サブネットにデータを送信すると、パケットが.2インターフェースから強制的に送信されます。 .2サブネットにデータを送信すると、パケットが.1インターフェースから強制的に送信されます。

ping 192.168.1.100
ping 192.168.2.100
14
cmcginty

Linuxで次のコマンドを使用して、「ループバック」モードの新しいデュアルポート10Gbpsカードのスループットをテストしました。つまり、一方のポートを他方に直接接続しました。これは、パケットをネットワークに送り出すための単なるブードゥーですが、そうしないと、Linuxはカーネルを介してトラフィックを短絡させるだけです(したがって、OPの質問)。上記のケーシーの答えでは、外部ルーターが必要かどうかはわかりませんが、以下は完全に自己完結型です。 2つのインターフェースはeth2とeth3です。

インターフェースにIPを割り当て、それらを別々のネットワークに配置します。

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

次に、二重のNATシナリオ:もう一方に到達するために使用された2つの新しい偽のネットワークを設定します。途中で、ソースNAT偽のネットワークに。途中で宛先を修正し、他のネットワークではその逆を行います。

# nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1

# nat inbound 10.60.0.1 -> 10.50.0.1
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1

# nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1

# nat inbound 10.60.1.1 -> 10.50.1.1
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1

次に、各偽のネットワークにアクセスする方法をシステムに伝え、arpエントリを事前に入力します(必ずMACアドレスを置き換えてください。自分のものは使用しないでください)。

ip route add 10.60.1.1 dev eth2
arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address

ip route add 10.60.0.1 dev eth3 
arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address

これは、実際にパケットをネットワークに送るのに十分なほどLinuxをだます。例えば:

ping 10.60.1.1

eth2から出て、ソースIP 10.50.0.1は10.60.0.1にNAT処理され、eth3に入ると、宛先10.60.1.1は10.50.1.1にNAT処理されます。そして、返信は同様の旅をします。

次に、iperfを使用してスループットをテストします。正しいIPにバインドし、接続しているIP(相手側の偽のアドレス)を確認します。

# server
./iperf -B 10.50.1.1 -s

# client: your destination is the other end's fake address
./iperf -B 10.50.0.1 -c 10.60.1.1 -t 60 -i 10

トラフィックが実際にネットワークに送信されていることを確認します。

tcpdump -nn -i eth2 -c 500

/ proc/interruptsを見て、カードが使用されていることを確認することもできます。

while true ; do egrep 'eth2|eth3' /proc/interrupts ; sleep 1 ; done

とにかく、私はこの投稿がこれを行う方法を検索していることを発見しました。Q&Aの皆さんに感謝します。これが将来この投稿を見つける他の人に役立つことを願っています。

28
Steve Kehlet

いつものように-私は少し遅れました-しかし今日では、ネットワーク名前空間を使用してインターフェースを分離し、ローカル転送を防ぐことができます(そしてiptablesをいじくります:))。

名前空間を作成します(すべて、必要な権限を使用して、たとえばrootとして):

ip netns add ns_server
ip netns add ns_client

インターフェースのステータス/構成には、割り当てられた名前空間のコンテキスト内でアクセスする必要があることに注意してください。ネイキッドip linkを実行しても、デフォルトの名前空間のコンテキストで実行されるため、インターフェイスは表示されません。 。名前空間内でコマンドを実行するには、次を使用します。

ip netns exec <namespace-name> <command>

接頭辞として。

名前空間をインターフェースに割り当て、設定を適用し、インターフェースを設定します。

ip link set eth1 netns ns_server
ip netns exec ns_server ip addr add dev eth1 192.168.1.1/24
ip netns exec ns_server ip link set dev eth1 up
ip link set eth2 netns ns_client
ip netns exec ns_client ip addr add dev eth2 192.168.1.2/24
ip netns exec ns_client ip link set dev eth2 up

これで、名前空間内でアプリケーションを実行できます-iperfサーバーの場合

ip netns exec ns_server iperf -s -B 192.168.1.1

そしてクライアント:

ip netns exec ns_client iperf -c 192.168.1.1 -B 192.168.1.2

これで、トラフィックは物理スタックを介して送信されます。ネットワークスタック全体、インターフェース、ルーティング...は名前空間によって分離されるため、カーネルはトラフィック内で使用されるアドレスをローカル(使用可能な)インターフェースと照合できません。

実験が完了したら、名前空間を削除するだけです。

ip netns del <namespace-name>

インターフェースはデフォルトの名前空間に再割り当てされ、名前空間内で行われたすべての構成は消えます(たとえば、割り当てられたIPアドレスを削除する必要はありません)。

19

はい、ようやく構成の設定に成功しました。

別の偽アドレスを使用して、この偽アドレスのルートをインターフェース2に強制し、NAT/iptablesを使用して偽アドレスを実際のアドレス2に変換するという考え方です。

私の設定は、実際にはIF1(インターフェース1)とIF2の間でTelnetできる1台のルーターで構成されています

私のセットアップでは、FAKE_ADDRとIF1_ADDRは同じサブネット上にあります。

ifconfig $IF1 $IF1_ADDR netmask 255.255.255.0
ifconfig $IF2 $IF2_ADDR netmask 255.255.255.0

iptables -t nat -A PREROUTING -d $FAKE_ADDR -i $IF2 -j DNAT --to-destination $IF2_ADDR
iptables -t nat -A POSTROUTING -s $IF2_ADDR -d $IF1_ADDR/24 -j SNAT --to-source $FAKE_ADDR

route add $FAKE_ADDR gw $ROUTER_ADDR

そしてルーターで:

route add $FAKE_ADDR gw $IF2_ADDR

FAKE_ADDRに何かを送信すると、pktはIF1を介してルーターに転送され、再度IF2に転送されます。その後、FAKE_IPがIF2_ADDRに置き換えられます。パケットはサーバーによって処理され、結果はIF2_ADDRからIF1_ADDRに送り返されます。IF2_ADDRはFAKE_ADDRに置き換えられます。

たった1本のクロスケーブルでより簡単な構成を使用することは可能かもしれませんが、私は試していなかったので、私は自分の実際的な解決策を与えることを好みます。

2
calandoa

上記のThomasTannhäuserの答えは正解でした。

私も同様の状況でした。2つのenetインターフェースを備えた単一のマシンです。私の計画は、1つのインターフェースをサーバー(受信側)として使用し、もう1つのインターフェースをクライアント(送信側)として使用することでした。各インターフェースはルーターに接続され、iperfはルーターを介してトラフィックを駆動し、スループット、PPS、遅延などを測定します。

残念ながら、iptablesのアプローチは直感的ではなく、問題が山積していました。イライラする数時間後、私はこの攻撃計画を断念しました。 Thomasの提案に触発されて、私はLinux IP名前空間について少し宿題をし、このソリューションのシンプルさと優雅さを高く評価し始めました。

以下は、この機能で機能するようにFedora FC26を構成するために使用した正確なコマンドのリストです。 2つのインターフェースはenp1s0とenp3s0です。ルータには、アドレス192.168.2.112と172.16.16.2の2つのインターフェイスがあります。各FC26 ENETコネクタは、対応するルーターインターフェイスに直接ケーブル接続されています。

# How to configure the IP Namespaces
ip netns add iperf-server
ip netns add iperf-client
ip link set enp1s0 netns iperf-server
ip link set enp3s0 netns iperf-client
ip netns exec iperf-server ip addr add dev enp1s0 192.168.2.139/20
ip netns exec iperf-client ip addr add dev enp3s0 172.16.16.2/24
ip netns exec iperf-client ip link set dev enp3s0 up
ip netns exec iperf-server ip link set dev enp1s0 up
ip netns exec iperf-server route add default gw 192.168.2.112
ip netns exec iperf-client route add default gw 172.16.16.1

# Test the interfaces and network using ping
ip netns exec iperf-client ping -c1 172.16.16.1
ip netns exec iperf-server ping -c1 192.168.2.112
ip netns exec iperf-server ping -c1 172.16.16.2
ip netns exec iperf-client ping -c1 192.168.2.139

# Start Iperf Server for UDP test
ip netns exec iperf-server iperf -u -s
# Run Client against Iperf server for UDP test
ip netns exec iperf-client iperf -u -c 192.168.2.139
1
RarkyMan

ここでは多くのことを行うため、正確性を完全に保証することはできませんが、元の質問は "send to self"テクニック と呼ばれるものを探しているようです。リンクされた検索は、私が思うところを示しています 最もよく維持されているカーネルパッチ トップリンク+ディスカッション、およびさまざまなメーリングリストでの他のアプローチとのパッチ、特に。 LKML。

Iproute2の "ip netns" を使用して ネットワーク名前空間 も確認する必要があると思います。これには、追加のインターフェースとルーティングの魔法も必要です。そのため、他の回答の大規模なiptablesフープラほど複雑ではないかもしれません。

コメントは、誰かがこれらについて何か有用なものを見つけた場合にどうしても歓迎します。

0
lkraav

Linuxボックスをルーター/ブリッジ/ゲートウェイ/ファイアウォールタイプのボックスにしたいようです。次のリソースがあなたが探しているものかもしれません:

Linuxルータープロジェクト

ルーターまたはファイアウォールのディストリビューションのリスト

Linux LiveCDルーター

Linux Journal-The Linux Router

詳細情報に基づいて更新:

自分のやりたいことができるとは思えない。 OSは常に内部ルーティングテーブルを調べ、両方のIPアドレスをローカルで「確認」します。その後、OS内でトラフィックをルーティングし、ネットワークに送信しません。 2台目のマシンまたは2台の仮想マシンが必要になります( Xen を確認してください)。

0
Peter

この記事を確認してください。ここでは、NAT転送を使用してvirtualbox vmへのインターネットアクセスを有効にするための詳細な手順について説明します。

http://jackal777.wordpress.com/2012/02/13/virtualbox-Host-only-networking-nat-for-internet-access/

0
Reynold