# 들어가기 전에
# overlay network 실제 네트워크가 위에서 동작하는 가상네트워크다.
# overlay network 로 물리적으로 떨어져 있는 네트워크들도 마치 같은 네트워크에 있는 LAN 처럼 취급할 수 있다.
# 종류로 Virtual eXtensible LAN (VXLan)가 있다.
# OSI7계층 중 L2(datalink), L3(network) 에 걸쳐 사용되고, L2 프레임을 캡슐화해 터널링한다.
# MTU(Maximum Transmission Unit)는 패킷이나 프레임단위로 전송할때 최대 크기로 일반적으로 1500byte 으로 설정되는데 VXLan 사용시 캡슐화에 50byte 가 필요하기 때문에 1450byte 로 설정한다.
# ICMP(Internet Control Message Protocol) 는 L3 동작하며 대상 IP 의 상태(이상없는지)를 확인하는 프로토콜이다.
# ARP(Address Resolution Protocol)은 L3 동작하며 IP 주소를 L2의 물리주소(MAC, Media Access Control)주소로 바인딩시키기 위한 프로토콜이다.
# FDB(Fowarding DataBase)는 L2 에서 포워딩을 위해 MAC 주소를 저장하고 있다.
#####
# 테스트 환경 : vagrant ubuntu-1804
HOST_NAME = "ubuntu1804" # node1 192.168.104.2
HOST_NAME2 = "ubuntu1804-2" # node2 192.168.104.3
# node1,2 각각 접속시
vagrant ssh ubuntu184
vagrant ssh ubuntu184-2
# vxlan 으로 노드간 통신하기
# node1, node2 는 다음과 같이 구성(연결)할 것이다.
[node1]
pinkns(eth0:12.12.12.2/24) <-> overns(veth1 <-> br0:arp참고 <-> vxlan1:fdb참고) <-> host(eth1:192.168.104.2) <-> 외부
[node2]
pinkns(eth0:12.12.12.3/24),skyns(eth0:12.12.12.4/24) <-> overns(veth1 <-> br0:arp참고 <-> vxlan1:fdb참고) <-> host(eth1:192.168.104.3) <-> 외부
# node1, node2 각각 overns, pinkns 이름의 network namespace(netns) 생성
ip netns add overns
ip netns add pinkns
# node1, node2 각각 network namespace 확인
ip netns
# node1, node2 각각 veth1(overns) <-> eth0(pinkns) 연결(link 생성)
ip link add dev veth1 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns pinkns
# 참고로 ip netns exec overns 대신 overns 에 조인해서 작업할 경우
# 작업후 호스트 network namespace 로 돌아오기 위해 exit 잊지 말자.
# nsenter --net=/var/run/netns/overns
# node1(overns), node2(overns) 에서 ip link 확인
ip netns exec overns ip link
# node1(pinkns) 에서 �eth0 에 mac,ip address 추가
ip netns exec pinkns ip link set dev eth0 address 02:42:c0:a8:00:02
ip netns exec pinkns ip addr add dev eth0 12.12.12.2/24
# node2(pinkns) 에서 eth0 에 mac,ip address 추가
ip netns exec pinkns ip link set dev eth0 address 02:42:c0:a8:00:03
ip netns exec pinkns ip addr add dev eth0 12.12.12.3/24
# node1(overns), node2(overns) 에서 bridge 생성
ip netns exec overns ip link add dev br0 type bridge
ip netns exec overns ip addr add dev br0 12.12.12.1/24
# node1(overns), node2(overns) 에서 ip, link 확인
ip netns exec overns ip a
ip netns exec overns ip link
# node1, node2 에서 vxlan(overns) 생성
# type vxlan : vxlan 타입 생성
# id 42 : vxlan 식별자 42
# proxy : vxlan 이 ARP 요청에 대신 응답하도록 설정
# learning : 커널이 패킷을 파악해 bridge FDB 를 자동으로 설정할 수 있도록 설정
# dstport 4789 : vxlan 터널링에 사용하는 UDP 포트로 4789 사용
ip link add dev vxlan1 netns overns type vxlan id 42 proxy learning dstport 4789
# node1(overns), node2(overns) 에서 veth1 <-> br0 연결
ip netns exec overns ip link set veth1 master br0
# node1(overns), node2(overns) 에서 vxlan1 <-> br0 연결
ip netns exec overns ip link set vxlan1 master br0
# node1, node2 각각 overns, pinkns 의 장치들 모두 power on
ip netns exec overns ip link set br0 up
ip netns exec overns ip link set vxlan1 up
ip netns exec overns ip link set veth1 up
ip netns exec pinkns ip link set eth0 up
# node1(overns) 에서
# 목적지 ip(12.12.12.3),mac(02:42:c0:a8:00:03)를 사용하는 vxlan1 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.3 lladdr 02:42:c0:a8:00:03 dev vxlan1
# node2(overns)에서
# 목적지 ip(12.12.12.2),mac(02:42:c0:a8:00:02)를 사용하는 vxlan1 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.2 lladdr 02:42:c0:a8:00:02 dev vxlan1
# node1(overns), node2(overns) 에서 neighbor 확인
ip netns exec overns ip neighbor show
# node1(overns) 에서
# bridge fdb 설정 추가
# 192.168.104.3 : 목적지 IP
# 42 : 목적지 vni(VXLAN Network Identifier) ID
# 4789 : 목적지 Port
# 다음과 같이 수동으로 설정하면 permanent 하게 유지된다.
ip netns exec overns bridge fdb add 02:42:c0:a8:00:03 dev vxlan1 self dst 192.168.104.3 vni 42 port 4789
# node1(overns) 에서 fdb 설정 확인하면 permanent 표시가 있다.
ip netns exec overns bridge fdb show | grep 02:42:c0:a8:00:03
# node1(overns) 에서 br0, vxlan 에서 패킷 확인시
ip netns exec overns tcpdump -l -i br0
ip netns exec overns tcpdump -l -i vxlan1
# 위에서 vxlan 디바이스 생성 시에 learning 옵션사용했기 때문에 fdb, ARP 정보는 커널에서 패킷 분석해서 설정해준다.
# 하지만 수동설정(permanent)와 달리 aging 으로 인해 일정 시간 지나면 설정이 제거된다.
# node2(overns)에서 다음과 같이 다시 수동으로 변경하면 permanent 하게 설정된다.
ip netns exec overns bridge fdb replace 02:42:c0:a8:00:02 dev vxlan1 self dst 192.168.104.2 vni 42 port 4789
# node2(overns)에서 다시 fdb 설정 확인하면 permanent 가 있다.
ip netns exec overns bridge fdb show | grep 02:42:c0:a8:00:02
# 참고로 overns 의 FORWARD 가 허용으로 되어 있는지 확인
ip netns exec overns iptables -t filter -L | grep -i policy
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
# node1(pinkns조인 상태) -> node2(pinkns) ping 해보면 응답을 받는다.
ip netns exec pinkns ping 12.12.12.3
# node2(pinkns조인 상태) -> node1(pinkns) ping 해보면 응답을 받는다.
ip netns exec pinkns ping 12.12.12.2
#####
# node1 에 새로운 skyns network namespace 추가하고 통신하기
# node1 에서 skyns 네트워크네임스페이스 추가, mac,ip 등 추가하고 power on
ip netns add skyns
ip link add dev veth2 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns skyns
ip netns exec skyns ip link set dev eth0 address 02:42:c0:a8:00:04
ip netns exec skyns ip addr add dev eth0 12.12.12.4/24
ip netns exec overns ip link set veth2 master br0
ip netns exec overns ip link set veth2 up
ip netns exec skyns ip link set eth0 up
# node1(skyns) -> node1(pinkns) ping 테스트
ip netns exec skyns ping 12.12.12.2
# node1(pinkns) -> node1(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.4
# node2(overns) 에서 fdb 추가
ip netns exec overns ip neighbor add 12.12.12.4 lladdr 02:42:c0:a8:00:04 dev vxlan1
# node1(skyns) -> node2(pinkns) ping 테스트
ip netns exec skyns ping 12.12.12.3
#####
# node3(192.168.104.4) 추가하고 node1,2와 통신하기
# vagrantfile 노드 추가 후
# HOST_NAME3 = "ubuntu1804-3" # node3 192.168.104.4
# ubuntu1804-3(node3) 만 추가로 띄우기
# vagrant up
# ubuntu1804-3(node3) 접속
vagrant ssh ubuntu184-3
# node3 overns,pinkns, skyns network namespace 추가
ip netns add overns
ip netns add pinkns
ip netns add skyns
# node3 veth1(overns) <-> eth0(pinkns) 연결(link 생성)
ip link add dev veth1 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns pinkns
# node3 veth1(overns) <-> eth0(skyns) 연결(link 생성)
ip link add dev veth2 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns skyns
# node3(pinkns) 에서 eth0 에 mac,ip address 추가
ip netns exec pinkns ip link set dev eth0 address 02:42:c0:a8:00:0a
ip netns exec pinkns ip addr add dev eth0 12.12.12.10/24
# node3(skyns) 에서 eth0 에 mac,ip address 추가
ip netns exec skyns ip link set dev eth0 address 02:42:c0:a8:00:0b
ip netns exec skyns ip addr add dev eth0 12.12.12.11/24
# node3(overns) 에서 bridge 생성
ip netns exec overns ip link add dev br0 type bridge
ip netns exec overns ip addr add dev br0 12.12.12.1/24
# node3(overns) 에서 vxlan 생성
ip link add dev vxlan1 netns overns type vxlan id 42 proxy learning dstport 4789
# node3(overns) 에서 veth1 <-> br0, veth2 <-> br0, vxlan1 <-> br0 연결
ip netns exec overns ip link set veth1 master br0
ip netns exec overns ip link set veth2 master br0
ip netns exec overns ip link set vxlan1 master br0
# node3 overns, pinkns, skyns 의 장치들 모두 power on
ip netns exec overns ip link set br0 up
ip netns exec overns ip link set vxlan1 up
ip netns exec overns ip link set veth1 up
ip netns exec overns ip link set veth2 up
ip netns exec pinkns ip link set eth0 up
ip netns exec skyns ip link set eth0 up
# node3(overns) 에 node1,node2 ip,mac 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.3 lladdr 02:42:c0:a8:00:03 dev vxlan1
ip netns exec overns ip neighbor add 12.12.12.2 lladdr 02:42:c0:a8:00:02 dev vxlan1
# node3(overns) 에 node1,nod2 ip,mac 정보를 fdb 로 기록
ip netns exec overns bridge fdb add 02:42:c0:a8:00:02 dev vxlan1 self dst 192.168.104.2 vni 42 port 4789
ip netns exec overns bridge fdb add 02:42:c0:a8:00:03 dev vxlan1 self dst 192.168.104.3 vni 42 port 4789
# node1(overns), node2(overns) 에 node3 ip,mac 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.10 lladdr 02:42:c0:a8:00:0a dev vxlan1
ip netns exec overns ip neighbor add 12.12.12.11 lladdr 02:42:c0:a8:00:0b dev vxlan1
# node1(overns), node2(overns) 에 node3 ip,mac 정보를 fdb 로 기록
ip netns exec overns bridge fdb add 02:42:c0:a8:00:0a dev vxlan1 self dst 192.168.104.4 vni 42 port 4789
ip netns exec overns bridge fdb add 02:42:c0:a8:00:0b dev vxlan1 self dst 192.168.104.4 vni 42 port 4789
# node1(pinkns) -> node3(pinkns), node3(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.10
ip netns exec pinkns ping 12.12.12.11
# node2(pinkns) -> node3(pinkns), node3(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.10
ip netns exec pinkns ping 12.12.12.11
# node3(pinkns) -> node1(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.2
# node3(pinkns) -> node2(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.3
# 모든 테스트가 끝나고 network namespace 삭제하려면
ip netns delete overns
ip netns delete pinkns
ip netns delete skyns
:-) good~ 감사합니다
답글삭제