Linux에서 VLAN이 작동하는 방식에 대한 근본적인 오해가있는 것으로 보이며 여기에 좋은 사람들이 저를 교육시킬 수 있기를 바랍니다.
전송 : 하나의 Cisco 3560, 하나의 VLAN 및 하나의 Linux 상자 [1].
Cisco --------------- Linux
ge0/1 eth0
Cisco에는 IP 주소가 10.40.37.252/24 인 Vlan 37 인터페이스가 있습니다. Linux 상자에 10.40.37.1/24를 배치하고 싶습니다.
Cisco가 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
내가 여기서 무엇을 놓치고 있습니까?
편집 : 솔루션 :
mac 주소 테이블에 대한 Shane의 질문으로 해결책을 찾았습니다. “ip addr”을 사용하여 각 VLAN 하위 인터페이스에 서로 다른 고유 한 L2 (MAC) 주소를 설정하면 갑자기 작동합니다.
시도하지 않은 또 다른 해결책은 (하드웨어가 너무 오래 되었기 때문에) “ethtool”을 사용하여 NIC 자체에 의한 VLAN 오프로드를 비활성화하고 커널이 태그를 처리하도록하는 것입니다.
감사합니다 셰인!
편집 : 의견에 따른 추가 정보 :
전체적인 목표는 리눅스 박스에서 3 개의 개별 IP 주소에서 3 개의 VLAN (public, private, oam & p)을 종료하고 로컬 주소에 다른 애플리케이션을 바인딩하는 것입니다. 필요한 경우 더 확장 할 수는 있지만 문제 설명과 토론을 간단하게 유지하려고합니다. 세 개의 VLAN을 작동시키기 전에 하나의 작업이 필요하기 때문입니다. 🙂
앙투안 -> 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
척 -> 와이어 샤크 및 / 또는 태그를 보여 주지만,이 때문에 커널 [6]에서 VLAN을 취급 및 PCAP의 처리 순서에 분명히 리눅스에서 정상 제한하지 않습니다 tcpdump를. 또한 태그가 지정되지 않은 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입니다. “스위치 트렁크 기본 VLAN 1″로 수동 설정해도 아무런 영향이 없습니다.
답변
호스트가 vlan 37에만 액세스하도록 하시겠습니까, 아니면 호스트가 여러 vlan에 액세스하도록 하시겠습니까?
이 IOS 구성은 태그가 지정되지 않은 기본 VLAN을 37로 설정하는 것을 의미합니다 .
interface GigabitEthernet 0/1
switchport mode access
switchport access vlan 37
Linux 측에서 vconfig 명령은 vlan 37으로 태그가 지정된 트래픽에 대한 인터페이스 별명을 작성합니다 .
vconfig add eth0 37
문제가 보입니까? 스위치가 호스트에 태그없는 트래픽을 보내고 호스트가 태그 된 트래픽을 찾고 생성합니다.
예를 들어 네이티브 VLAN 37에서 eth0을 사용하거나 태그 된 트래픽을 전달하도록 스위치 conf를 변경하면됩니다.
interface GigabitEthernet 0/1
switchport trunk allowed vlan 37
switchport mode trunk
상당히 오래된 IOS 장치에서는 트럭 캡슐화를 8021q로 설정해야합니다. 기본값은 ISL입니다.
답변
이제 나는 리눅스 지식을 가지고 있지 않습니다. 스위칭 지식으로 가면 리눅스 머신에 eth0 인터페이스가 dot1q 트렁킹을 위해 구성되어 있습니까? Linux 시스템 내에서 여러 VLAN이 작동하는지 여부는 알 수 없지만 Vlan37의 일부로 작동하도록 구성된 단일 인터페이스가 있다고 가정하여 Linux 시스템의 NIC를 액세스 포트로 만듭니다. 액세스 포트는 트렁크 포트와 직접 통신 할 수 없으므로 트렁크 캡슐화를 만들거나 이해할 수 없습니다.
내가 이해 한 바에 따르면 Linux 시스템이 Vlan 37 내에서 작동하기를 원합니다. ge0 / 1 포트를 Vlan37의 액세스 포트로 되돌리고 Vlan37의 서브넷 아래에있는 모든 IP를 정기적으로 Linux 시스템에 할당하십시오. 단일 링크를 통해 여러 Vlan 정보를 전달하는 데만 사용되는 트렁킹은 실제로 필요하지 않습니다.
답변
스위치 구성에 문제가 있다고 생각합니다. 802.1q 태그를 사용하여 포트를 트렁크 모드로 설정 한 후 태그가있는 트래픽으로 VLAN 37을 전송하도록 스위치를 구성해야하며 태그가 지정되지 않은 트래픽에 다른 VLAN을 사용하도록 포트를 설정해야 할 수도 있습니다. 이 설정을 할 때 해당 포트에서 어떤 VLAN을 허용 / 거부해야하는지 설정해야했습니다. 내 IOS는 약간 녹슨지만 이것이 당신이 찾고있는 것이라고 생각합니다.
또한 패킷에 VLAN 태그가 표시되므로 eth0에서 wireshark를 사용하여 스위치 구성을 확인할 수 있어야합니다. Cisco LLDP 패킷은 또한 ge0 / 1 포트가 수행하는 작업에 대한 힌트를 제공 할 수 있습니다.