web-dev-qa-db-ja.com

マシンのすべてのトラフィックをサブネット内の別のトラフィックにルーティングしますか?

2台のコンピューターがあり、どちらもubuntu 12.04 64ビットを実行しています。あるコンピューターのトラフィックを別のコンピューターにルーティングする必要があります。

computer A: 192.168.1.3 (eth0)

computer B: 192.168.1.7 (eth0), 192.168.1.5 (eth1), 192.168.1.6 (eth2)

最後の実験を実行するには、コンピューターBにこれらの3つのインターフェイスが必要です...

BTWコンピューターBは、別のホスト上の仮想マシンで実行されています。

コンピューターAのデフォルトのgwを次のように変更します。

Sudo sudo ip route del
Sudo ip route add default via 192.168.1.6

コンピューターAのroute -nの出力は次のとおりです。

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.6     0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

また、コンピューターBでこのスクリプトを実行します。

#!/bin/bash

IF="eth2"
ADDR="192.168.1.3"

Sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
Sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_dynaddr'

Sudo iptables -P FORWARD DROP
Sudo iptables -F FORWARD
Sudo iptables -t nat -F
Sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
Sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
Sudo iptables -t nat -A POSTROUTING -s $ADDR -j MASQUERADE

これらの指示の後、コンピューターAはインターネットにアクセスできません!!

問題と解決策について何かご存知ですか?

編集1

サブネットのデフォルトトポロジは次のとおりです。

                                             |--------------|  
                                             |    Comp C    |
    |----------| eth0   |----------|      en0| |----------| |
    |  CompA   |--------|   switch |---------| |   VM  B  | |
    |----------|        |-----|----|         | |----------| |
                              |              |--------------| 
                              |
                         ( Internet )
                          (        )

更新

コンピューターA:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.2     0.0.0.0         UG    0      0        0 eth0.100
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0.100

仮想マシンB:

eth0はnatを介して接続されます。

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.233.2    0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
172.16.233.0    0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
192.168.2.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2
1
N. S.

コンピューターBには、同じサブネット(192.168.1.0/24、正しいですか?)からのアドレスを持つ3つのインターフェースがあります。

Iptablesルールのいくつかを見てください:

  1. Sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT-このルールは、eth2からパケットが来たときに(ネットマスクに関する情報なしで)eth2から192.168.1.3へのルーティングを許可することを示します。このルールは完全に無意味です。

  2. Sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT-上記とほぼ同じです。

  3. チェーンiptables -F INPUT ACCEPTのデフォルトルールを設定してから、iptables -F INPUTを削除します。

だから、私がお勧めすること:

  1. コンピューターBでは、3つのインターフェースすべてに異なるネットワークからのアドレスが必要です。同じネットワークで必要な場合は、それらをブリッジすることをお勧めします(1つのIPアドレスで3つすべてを集約する「マルチインターフェース」を作成します)。

  2. Iptablesの詳細を読み、理解してください。とても簡単です。たとえば、コンピューターAとコンピューターBを接続する192.168.1.0/24ネットワークがある場合、最も簡単な方法はNATをそのようにすることです(コンピューターB):

 iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.1.0/24 -j MASQUERADE 
 iptables -A FORWARD -s 192.168.1.0/24 -d 0/0 -j ACCEPT 
 iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -j ACCEPT 
  1. または、最も簡単な方法-コンピューターBのすべてのインターフェイスをブリッジします。その後、NATを使用する必要はありません。

質問の延長後に更新

使用しているネットワークアーキテクチャは、実際に意図したとおりに機能するようにはなっていません。コンピューターAは、コンピューターCをゲートウェイ(インターネット)に接続するネットワークとは別のネットワークを介してコンピューターCに接続する必要があります。しかし、2つの解決策があります。

"エレガントな方法"

VLANタグ付きイーサネットフレームに対してスイッチが透明であることが必要です(ポートにタグを付ける可能性のあるマネージドスイッチがないため)。スイッチが802.1qをサポートしている場合、そのように動作するはずです。

  1. コンピューターAとCにVLANインターフェイスを作成する必要があります。たとえば、Sudo vconfig add eth0 100。このコマンドは、タグ付きインターフェースeth0.100を作成します。コンピューターCでコマンドSudo vconfig add en1 100を実行します。インターフェイスen1.100があります。仮想マシンの設定では、仮想インターフェイスethXとen1.100をブリッジする必要があります。 en1.100(コンピューターC)にIPアドレスを割り当てないでください-不要です。

  2. Eth0.100(コンピューターA)とethX(仮想マシンB)の同じネットワークからアドレスを設定します。 192.168.2.1/24(コンピューターA)と192.168.2.2/24(仮想マシンB)になるとします。

  3. 仮想マシンBには、コンピューターCのen1にブリッジされるもう1つのインターフェイス(タグなしインターフェイス)が必要です。アドレスが192.168.1.3/24であるとします。

  4. 次に、仮想マシンCでNATを構成する必要があります。

iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE 
 iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ACCEPT 
 iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPT 
  1. コンピューターAにデフォルトゲートウェイを追加します。
ルートはデフォルトgw 192.168.2.2を追加します

動作するはずです。

汚い方法汚い方法を試すことができます。 VLANは必要ありませんが、第3層で少し混乱します。

  1. コンピューターAには、アドレス192.168.2.1/24のインターフェースeth0があります。

  2. 仮想マシンBには、ethXとethYの2つのインターフェイスがあります。両方とも、仮想マシン設定でen1(コンピューターC)にブリッジしました。

  3. インターフェースethXのアドレスは192.168.2.2/24です。インターフェースethYのアドレスは192.168.1.3/24です。

  4. エレガントな方法のポイント4と5にある同じコマンドを適用します。

動作するはずです。

ソリューションの問題は、同じネットワークから同じネットワークにトラフィックをルーティングしようとしていたことです。 2つの論理IPネットワーク間でのみトラフィックをルーティングできます(同じアドレス範囲からではありません)。ルーティングが必要な場合は、2つの異なるネットワークが必要です。この場合、192.168.1.0/24(既存のネットワーク)と192.168.2.0/24(コンピューターAと仮想マシンBを接続するネットワーク)。

1

この問題は、マシンBを仮想マシンではなく単一の実マシンに入れると解決されます。その後、IPアドレス192.168.2.2のeth0.1がマシンAに作成され、IPアドレス192.168.2.1のeth0.1がマシンBに作成されます。

マシンAのデフォルトゲートウェイを設定します。

Sudo route del default gw 192.168.1.1
Sudo route add default gw 192.168.2.1

マシンBでこの命令を実行します。

Sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPT

これで、マシンAのトラフィックはマシンBから正しくルーティングされます。ガイドに感謝します@Krzysztof Sawicki :)

0
N. S.