LinuxでVLANがどのように機能するかについて、いくつかの根本的な誤解があるようですが、ここの優秀な人々が私を教育してくれることを願っています。
キャスト:1つのCisco 3560、1つのVLAN、および1つのLinuxボックス[1]。
Cisco --------------- Linux
ge0/1 eth0
シスコには、IPアドレス10.40.37.252/24のVlan 37インターフェイスがあります。 Linuxボックスに10.40.37.1/24を配置します。
シスコがVLAN 37のカプセル化を解除すると、すべてが正常に機能します[2]。
# Cisco
interface Vlan37
ip address 10.40.37.252/24
interface GigabitEthernet 0/1
switchport mode access
switchport access vlan 37
# Linux
ip link set eth0 up
ip addr add 10.40.37.1/24 dev eth0
$ ping 10.40.37.252 && echo It works
ただし、ポートをトランキングに設定し、Linux側でvlan 37を割り当てると、動作しなくなります。
# Cisco
interface GigabitEthernet 0/1
switchport trunk encapsulation dot1q
switchport mode trunk
! [3] [4] [7]
# Linux
vconfig add eth0 37
ip link set eth0.37 up
ifconfig eth0 0.0.0.0 up # ensure no address
ip addr add 10.40.37.1/24 dev eth0.37
$ ping 10.40.37.252 || echo Why does this not work
ここで何が欠けていますか?
編集:ソリューション:
ShaneのMACアドレステーブルに関する質問が解決策につながりました。「ip addr」を使用して、VLANサブインターフェイスのそれぞれに異なる一意のL2(MAC)アドレスを設定すると、突然動作します。
(ハードウェアが古すぎるため)私が試さなかった別の可能な解決策は、「ethtool」を使用してVLANオフロードをNIC自体によってオフロードすることです。カーネルにタグを処理させる。
シェーン、ありがとう!
編集:コメントごとの詳細情報:
全体的な目標は、3つのvlan(パブリック、プライベート、oam&p)がlinuxボックス上の3つの個別のIPアドレスで終端し、さまざまなアプリケーションがローカルアドレスにバインドすることです。必要に応じてさらに拡張できますが、問題の説明とディスカッションをシンプルに保つようにしています。3つのVLANを機能させる前に、1つは機能する必要があるからです。 :)
Antoine-> ifupとifconfigで違いはありません。
Pepoluan->これがあなたが探していたものだと思います。 phyドライバーによる参照の欠如は明らかに正常であることに注意してください。 [5]
$ lsmod | grep 802
8021q 25545 1 cxgb3
便利屋->
$ ifconfig eth0
eth0 Link encap: Ethernet HWaddr 00:17:08:92:87:22
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 [...]
TX packets:31932 errors:0 dropped:0 overruns:0 carrier:0
$ ifconfig eth0.37
eth0.37 Link encap: Ethernet HWaddr 00:17:08:92:87:22
UP BROADCAST RUNNING MULTICAST MUT:1500 Metric:1
RX packets: 0 [...]
TX packets:32024 errors:90 dropped:0 overruns:0 carrier:0
$ cat /proc/net/vlan/config
VLAN Dev Name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
eth0.37 | 37 | eth0
Chuck-> Wiresharkやtcpdumpはタグを表示しませんが、カーネルでのVLAN処理とpcapの処理順序により、これは明らかにLinuxの通常の制限です[6]。また、タグなしのVLAN=は1 [7]に設定されます。
[1]私はCentOS 5.5とUbuntu 11.04の両方でこれを試しましたが、どちらにも同じ問題があります。
[2]設定はカット&ペーストではないので、ここでのタイプミスは単に私の悪いメモリです。
[3]「ネゴシエートしない」をオンまたはオフにしても、問題には影響しません。
[4] VLAN 37はリンク上でアクティブでプルーニングされていないものとして表示されるため、「許可」は問題ではありません。
[5] serverfault: nicで8021qを有効にする
[6] http://wiki.wireshark.org/CaptureSetup/VLAN#Linux
[7]ネイティブ(タグなし)VLANは1です。 "switchport trunk native vlan 1"で手動で設定しても効果はありません。
ホストにvlan 37のみへのアクセスを許可しますか、それともホストに複数のvlanへのアクセスを許可しますか?
このIOS構成は、ネイティブ(タグなし)vlanを37に設定することを意味します。
interface GigabitEthernet 0/1
switchport mode access
switchport access vlan 37
Linux側では、vconfigコマンドはトラフィックのインターフェースエイリアスtaggedをvlan 37として作成します。
vconfig add eth0 37
あなたは問題を見ますか?スイッチはホストのタグなしトラフィックを送信しており、ホストはタグ付きトラフィックを検索/生成しています。
ネイティブVLAN 37でeth0を使用するか、スイッチの設定を変更して、タグ付きトラフィックを通過させる必要があります。
interface GigabitEthernet 0/1
switchport trunk allowed vlan 37
switchport mode trunk
かなり古いIOSデバイスでは、デフォルトでISLになるため、トラックのカプセル化を8021qに設定する必要があります。
問題はスイッチの設定にあると思います。 802.1qタグを使用してポートをトランクモードに設定した後、VLAN 37をタグ付きトラフィックとして送信するようにスイッチを構成する必要があります。また、タグなしトラフィックに別のVLANを使用するようにポートを設定する必要がある場合もあります。これを設定するときに、そのポートで許可または拒否するVLANも設定する必要がありました。私のIOSは少し錆びていますが、これがあなたが探しているものだと思います。
VLANタグがパケットに表示されるため、eth0でWiresharkを使用してスイッチ構成を確認することもできます。CiscoLLDPパケットは、どのポートge0/1人がやっています。
現在、私はこのLinuxの専門家ではありません。私のスイッチングの知識を参考にすると、Linuxマシンにeth0インターフェイスがdot1qトランキング用に構成されていますか? Linuxマシン内で動作する複数のVLANが提供されているかどうかはわかりませんが、Vlan37の一部として機能するように構成されている単一のインターフェースがあると想定し、LinuxマシンのNICアクセスポートになるアクセスポートは、トランクポートと直接通信できないため、トランキングカプセル化を作成または理解できません。
LinuxマシンをVlan 37内で動作させたいと私が理解していることから、ge0/1ポートをVlan37の下のアクセスポートに戻し、LinuxマシンにVlan37のサブネットの下のIPを定期的に割り当てるだけです。単一のリンクで複数のVLAN情報を伝達するためだけに使用されるトランキングは実際には必要ありません。