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 를 포함한 개정판들을 활발하게 개발 하고 있다…
여기에서 중요한게 위에 볼드체로 쓴것이다.
이 프레임 포맷을 보면…
위가 VLAN tagging이 없는것.. 아래가 있는것이다. 보면 2 계층과 3계층 사이에 4바이트가 더 들어가 있는것을 확인 할 수가 있다. 이는 2 계층에다가 12bit 만큼의 vlan id 를 붙이기 위함인데, 나머지 22bit는 뭘하는지 알아보자.
앞에 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 인가가 버그가 있어서 gui나 tui 에서는 안되고 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 은 다음 이시간에…