컨테이너 네트워크 실행 모드
$ docker network ls NETWORK ID NAME DRIVER SCOPE 79358e90d40e bridge bridge local 6ac87e76fb7e host host local 72b1792dc2ee none null local |
default는 bridge방식이다. 다른 방식으로 컨테이너를 생성하고 싶으면 --net=Network_type을 줘서 실행하면 된다.
도커의 네트워크 모드는 호스트 모드(Host Mode)와 브릿지 모드(Bridge Mode) 2가지 모드로 사용이 가능하고 기본설정은 브릿지 모드로 되어 있다.
브릿지모드는 기본 네트워크 방식이다. 도커 데몬을 실행하면 먼저 docker0이라는 브릿지가 생성된다. 컨테이너를 생성하게 되면, 각 컨테이너 마다 고유한 network namespace 영역이 하나씩 생성되며, 이때 docker0 브릿지에 컨테이너의 인터페이스들이 하나씩 바인딩 되는 구조이다.
호스트모드는, 컨테이너가 독립적인 네트워크 영역을 갖지 않고, 호스트와 네트워크를 함께 사용하게 된다. 컨테이너의 ip와 interface정보를 확인해 보면 아래처럼 host의 네트워크 정보와 동일한다. 호스트모드로 생성된 컨테이너의 경우, 브릿지 모드를 사용하지 않으므로, docker0에 바인딩 되지 않는다.
docker runn --net=host httpd web01 |
[test@host001 ~]$ docker network inspect host [ { "Name": "host", "Id": "34c8asdffb7e963418bdeca761b89sdf0b313a64e68d1a3307a01713asda5cb4", "Created": "2020-01-21T14:12:39.926358346+09:00", "Scope": "local", "Driver": "host", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "2s33bef19e9e786c58fb0gha12c664d3cf97735b3665f7594fg08216dfb6sd3a": { "Name": "web01", "EndpointID": "20d55d00a5ff1asd8105d65811e2sd2066b9100468dacece4sd3be93cfg09d5e", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] [test@host001 ~]$ docker network inspect bridge [ { "Name": "bridge", "Id": "79as8e90d40df69dfdbc36fff166361ab80535g4766fg382d9fg6d50e08df620", "Created": "2020-01-21T14:16:12.720875736+09:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "Subnet", "Gateway": "Gateway ip" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": "e21ee20ed8020454002edf2489497f0f66388705215f21ff146b73ba0a3523ea": { "Name": "blabla", "EndpointID": "af621bafsdfaa58daa654d2asde0afc8560fa49gghff07af0g4856dfef4bdggbb", "MacAddress": "맥어드레스", "IPv4Address": "IPv4Address", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ] |
$ brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242df14d7ba no veth25cfa07 vethc1a4b9a |
< 호스트 / 브릿지 모드 >
+ 호스트 모드 - 컨테이너를 host의 네트워크과 동일한 레벨로 설정 - host모드로 구동시 container의 포트를 host 네트워크 인터페이스로 직접 매핑 - 컨테이너는 host의 네트워크로 자유롭게 접근이 가능함
+ 브릿지 모드 - 컨테이너를 도커 네트워크 인터페이스(docker0) 로 설정 - 컨테이너는 docker-proxy라는 데몬을 통하여 호스트와 연결 - 컨테이너는 기본적으로 호스트와 격리된 상태 |
네트워크 모드는 이미지를 컨테이너로 실행시 각각의 컨테이너 별로 동작 모드를 명시하여 실행 할 수 있다.
대부분의 컨테이너는 브릿지 모드로 사용하고 브릿지 모드는 docker-proxy를 통하여 컨테이너와 호스트가 연결 된다.
필요한 경우 컨테이너를 호스트 모드로 설정할 수 있고 호스트 모드는 docker-proxy 없이 컨테이너가 호스트 포트로 직접 연결 할 수 있다.
그러나 만약 컨테이너에 보안문제가 발생하였고 컨테이너가 호스트 모드로 동작 중이었다면 컨테이너는 호스트의 네트워크와 동일한 레벨(IP)로 동작이 되므로 호스트의 네트워크를 같이 사용 할 수 있는 상태가 된다.
이는 네트워크 스캔등을 통하여 호스트의 네트워크 대역에 운영 중인 다른 서비스/ 서버를 찾거나 exploit 실행등을 통하여 직접적으로 호스트 환경에서 다른 서버를 공격을 시도 할 수 있는 경로로 사용 될 수 있다.
따라서 컨테이너는 브릿지 모드로 사용하여 호스트 네트워크로 직접 접근이 되지 않도록 한다.
'리눅스' 카테고리의 다른 글
프로세스점유율 , cpuinfo , memory (0) | 2020.02.25 |
---|---|
sudo docker ps -q | xargs sudo docker inspect --format '{{ .Id }}: NetworkMode={{ .HostConfig.NetworkMode }}' (0) | 2020.02.17 |
jaeger udp buffer limits (macOS -> sudo sysctl net.inet.udp.maxdgram=65536) (0) | 2019.08.21 |
ln -Tfs /servers/test/applications/jdk1.7.0_79 jdk 심볼릭링크 변경 (0) | 2017.12.07 |
nc 로 파일 주고받기 (0) | 2016.03.23 |