네트워크 네임스페이스는
Linux 시스템 내에서 가상화된 네트워크 스택을 생성할 수 있는 Linux 커널 기능이다. 각 네트워크 네임스페이스는 네트워크 인터페이스, 라우팅 테이블, 방화벽 규칙, IP 주소 및 기타 네트워크 관련 설정을 포함하여 고유한 별도의 네트워크 구성을 제공한다. 이를 통해 단일 Linux 호스트 내에서 여러 개의 격리된 네트워크 스택을 실행할 수 있으며 다음과 같은 다양한 사용 사례에 유용할 수 있다.
- 서로의 네트워크 트래픽을 방해할 수 없도록 컨테이너 또는 가상 머신을 서로 격리한다.
- 테스트 또는 개발 목적으로 가상 네트워크를 생성한다.
- 인프라의 다른 부분을 별도의 네트워크 네임스페이스로 격리하여 네트워크 수준 보안을 구현한다.
명령어를 사용하여 네트워크 네임스페이스를 생성하며 ip netns명령어를 사용하여 네트워크 네임스페이스를 입력할 수 있다 ip netns exec. ifconfig네트워크 네임스페이스 내부에 들어가면 및 와 같은 표준 Linux 네트워킹 도구 route를 사용하여 네트워크 스택을 구성할 수 있다.
이번포스팅에서는 직접 ip명령어를 이용해서 네트워크를 격리하고 연결해 보고 통신하는 과정을 작성할 생각이다 먼저 os는 EC2 우분투 18 버전 이므로 참고하길 바란다(루트 권한에서 실행하는 걸 권장 sudo 명령어를 반복하기 귀찮음으로...)
먼저 ip link명령어를 입력하게되면 아래의 그림과 같이 lo인터페이스와 eth0인터페이스를 갖는다
또한 디폴트 네트워크 네임 스페이스는 lsns -t net 명령어로 확인할 수 있다
네트워크 네임스페이스 생성
ip nets add 명령어를 이용해서 CAT, DOG라는 네트워크 네임스페이스를 생성해 보겠다 생성하고 ip netns list 명령어로 목록을 확인할 수 있다
아래의 그림으로 다시 확인해본다면 네트워크 네임스페이스가 만들어졌으며 lo인터페이스가 기본적으로 생성된다.
ip netns에는 exec 서브 명령어가 커멘드가 존재하는데 이 명령어를 이용해서 CAT, DOG 네임스페이스에서 ip --br link 명령어로 네트워크 인터패이스를 확인할 수 있다
위에서 확인했던 lsns -t net 명령어로 네트워크 네임스페이스를 조회한다면 CAT, DOG라는 네트워크 네임스페이스는 보이지 않는다 그 이유는 생성만 하고 사용하지 않기 때문에 lsns명령어로 보이지 않는 것이다
네트워크 네임스페이스라는 공간이 생성되었지만 서로 통신은 불가능한 상태이다 이러한 네트워크 통신을 하기 위해 인터페이스가 필요한데 리눅스 veth(버츄얼 이더넷 인터페이스)를 이용해서 설정할 수 있다 또한 veth는 쌍으로 만들어지며 네트워크 네임스페이스들을 터널로서 연결하거나, 물리 디바이스와 다른 네트워크 네임스페이스의 장비를 연결하는 용도로 사용할 수 있다.
CAT을 위한 veth와 DOG를 위한 veth를 각각 만들어줬으며 위에서 말했듯이 쌍으로 생성된 걸 확인할 수 있다 지금 상태는 아래의 그림처럼 디폴트 네트워크 네임스페이스에서 만들어진 것이지 아직 CAT, DOG 네트워크 네임스페이스와 연결되어 있는 상태가 아니다
ip link set 명령어로 ceth0 인터페이스를 CAT 네트워크 네임스페이스에 연결하고 deth0 인터페이스도 DOG 네트워크 네임스페이스에 연결되었다 확인해 보면 ceth0과 deth0 인터페이스가 사라진 걸 확인할 수 있다
다시 ip netns exec 명령어로 확인하면 각각 네트워크 네임스페이스에 ceth0과 deth0이 연결된 걸 확인할 수 있다
그림으로 확인해보면 아래의 그림처럼 연결되어 있다
브릿지를 생성해서 인터페이스들을 연동 시켜보겠다 brctl show 명령어로 브릿지가 있는지 확인하자
br0이라는 브릿지를 생성하고 확인하면 생성한 브릿지가 보이는 걸 확인할 수 있다
브릿지를 생성했으니 디폴트 네트워크 네임스페이스에 있는 ceth1과 deth1 인터페이스를 br0 브릿지에 연결해보겠다
다시 brctl show 명령어로 확인하면 br0 브릿지에 ceth1과 deth1 인터페이스가 연결된 걸 확인할 수 있다
ceth0에 10.200.0.2 IP를 할당하고 활성화해주었으며 ip netns exec 명령어로 확인하면 할당한 IP가 할당된 걸 확인할 수 있다(명령어 오타로....)
deth0도 마찬가지로 IP를 할당하고 조회해보면 deth0인터페이스에 IP가 할당된걸 확인할 수 있다
나머지도 활성화하고 조회 해보면 UP상태로 바뀐 걸 확인이 가능하다
서로 각각 다른 네트워크 네임스페이스에서 서로 핑을 보내게 된다면 문제없이 ping이 잘 작동된 걸 확인할 수 있다. 필자는 포워드 설정이 ACCEPT이기 때문에 문제없이 통신이 가능한데 docker가 만약에 설치가 되어있다면 설정이 DROP로 바뀌게 된다
그러므로 아래의 명령어로 확인하고 DROP이라면 iptabels --police FORWARD ACCEPT 명령어로 활성화해주자
이 상태에서 CAT과 DOG 네트워크 네임스페이스는 통신이 가능한 상태이지만 호스트와는 통신이 불가능한 상태이다 ping을 보내봐도 동작하지 않는다 그 이유는 디폴트 네트워크 네임스페이스에서 10.200.0.2,10.200.0.3 IP를 어디에서 찾아야 할지 모르기 때문이다
호스트와도 통신할 수 있게 br0 브릿지에 IP를 할당하고 다시 ping을 보내본다면 잘 작동된 걸 확인할 수 있다
여기까지 했어도 마지막으로 CAT과 DOG는 외부와의 통신은 불가능한 상태이다 구글로 ping를 날려본다면 아래와 같이 실패한 걸 확인할 수 있다
이 문제를 해결하기 위해서 NAT를 세팅해줘야 한다 route명령어로 조회하면 default로 향하는 규칙이 있지만 CAT, DOG 네트워크 네임스페이스는 이런 규칙이 없는 걸 확인할 수 있다 default는 따로 라우팅 규칙을 적용받지 않을 때 나머지 모든 ip에 대한 라우트를 처리하는데 네트워크 네임스페이스에 default 규칙을 추가해 주자
아래의 명령어로 CAT와 DOG에 default 규칙을 추가하고 확인하면 라우팅 테이블에 규칙이 만들어진 걸 확인이 가능하다
마지막으로 eth0인터페이스는 전달받은 패킷을 외부로 전송하기 위해서 iptabels에 NAT 규칙을 추가해줘야 한다
아래의 명령어로 NAT 규칙을 추가해 주고 리눅스의 IP 포워드 기능을 활성화한다면 문제없이 ping이 보내지는 걸 확인할 수 있다
기술 출처
https://www.44bits.io/ko/post/container-network-2-ip-command-and-network-namespace
ip로 직접 만들어보는 네트워크 네임스페이스와 브리지 네트워크 - 컨테이너 네트워크 기초 2편
네트워크 네임스페이스는 프로세스 간의 네트워크를 격리해주는 매우 강력한 도구입니다. 리눅스에서는 ip를 사용해 네트워크를 조회하는 것 뿐만 아니라 네트워크 네임스페이스를 제어하는
www.44bits.io
'DevOps > Linux' 카테고리의 다른 글
[Linux] 리눅스 표준 스트림과 파이프라인, 리다이렉션 (1) | 2022.12.30 |
---|---|
[Linux] 프록시 서버의개념, NGINX 리버스 프록시와 캐싱 (0) | 2022.12.29 |
[Linux] NGINX 개념과 각 환경에서 설치방법 (0) | 2022.12.15 |
[Linux] Read, Write, Execute 권한, chmod 권한 변경 (0) | 2022.12.02 |
[Linux] 리눅스 디렉토리 구조 개념 (0) | 2022.11.30 |