연재 시리즈

쿠버네티스 네트워크 스터디 1주차 2편: 네트워크 네임스페이스

악분 2022. 1. 12. 20:51
반응형

스터디 목차

 

안녕하세요. 이 글은 facebook 쿠버네티스 그룹에서 올라온 "쿠버네티스 네트워크 스터디" 1주차 내용을 정리했습니다.

스터디 모집글: https://www.facebook.com/groups/k8skr/posts/3202691746679143

 

1. 1주차 두번째 주제

1주차 두번째 주제는 네트워크 네임스페이스를 직접 만들어보는 시간을 가졌습니다. 

이 글의 예제는 유투브 영상으로도 볼 수 있습니다.

https://youtu.be/fQa5FDqGOmw

 

2. 네트워크 네임스페이스란?

네트워크 네임스페이스는 논리적인 네트워크 네임스페이스(공간)을 만들고 라우팅, 가상IP 등 네트워크 구성요소를 조합하여 논리적으로 네트워크를 격리시킵니다. 네트워크를 논리적으로 격리시킴으로써 호스트 네트워크에 직접적인 영향을 최소화합니다.

 

네트워크 네임스페이스를 이해하기 위해서는 네트워크 구성요소가 무엇이 있는지 이해해야합니다. 

 

2.1 네트워크 인터페이스

네트워크 인터페이스는 마이크로소프트 문서[1]에서 소개되어 있는 것처럼, 두개의 네트워크 장비 또는 프로토콜이 연결되는 지점을 말합니다. 쉽게 비유하면 네트워크 통신을 하기 위한 물리적인 또는 논리적인 통로 역할을 합니다.

 

대표적인 네트워크 인터페이스 장비가 네트워크 카드(Network Interface Card, NIC)입니다. 컴퓨터, 스마트폰 등 네트워크 통신을 하기 위해 네트워크 카드는 기본적으로 가지고 있습니다. 네트워크 네임스페이스는 가상 네트워크 인터페이스를 사용하여 인터페이스를 구성합니다.

2.3 브릿지

2.3 라우팅

 

3. 네트워크 네임스페이스 생성

네트워크 네임스페이스를 생성 후 네트워크 가상 인터페이스, 브릿지 연결, 라우팅 설정 순서로 진행됩니다.

 

3.1 디폴트(또는 루트) 네트워크 네임스페이스

host는 1번 init프로세스의 네트워크 인터페이스를 디폴트로 사용합니다. 그리고 lo인터페이스와 네트워크 카드 갯수만큼 인터페이스가 가 있습니다. 보통 네트워크 카드에 해당하는 인터페이스는 eth0이름을 갖습니다.

 

디폴트 네트워크 네임스페이스는 lsns -t net명령어로 확인할 수 있습니다.

lsns -t net -o NS,TYPE,PATH,NPROCS,PID,PPID,COMMAND,UID,USER

 

3.2 네트워크 네임스페이스 생성

ip netns add 명령어로 쉽게 네트워크 네임스페이스를 생성할 수 있습니다. 아래 예제는 RED, BLUE라는 이름으로 네트워크 네임스페이스를 생성했습니다. 네트워크 네임스페이스 목록은 ip netns list로 확인할 수 있습니다.

ip netns add RED
ip netns add BLUE
ip netns list

 

이해하기 쉽게 그림으로 표현하면 아래와 같습니다. 네트워크 네임스페이스만 만들었고 인터페이스 등 아무것도 설정하지 않은 상태입니다. lo인터페이스는 기본적으로 생성됩니다.

 

네임스페이스를 생성했지만 사용하고 있지 않아서 lsns명령어 결과에서는 보이지 않습니다.

lsns -t net

 

3.3 네트워크 네임스페이스 인터페이스 생성

네트워크 네임스페이스는 공간이 생성된 것 뿐입니다. 공간이 네트워크 통신을 하기 위해서는 네트워크 인터페이스[1]가 필요합니다. 리눅스 veth라는 가상 네트워크 인터페이스를 이용하여 네임스페이스에 네트워크 인터페이스를 설정할 수 있습니다. 데이터를 전달하는 송신자가 있다면 받는 수신자가 있는 것처럼 veth는 두 개의 인터페이스가 한개의 쌍으로 구성됩니다.

 

RED 네트워크 네임스페이스를 위한 가상 네트워크 인터페이스를 생성합니다. 

ip link add reth0 type veth peer name reth1

 

생성한 가상 네트워크 인터페이스는 디폴트 네임스페이스에 위치합니다. 가상 네트워크 인터페이스는 쌍으로 존재하기 때문에 조회결과를 보면 인터페이스1@인터페이스2포맷으로 출력됩니다.

 

그림으로 정리하면 아래 사진과 같습니다. 디플트 네트워크 네임스페이스에 reth0, reth1 인터페이스가 있습니다.

 

3.4 네트워크 인터페이스를 네트워크 네임스페이스에 설정

RED 네트워크 네임스페이스에 reth0인터페이스를 설정해보겠습니다.

ip link set reth0 netns RED

 

그림으로 표현하면 아래 그림과 같습니다. reth0인터페이스가 RED 네임스페이스에 연결되었습니다. reth1은 디폴트 네트워크 네임스페이스에 아직도 위치합니다.

 

ip 명령어로 확인하면 reth0은 사라진 것을 확인할 수 있습니다. reth1인터페이스는 그대로 있네요.

 

RED 네트워크 네임스페이스에 있는 인터페이스 목록을 봐봅시다. lo인터페이스와 reth0인터페이스가 보입니다. 정상적으로 RED 네트워크 네임스페이스에 reth0인터페이스가 추가되었습니다.

 ip netns exec RED ip -c a

 

BLUE 네트워크 네임스페이스에도 인터페이스를 추가하겠습니다.

ip link add beth0 type veth peer name beth1
ip link set beth0 netns BLUE

 

그림으로 정리하면 아래그림과 같습니다. 디폴트 네트워크 네임스페이스에는 reth1, beth1 인터페이스가 있습니다. beth0인터페이스는 BLUE 네트워크 네임스페이스에 있습니다.

 

BLUE 네트워크 네임스페이스에는 새로 추가된 beth0인터페이스와 lo인터페이스를 볼 수 있습니다.

 ip netns exec BLUE ip -c a

 

디폴트 네트워크 네임스페이스에는 reth1, beth1이 잘 보이네요.

 

3.5 가상 브릿지 생성과 네트워크 네임스페이스 연결

네트워크 네임스페이스를 연동하기 위해 가상 브릿지를 생성해보겠습니다. 가상 브릿지는 L2 통신을 담당합니다.

 

생성하기 전에 가상 브릿지가 없는 것을 확인합니다.

brctl show

 

br0이름으로 가상 브릿지를 생성합니다.

ip link add br0 type bridge

 

다시 가상 브릿지 목록을 조회하면 br0브릿지가 보입니다.

brctl show

 

그림으로 정리하면 아래그림과 같습니다. br0은 아직 아무것도 연결되지 않은 상태입니다. br0은 디폴트 네트워크 네임스페이스에 생성됩니다.

 

디폴트 네트워크 네임스페이스의 인터페이스 목록에 br0이 출력됩니다.

 

br0에 RED, BLUE네임스페이스를 연결해봅시다. 디폴트 네트워크 네임스페에 있는 reth1, beth1을 가상 브릿지 br0에 연결합니다.

ip link set reth1 master br0
ip link set beth1 master br0

 

그림으로 정리하면 디폴트 네트워크에 있었던 reth1, beth1 인터페이스가 이동했습니다.

 

가상 브릿지 정보를 출력하면 br0에 두개의 인터페이스가 연결되어 있는 것이 확인됩니다.

 

3.6 네트워크 인터페이스 IP할당

이제 인터페이스에 IP를 할당해봅시다.

 

아래 예제는 reth0인터페이스 11.11.11.2 IP를 할당했습니다. 그리고 reth0인터페이스를 활성화해줍니다.

ip netns exec RED ip addr add 11.11.11.2/24 dev reth0
ip netns exec RED ip link set reth0 up

 

reth0 IP를 출력하면 11.11.11.2가 할당된 것을 확인할 수 있습니다.

ip netns exec RED ip -c a

 

beth0에도 IP를 할당하고 beth0인터페이스를 활성화합니다.

ip netns exec BLUE ip addr add 11.11.11.3/24 dev beth0
ip netns exec BLUE ip link set beth0 up

 

beth0인터페이스에 IP가 잘 할당되었는지 확인합니다.

 

마지막으로 br0 가상브릿지, beth1, reth1 인터페이스도 활성화합니다.

ip link set br0 up
ip link set beth1 up
ip link set reth1 up

 

디폴트 네트워크 네임스페이스 목록을 조회하면 reth1, beth1인터페이스와 br0가상 브릿지가 UP상태로 되어 있습니다.

 

지금까지 내용을 정리하면 아래그림과 같습니다.

 

3.7 현재 설정의 문제점

현재 설정에서는 RED네임스페이스<->BLUE네임스페이스끼리 통신이 되질 않습니다. 각 네임스페이스 자신에게 ping은 됩니다.

 

ip netns exec RED ping 11.11.11.2 -c 2
ip netns exec RED ping 11.11.11.3 -c 2

ip netns exec BLUE ping 11.11.11.3 -c 2
ip netns exec BLUE ping 11.11.11.2 -c 2

 

 

그림으로 표현하면 아래처럼 RED<->BLUE 네트워크 네임스페이스끼리 통신이 안됩니다.

 

3.8 설정문제 해결: netfileter 포워딩

그 이유는 br0 가상 브릿지에 있습니다. br0은 디폴트 네트워크 네임스페이스에 위치합니다. 동시에 디폴트 네트워크 네임스페이스는 host가 사용하고 있습니다.

host입장에서는 br0으로 오고가는 네트워크 통신이 내부로 오는 것으로 취급하지 않아 포워딩 규칙을 따릅니다. 포워딩은 리눅스 netfilter가 처리합니다. 포워딩 디폴트 설정은 DROP이므로 RED<->BLUE 네트워크 네임스페이스 통신이 되지 않았습니다.

수정: ubuntu 기본 iptables FORWARD의 기본 Action 은 ACCEPT입니다.

 

그림으로 정리하면 FORWARD Netfilter규칙을 설정해주면 RED<->BLUE 네임스페이스간 통신이 가능합니다.

 

 

포워딩 규칙을 허용하기 위해서는 iptables로 포워딩을 활성화합니다. iptables는 사용자가 netfiler를 설정할 수 있는 (인터페이스) 명령어 입니다. 

 iptables --policy FORWARD ACCEPT

 

그리고 리눅스 커널 파라미터 중 패킷 포워딩을 활성화합니다.

echo 1 > /proc/sys/net/ipv4/ip_forward

 

RED -> BLUE 네임스페이스로 ping이 성공적으로 실행됩니다.

ip netns exec RED ping 11.11.11.3 -c 2

 

BLUE -> RED 네임스페이스로 ping도 잘 실행됩니다.

ip netns exec BLUE ping 11.11.11.2 -c 2

 

3.9 host와 RED/BLUE 네트워크 네임스페이스 통신

지금까지는 RED<->BLUE 네트워크 네임스페이스 통신을 살펴봤습니다. 이번에는 host<->RED, host<->BLUE 네임스페이스간 통신을 해봅시다.

 

현재는 reth0, beth0 인터페이스 IP로 ping을 날리면 통신이 되질 않습니다. br0 가상 브릿지가 IP가 없기 때문입니다.

ping 11.11.11.2 -c 1
ping 11.11.11.3 -c 1

 

br0 가상 브릿지에 IP를 설정하면 host와 RED, BLUE 네임스페이스간 통신이 가능합니다.

ip addr add 11.11.11.1/24 dev br0
ip netns exec RED ping 11.11.11.1
ip netns exec BLUE ping 11.11.11.1

 

지금까지 내용을 정리하면 아래 그림과 같습니다.

 

3.10 네트워크 네임스페이스 외부통신

현재 RED, BLUE 네임스페이스은 외부와 통신이 되질 않습니다. 아래 예제는 구글서버에 ping을 날렸지만 실패한 예제입니다.

ip netns exec RED ping 8.8.8.8
ip netns exec BLUE ping 8.8.8.8

 

네트워크 네임스페이스가 외부와 통신을 host가 사용하는 디폴트 네트워크 네임스페이스를 이용해야 합니다. 더 정확히 말하면 외부와 통신할 수 있는 인터페이스로 패킷을 전달해야합니다. 

 

네트워크 네임스페이스가 외부와 통신하는 디폴트 네트워크 네임스페이스 안에 있는 인터페이스를 연결하는 절차는 2가지 과정이 필요합니다.

  • 네트워크 네임스페이스에서 디폴트 라우팅 테이블 설정
  • 디폴트 네트워크 네임스페이스에서 MASQUERADE설정

 

RED, BLUE 네트워크 네임스페이스 라우팅 테이블을 설정하면 RED네임스페이스는 reth0->br0, BLUE네임스페이스는 beth0->br0으로 패킷이 전달됩니다.

 ip netns exec RED ip route add default via 11.11.11.1
 ip netns exec BLUE ip route add default via 11.11.11.1
 
 # RED 네트워크 네임스페이스 라우팅테이블 확인
 ip netns exec RED route -n
 
 # BLUE 네트워크 네임스페이스 라우팅테이블 확인
 ip netns exec BLUE route -n

 

br0가상 브릿지는 디폴트 네트워크 네임스페이스 라우팅 테이블 규칙에 의해 eth0인터페이스로 받은 패킷을 전달합니다.

 

eth0인터페이스는 전달받은 패킷을 외부로 전송하기 위해 MSAQUERADE설정이 필요합니다. MASQUERADE는 영어로 가면인것처럼 외부로 데이터가 전송될때 해당 인터페이스 IP로 변경됩니다. 

iptables -t nat -A POSTROUTING -s 11.11.11.0/24 -j MASQUERADE

 

지금까지 내용을 그림으로 정리하면 아래 그림과 같습니다.

 

이제 RED, BLUE 네트워크 인터페이스에서 구글서버로 ping을 실행하면 통신이 잘됩니다.

 

명령어 요약

이 글에서 실습했던 명령어를 정리했습니다.

# 네트워크 네임스페이스 생성
ip netns add RED
ip netns add BLUE

# 인터페이스 생성
ip link add reth0 type veth peer name reth1
ip link set reth0 netns RED
ip link add beth0 type veth peer name beth1
ip link set beth0 netns BLUE

# 가상브릿지 생성
ip link add br0 type bridge
ip link set reth1 master br0
ip link set beth1 master br0

# IP할당
ip netns exec RED ip addr add 11.11.11.2/24 dev reth0
ip netns exec RED ip link set reth0 up
ip netns exec RED ip link set lo up

ip netns exec BLUE ip addr add 11.11.11.3/24 dev beth0
ip netns exec BLUE ip link set beth0 up
ip netns exec BLUE ip link set lo up

ip link set beth1 up
ip link set reth1 up
ip link set br0 up

# iptables FORWARD 활성화
iptables --policy FORWARD ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

ip netns exec RED ping 11.11.11.3 -c 2
ip netns exec BLUE ping 11.11.11.2 -c 2

# host <-> RED, BLUE 네임스페이스간 통신
ip addr add 11.11.11.1/24 dev br0
ip netns exec RED ping 11.11.11.1
ip netns exec BLUE ping 11.11.11.1

# 디폴트 라우팅 테이블 추가
ip netns exec RED ip route add default via 11.11.11.1
ip netns exec BLUE ip route add default via 11.11.11.1

# 마스커레이드 설정
iptables -t nat -A POSTROUTING -s 11.11.11.0/24 -j MASQUERADE

 

참고자료

[1] [기업블로그] 마이크로스프트-네트워크인터페이스 : https://docs.microsoft.com/ko-kr/windows/win32/network-interfaces

[2] [블로그] 도커(docker)네트워킹 https://sungsily.tistory.com/10

[3] [블로그] 44bits-ip로 직접 만들어보는 네트워크 네임스페이스와 브리지 네트워크 https://www.44bits.io/ko/post/container-network-2-ip-command-and-network-namespace

[4] [블로그] Fun with veth-devices, Linux bridges and VLANs in unnamed Linux network namespaces https://linux-blog.anracom.com/2017/10/30/fun-with-veth-devices-in-unnamed-linux-network-namespaces-i/

[5] [블로그] 라우팅테이블: https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=hanajava&logNo=221997361552&categoryNo=52&parentCategoryNo=29&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postList

반응형