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はインターネットにアクセスできません!!
問題と解決策について何かご存知ですか?
サブネットのデフォルトトポロジは次のとおりです。
|--------------|
| 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
コンピューターBには、同じサブネット(192.168.1.0/24、正しいですか?)からのアドレスを持つ3つのインターフェースがあります。
Iptablesルールのいくつかを見てください:
Sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
-このルールは、eth2
からパケットが来たときに(ネットマスクに関する情報なしで)eth2
から192.168.1.3
へのルーティングを許可することを示します。このルールは完全に無意味です。
Sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
-上記とほぼ同じです。
チェーンiptables -F INPUT ACCEPT
のデフォルトルールを設定してから、iptables -F INPUT
を削除します。
だから、私がお勧めすること:
コンピューターBでは、3つのインターフェースすべてに異なるネットワークからのアドレスが必要です。同じネットワークで必要な場合は、それらをブリッジすることをお勧めします(1つのIPアドレスで3つすべてを集約する「マルチインターフェース」を作成します)。
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
質問の延長後に更新
使用しているネットワークアーキテクチャは、実際に意図したとおりに機能するようにはなっていません。コンピューターAは、コンピューターCをゲートウェイ(インターネット)に接続するネットワークとは別のネットワークを介してコンピューターCに接続する必要があります。しかし、2つの解決策があります。
"エレガントな方法"
VLANタグ付きイーサネットフレームに対してスイッチが透明であることが必要です(ポートにタグを付ける可能性のあるマネージドスイッチがないため)。スイッチが802.1qをサポートしている場合、そのように動作するはずです。
コンピューター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アドレスを割り当てないでください-不要です。
Eth0.100(コンピューターA)とethX(仮想マシンB)の同じネットワークからアドレスを設定します。 192.168.2.1/24(コンピューターA)と192.168.2.2/24(仮想マシンB)になるとします。
仮想マシンBには、コンピューターCのen1にブリッジされるもう1つのインターフェイス(タグなしインターフェイス)が必要です。アドレスが192.168.1.3/24であるとします。
次に、仮想マシン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
ルートはデフォルトgw 192.168.2.2を追加します
動作するはずです。
汚い方法汚い方法を試すことができます。 VLANは必要ありませんが、第3層で少し混乱します。
コンピューターAには、アドレス192.168.2.1/24のインターフェースeth0があります。
仮想マシンBには、ethXとethYの2つのインターフェイスがあります。両方とも、仮想マシン設定でen1(コンピューターC)にブリッジしました。
インターフェースethXのアドレスは192.168.2.2/24です。インターフェースethYのアドレスは192.168.1.3/24です。
エレガントな方法のポイント4と5にある同じコマンドを適用します。
動作するはずです。
ソリューションの問題は、同じネットワークから同じネットワークにトラフィックをルーティングしようとしていたことです。 2つの論理IPネットワーク間でのみトラフィックをルーティングできます(同じアドレス範囲からではありません)。ルーティングが必要な場合は、2つの異なるネットワークが必要です。この場合、192.168.1.0/24(既存のネットワーク)と192.168.2.0/24(コンピューターAと仮想マシンBを接続するネットワーク)。
この問題は、マシン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 :)