VLAN, VXLAN

 

Red Hat OpenStack Platform 8 문서를 보다가 neutron 에서 vlan vxlan 을 이용해서 network 를 구성하는데 … 어렵더라.

그래서 한번 찾아봤다.

IETF(Internet Engineering Task Force) 의 문서를 찾아봤는데, 아주 잘 나와 있었다. 아주 잘 이해하진 못했지만…

https://tools.ietf.org/html/rfc5517

위의 링크로 가면 볼 수 있다.

일단 기본 개념을 보면…

특별한 layer 2 전송 제한 조건을 적용하여 device isolate 를 달성 할 수 있는 매커니즘을 제공한다… 라고 나와있다.

IEEE 802.1Q wiki를 찾아보면… 이렇게 나와있다.

IEEE 802.1Q 는 하나의 이더넷 네트워크에서 가상 랜(VLAN)을 지원하는 네트워크 표준이다. 이 표준은 이더넷 프레임을 위한 VLAN 태그 추가 시스템과 더불어, 이러한 프레임을 관리 하는데 동반되는 브릿지와 스위치에 쓰이는 절차들을 정의한다. , 이 표준은 IEEE 802표준 위원회의 워킹 그룹인 ieee802.1이 개발한 것으로, 그 뒤로 IEEE 802.1ak, IEEE 802.1at, IEEE 802.1Qay 를 포함한 개정판들을 활발하게 개발 하고 있다…

여기에서 중요한게 위에 볼드체로 쓴것이다.

이 프레임 포맷을 보면…

20160811-1

위가 VLAN tagging이 없는것.. 아래가 있는것이다. 보면 2 계층과 3계층 사이에 4바이트가 더 들어가 있는것을 확인 할 수가 있다. 이는 2 계층에다가 12bit 만큼의 vlan id 를 붙이기 위함인데, 나머지 22bit는 뭘하는지 알아보자.

20160811-2

앞에 16bit TPID(Tag Protocol Identifier , 태그 프로토콜 식별자) 이다. 이는 IEEE 802.1Q 태그 프래임으로서, 프레임을 식별하기위해 0x8100 의 값으로 설정되어 있다. 2 계층 뒤에 0x8100 그러니까 binary로 보면 ‘0b1000000100000000’ 요렇게 되는데, 이게 붙으면 802.1Q 그러니까 VLAN tagging 이 되어 있다는것을 뜻한다. 반대로 이게 없으면 vlan 이 없다는 뜻이겟다.

다음 뒤에나오는 TCI(Tag Control Information, 태그 제어 정보) 인데 이게 각각 3부분으로 나눠진다.

PCP(Priority Code Point) : IEEE 802.1p 에서 정의된 우선도를 지정하는 3 bit 필드이다. 프레임의 우선도를 0(최저) 에서부터 7(최고) 까지 나타내며, 각종 트래픽(음성, 동영상, data ) 의 우선순위를 지정하는데 쓰일 수 있다.

CFI(Canonical Format Indicator) : 1 bit 의 필드로, 1이면 MAC 어드레스는 정규 포멧이 아닌것을 나타낸다. 0 이면, MAC 어드레스는 정규포맷인 것이다. 이더넷의 경우는 일반적으로 0 이다. 이는 이더넷과 토큰링의 상호접속시에 사용된다. 이더넷 포트에서 CFI 1인 프레임을 수신한 경우, 그 프래임은 태그가 붙지않은 포트로는 브릿지되지 않는다. (마지막 문장은 뭔말인지는 잘 모르겟지만 이렇게 써져 있다; )

이게 요즘에는 DEI (Drop Eligible Indicator) 라고 바뀌었다. 똑같이 1bit 필드로, PCP 와는 별도로, 또는 결합해서 쓰이며 트래픽이 혼잡해질 때 제거되기 적합한 프레임들을 가리키는데 사용된다. (라고 나와있다. )

VID(VLAN Identifier) : 12bit 의 필드로, 그 프레임이 속한 VLAN을 지정한다. 0인 경우에는 어느 VLAN에도 속해있지 않는것을 의미하고, 그와같은 802.1Q 태그는 단순히 우선도태그(priority tag) 로서 사용되게 된다. 0XFFF 라는 값은 예약되어 있다. 그 이외의 모든 값은 VLAN의 식별자로서 사용되는것으로, 4094 개의 VLAN을 취급한다. 브릿지 에서는, 1(0x001)을 관리용으로 예약되어 있는경우가 많다.

 

이중태그라는것도 있는데 …

인터넷 서비스 프로바이더에서는, 802.1ad 에서 규정된 이중 태깅이 사용되는 경우가 있다. 이로인해, 기존의 VLAN 태깅이 된 end user 트래픽을 혼합시키면서, 인터넷 서비스 프로바이더가 내부에서 독자로 VLAN태깅을 사용하는것이 가능하다. 서비스 태그 (S-TAG, 외부의 태그, 인터넷 서비스 프로바이더의 VLAN 태그) 를 앞에 두고, 커스토머 태그(C-TAG, 내부의 태그, end user VLAN 태그) 를 그 뒤에 둔다. 이 경우, 외부 태그의 TPID에는 0x9100, 0x9200, 0x9300 라고하는 값을 사용하기도 하지만, 802.1ad 의 규정에서는 외부의 태그의 TPID 에는 0x88a8 을 지정하도록 되어 있다.

마찬가지로 3중태깅도 가능하다…

Multiple VLAN Registration Protocol

이런것도 있는데… 이것은 브릿지군의 특정의 링크를 사용해서 VLAN의 집합에 대해 조정을 하는것이 가능하다. 이것은 switch 들 끼리 자동적으로 VLAN 태깅 정보를 주고 받을 때 사용한단다.

 

자 이제 실제로 한번 써보자…

 

NetworkManager 를 이용한 nmcli 로 하였다. 이는 gui tui 도 동일하게 할 수 있을것이다…(cli밖에 안해봄 ㅎㅎㅎ teaming 인가가 버그가 있어서 guitui 에서는 안되고 cli에서 만 된 적도 있엇다. )

 

[root@vlan1 ~]# nmcli connection add con-name vlan2000 ifname vlan2000-if type vlan dev ens9 id 2000

연결 ‘vlan2000’ (6fabe0ee-34bf-4c6a-8bfe-6e27e68d82cb)이 성공적으로 추가되었습니다.

### vlan1 server 에서 vlan device 를 생성한다. Con-name 이나 ifname 은 생략해도 된다. 생략 할경우 알아서 vlan id 에 맞게 만들어진다. 위는 vlan id 2000 으로 하여 만들었다.

[root@vlan1 ~]# nmcli con mod vlan2000 ipv4.addresses 20.0.0.20/24 ipv4.method manual ipv4.never-default yes connection.autoconnect yes

### ip 설정은 일반설정과 동일하게 하면된다. 위에서는 dns 설정을 하지 않았다.

 

[root@vlan2 ~]# nmcli con add con-name vlan2000-2 ifname vlan2000-2if type vlan dev ens9 id 2000

연결 ‘vlan2000-2’ (afec4f3e-2882-4099-8fa6-395d34dc4eef)이 성공적으로 추가되었습니다.

[root@vlan2 ~]# nmcli con mod vlan2000-2 ipv4.addresses 20.0.0.22/24 ipv4.never-default yes ipv4.method manual connection.autoconnect yes

### vlan2 server 에서도 동일한 vlan id interface 를 설정 해준다.

 

[root@vlan1 ~]# nmcli con up vlan2000

[root@vlan2 ~]# nmcli con up vlan2000-2

### 각각의 server 에서 vlan interface up 상태로 만들어 주고…

[root@vlan1 ~]# ping 20.0.0.22 -c 1

PING 20.0.0.22 (20.0.0.22) 56(84) bytes of data.

64 bytes from 20.0.0.22: icmp_seq=1 ttl=64 time=2.30 ms

 

— 20.0.0.22 ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 0ms

rtt min/avg/max/mdev = 2.308/2.308/2.308/0.000 ms

### server vlan1 에서 server vlan2 ping을 보냈는데 잘 간다. ㅎㅎ 이제 id를 바꿔서 한번 test를 해보자.

 

[root@vlan2 ~]# nmcli con mod vlan2000-2 vlan.id 4000

[root@vlan2 ~]# nmcli con down vlan2000-2

Connection ‘vlan2000-2’ successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/11)

[root@vlan2 ~]# nmcli con up vlan2000-2

연결이 성공적으로 활성화되었습니다 (D-Bus 활성 경로: /org/freedesktop/NetworkManager/ActiveConnection/12)

[root@vlan1 ~]# !pi

ping 20.0.0.22 -c 1

PING 20.0.0.22 (20.0.0.22) 56(84) bytes of data.

 

— 20.0.0.22 ping statistics —

1 packets transmitted, 0 received, 100% packet loss, time 0ms

### vlan1 에서 vlan2 로 똑같이 ping 을 보냈는데 가지 않는것을 확인 할 수 있다.

 

조금 응용해서 다른 test 도 해보았다.

server : vlan1

ip address : 30.0.0.30/24

vlan id : 2003

 

server : vlan2

ip address : 30.0.0.31/24

vlan id : 2003

 

server : vlan3

ip address : 30.0.0.31/24

vlan id : 2001

 

이렇게 준비 해서 vlan이 다른 동일 ip를 지정 가능한지를 알아 보았다.

 

[root@vlan1 ~]# ping 30.0.0.31 -c 1

PING 30.0.0.31 (30.0.0.31) 56(84) bytes of data.

64 bytes from 30.0.0.31: icmp_seq=1 ttl=64 time=0.919 ms

 

— 30.0.0.31 ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 0ms

rtt min/avg/max/mdev = 0.919/0.919/0.919/0.000 ms

### 30.0.0.31, vlan id 2003 으로 핑을 보낸다.

[root@vlan2 ~]# !tcp

tcpdump -i any icmp

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes

09:24:10.911595 ethertype IPv4, IP 30.0.0.30 > vlan2.test.dom: ICMP echo request, id 4622, seq 1, length 64

09:24:10.911595 IP 30.0.0.30 > vlan2.test.dom: ICMP echo request, id 4622, seq 1, length 64

09:24:10.911742 IP vlan2.test.dom > 30.0.0.30: ICMP echo reply, id 4622, seq 1, length 64

09:24:10.911747 ethertype IPv4, IP vlan2.test.dom > 30.0.0.30: ICMP echo reply, id 4622, seq 1, length 64

### vlan id 가 같은 server vlan2 가 핑을 받는것을 알 수 있다.

[root@vlan1 ~]# nmcli con mod vlan2001 vlan.id 2001

[root@vlan1 ~]# nmcli con down vlan2001

Connection ‘vlan2001’ successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/25)

[root@vlan1 ~]# nmcli con up vlan2001

연결이 성공적으로 활성화되었습니다 (D-Bus 활성 경로: /org/freedesktop/NetworkManager/ActiveConnection/30)

[root@vlan1 ~]#

### server vlan1 vlan id 2003에서 2001 로 바꾸었다.

[root@vlan1 ~]# !pi

ping 30.0.0.31 -c 1

PING 30.0.0.31 (30.0.0.31) 56(84) bytes of data.

64 bytes from 30.0.0.31: icmp_seq=1 ttl=64 time=4.60 ms

 

— 30.0.0.31 ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 0ms

rtt min/avg/max/mdev = 4.606/4.606/4.606/0.000 ms

### server vlan1 에서 30.0.0.31 로 핑을 보낸다.

[root@vlan3 yum.repos.d]# tcpdump -i any icmp

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes

09:29:16.139382 ethertype IPv4, IP 30.0.0.30 > vlan3.test.dom: ICMP echo request, id 5010, seq 1, length 64

09:29:16.139382 IP 30.0.0.30 > vlan3.test.dom: ICMP echo request, id 5010, seq 1, length 64

09:29:16.139608 IP vlan3.test.dom > 30.0.0.30: ICMP echo reply, id 5010, seq 1, length 64

09:29:16.139615 ethertype IPv4, IP vlan3.test.dom > 30.0.0.30: ICMP echo reply, id 5010, seq 1, length 64

### 이번엔 server vlan3 이 핑을 받는것을 알 수 있다.

vlan 만 다르면 같은 ip를 지정해도 아무 문제가 없이 통신이 잘 되는것을 알 수있다.

 

vxlan 은 다음 이시간에

댓글 남기기