클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) lo
IT모아

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2)

이전글 : 클라우드플레어 터널 | 포트포워딩 없이 외부접속하기 (1)

이번에는 1편에 이어서 도커의 macvlan 네트워크를 활용한 클라우드플레어 터널의 네트워크 분리와 추가적인 보안을 향상시킬 수 있는 설정에 대해서 알아보고자 합니다.

1편에서 클라우드플레어 터널을 설정하여 홈네트워크 라우터의 포트포워딩 없이도 도커의 터널로 클라우드플레어 엣지 서버와 직접 통신하여 홈네트워크 내부 서비스를 접근할 수 있었습니다.

현재 상황은 단일 네트워크 환경에서 도커의 터널 또한 동일한 서브넷에 위치해있어 클라우드플레어에서 홈 네트워크 내 다른 디바이스나 서비스에도 접근할 수 있는 점이 남아있습니다.

접근을 통제하기 위해서 터널의 네트워크를 독립적으로 분리시켜 트래픽이 홈 네트워크 안의 방화벽을 거칠 수 있도록 설정해 보려고 합니다.

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) do2

상황은 1편과 비슷합니다. 다만 홈 네트워크로 운영하고 있는 서브넷과 클라우드플레어 터널을 별도의 네트워크로 분리시켜 기본적으로 Sub network 1과 Sub network 2의 통신을 Block 하는 방화벽을 구축 후 클라우드플레어 터널에서 내가 원하는 서비스에만 접근할 수 있게끔 방화벽 트래픽 룰을 설정해 주는 컨셉입니다.

기본적으로 VLAN에 대한 내용은 블로그에 있는 VLAN을 참고해 보시면 좋을 것 같습니다.

유니파이 공유기 VLAN | VLAN이란? | Unifi VLAN을 세팅해보자

도커의 macvlan 네트워크

도커의 macvlan은 컨테이너에게 도 커 호스트와 다른 진짜 IP를 부여해서 마치 별도의 물리적 장비처럼 네트워크에서 활용할 때 사용됩니다.

일반적으로는 도커의 브릿지 네트워크를 통해서 컨테이너끼리 통신을 하거나 다른 네트워크 장비와 컨테이너가 통신을 한다면 macvlan은 컨테이너를 별도의 MAC 주소를 갖고 도커 호스트의 인터페이스를 사용해서 직접 물리 네트워크의 참여 시키게 됩니다. (마치 네트워크 스위치처럼 물리적인 LAN 포트는 1개로 연결되어 있지만 다수의 장비를 네트워크에 참여시키듯이)

도커 호스트가 192.168.150.10의 ip를 받아 물리 네트워크에서 통신을 하고 하위 컨테이너에 도커의 브릿지 네트워크를 통해서 192.168.150.10:443, 192.168.150.10:8080 등으로 접근해서 통신을 한다면 macvlan을 활용한 컨테이너는 192.168.150.11의 도커 호스트와는 독립적인 진짜 ip를 할당받아 통신하게 됩니다.

여기서 특정 VLAN까지 설정하여 아예 다른 서브넷으로 운영할 수도 있게 됩니다.

macvlan 네트워크 드라이버 생성

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan0
ip a

우선 도커 호스트 머신의 터미널에서 “ip a”를 입력하여 네트워크 인터페이스를 확인합니다.

현재 저는 eth0이라는 인터페이스로 도커 호스트 머신을 홈 네트워크에 연결하고 있습니다. 할당된 ip는 192.168.150.10으로 확인할 수 있고 인터페이스는 도커의 환경 구성에 따라서 eno0, eno1, eth0 등등 나타나게 됩니다.

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan1
sudo docker network create -d macvlan --subnet=192.168.160.0/24 --gateway=192.168.160.1 -o parent=eth0.160 macvlan160

우선 도커에서 네트워크를 macvlan으로 생성해야 합니다. 위 명령어로 macvlan을 생성합니다. 저는 VLAN TAG를 160으로 세팅하기 위해 서브넷에 192.168.160.0/24를 입력하고 게이트웨이는 192.168.160.1로 하였습니다.

옵션에서 -o parent=eth0.160을 통해 부모 인터페이스를 eth0으로 하고 VLAN 160 태그를 붙여서 생성하라는 명령을 줍니다.

eth0 부분을 ip a 명령어를 통해서 확인한 도커 호스트의 인터페이스(eno1, enps0 등등..)으로 변경해 주고 “.숫자”를 통해서 원하는 vlan으로 세팅해 주면 됩니다.

클라우드플레어 터널 생성 (macvlan 네트워크)

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan2
sudo docker run --netowrk macvlan160 --ip 192.168.160.10 --name cloudflared cloudflare/cloudflared:latest tunnel --no-autoupdate run --token XXXXXX

macvlan 네트워크를 생성하였다면 1편에서 클라우드 플레어 터널을 설치할 때의 명령어를 이용해서 도커 컨테이너를 생성 및 실행하는 데 네트워크를 위에서 생성한 macvlan160으로 설정하고 ip를 할당합니다.

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan3

생성된 컨테이너를 확인해 보니 네트워크가 macvlan160을 이용해서 잘 실행이 되었습니다.

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan4

유니파이 컨트롤러에서 확인해 보면 클라우드 플레어 터널의 VLAN ID가 160으로 확인되고 ip 주소 또한 동일하게 잘 할당되어 있는 걸 확인할 수 있습니다.

그럼 현재 상황에서 도커 호스트 머신의 ip 주소는 192.168.150.10이고 클라우드 플레어 터널의 ip 주소는 192.168.160.10입니다.

그리고 라우터의 방화벽 룰에 따라서 현재 192.168.150.XX 서브넷과 192.168.160.XX 서브넷은 서로 통신이 안되는 상태입니다.

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan4 5

이 상태로 외부에서 접속을 시도해 보면 위와 같이 502 에러가 발생합니다. 접속하려는 클라이언트와 클라우드 플레어의 도쿄 서버까지 문제없이 작동하고 있지만 Host의 응답이 없어서 에러가 발생하게 됩니다. 의도대로 라우터의 방화벽이 잘 작동하고 있는 상태이며 접근을 제한하고 있는 상태입니다.

방화벽 트래픽 룰 추가

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan5

유니파이 컨트롤러에서 트래픽 룰을 설정하여 예외적인 룰을 만듭니다.

타입은 LAN 네트워크의 라우터로 들어오는 타입인 LAN In으로 설정하고 소스 어드레스는 192.168.160.10(터널 ip)을 입력하고 도착 어드레스는 192.168.150.10으로 설정하여 터널 -> 도커 호스트의 트래픽을 허용해 줍니다.

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan6

터널 -> 도커 호스트까지의 트래픽은 허용되었지만 도커 호스트->터널 방향의 응답 트래픽은 여전히 불가능하기 때문에 양방향으로 통신할 수 있게 트래픽 룰을 설정해 줍니다.

클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2) macvlan7

터널과 도커 호스트 간의 트래픽을 허용해 주고 다시 외부에서 접속해 보면 정상적으로 접근할 수 있는 상태가 됩니다.

위와 같은 macvlan 활용을 통해서 터널에서 내가 지정한 서비스로만 접근할 수 있게 약간의 보안을 향상시킬 수 있습니다.

그 외 추가적으로 클라우드 플레어의 자체적인 이메일 인증 등을 추가하면 본인이 설정한 이메일을 통해서 인증을 요청하는 경우에만 이메일을 받아보고 인증코드를 입력해서 내 홈네트워크 서비스에 접근할 수 있게 추가 설정을 통해서 외부적으로 보안을 한층 더 강화시킬 수 있습니다.

다음에 계속 이어서 알아보도록 하겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다