Docker 컨테이너 설치로 인해 해당 머신의 기존 브리지 인터페이스 뒤에 있는 머신의 DHCP가 중단됩니다.

Docker 컨테이너 설치로 인해 해당 머신의 기존 브리지 인터페이스 뒤에 있는 머신의 DHCP가 중단됩니다.

내 초기 상태는 다음과 같습니다.

  • 서브넷 192.168.15.0/24의 유선 및 무선 컴퓨터 조합에 DHCP 주소를 배포하는 주거용 게이트웨이가 있는 "일반" 홈 네트워크입니다.
  • Windows 및 Linux 게스트가 혼합된 Linux(Ubuntu 18.04.3) 가상 머신 호스트입니다. 이 VM 호스트는 단일 브리지 인터페이스를 사용하여 VM 게스트 인터페이스를 192.168.15.x 네트워크에 직접 브리지합니다. 여기서 eno1과 ens2는 VM 호스트를 기본 네트워크에 연결하고 해당 브리지 도메인을 다른 물리적 스위치로 "확장"하는 물리적 이더넷 포트이며, vnetX 인터페이스는 VM 게스트 시스템의 인터페이스입니다.
lwobker@lwobker-vms:~$ brctl show 
bridge name     bridge id               STP enabled     interfaces
bridge1         8000.0017b60066e8       no              eno1    # goes to router/gateway
                                                        ens2    # extends the subnet to other machines
                                                        vnet0   # VM guest #1
                                                        vnet1   # VM guest #2
docker0         8000.0242bd3d4632       no
virbr0          8000.52540096aaf5       yes             virbr0-nic

이 모든 것은 내가 원하는 방식으로 작동합니다. 로컬 유선, 무선 및 VM 게스트 클라이언트는 모두 기본 192.168.15.1 res-gateway/router에서 DHCP 주소를 얻을 수 있습니다. 그 중 일부는 DHCP 서버 측에 예약/정적이며 일부는 DHCP 서버측 예약/정적. 역동적이다. 어쨌든 - 모든 것이 괜찮습니다... 전까지는...

도커를 설치했습니다. 저는 컨테이너에서 Ubiquity/Unifi 무선 AP 컨트롤러 소프트웨어를 실행하기 위해 이 작업을 수행하고 있는데, 이는 컨테이너 사용에 대한 좋고/쉬운 사용 사례인 것 같습니다. 그러나 Docker를 설치하는 동안(더 정확하게 말하면 Docker 네트워크 변경이라고 확신합니다) VM 호스트 브리지 인터페이스 뒤의 모든 항목에 대해 DHCP가 중단되었습니다. 확실하게:

  • VM 호스트 뒤에 있지 않은 유선 및 무선 클라이언트는 일반적으로 192.168.15.1에서 DHCP 주소(예약 및 동적)를 수신합니다.
  • 모든 앉아있는 기계뒤에VM 호스트 브리지는 더 이상 DHCP 주소를 수신하지 않습니다. 여기에는 VM 자체의 가상 머신 게스트 인스턴스뿐만 아니라 인터페이스 ens2를 통해 물리적으로 연결된 머신도 포함됩니다.
  • 중요한 것: IPv6 주소 지정하다이 새로운 Dockerfied VM 호스트 뒤에 있는 컴퓨터에서는 여전히 실행할 수 있으며 대상이 라우팅 가능한 v6 주소인 한 해당 컴퓨터는 계속해서 인터넷에 성공적으로 액세스할 수 있습니다.

나는 분명히 docker를 처음 접했고 Linux 네트워킹과 브리징에 대해 잘 알고 있지만 이것은 내 능력을 넘어서는 것입니다. 몇 번 부팅했는데 tcpdumpiptables와 관련이 있을 가능성이 가장 높다는 내용을 읽어 보면 DHCP를 볼 수 있습니다. Docker 설치 전의 출력은 없지만 iptables --list분명히 일부 항목이 추가되었습니다. ;-) 아래에 나열했습니다. 내가 확신할 수 있는 것은 관련되어 있으며 특히 중요한 항목에 주석을 달려고 노력합니다. 돕다? ! ? ! !

lwobker@lwobker-vms:~$ brctl showmacs bridge1 | uniq
port no mac addr                is local?       ageing timer
1     18:1d:ea:8a:86:e9       no                49.83
1     44:61:32:d0:43:02       no               117.27
1     44:61:32:fb:4d:7b       no               117.27
1     60:6d:c7:1a:8f:e1       no                 4.47
1     78:f2:9e:90:4c:a1       no                 1.21
1     7c:2e:bd:9c:4a:4a       no                 0.00
1     80:4a:14:ec:5a:ea       no                95.33
1     80:4a:14:f3:d8:8c       no                71.62
1     90:70:65:13:b7:16       no               117.16
1     a0:cc:2b:ff:a4:b4       no                 0.70
1     ac:1f:6b:b3:ad:fa       yes                0.00
1     ac:1f:6b:b7:d2:44       no               286.56
1     b4:fb:e4:d6:e2:35       no                 2.54
1     b8:27:eb:f9:c6:fe       no               117.18
1     d8:31:34:f3:2c:69       no                62.38
1     ec:11:27:58:a8:0d       no                 0.22
2     00:17:b6:00:66:e8       yes                0.00
2     00:30:93:10:05:8e       no                 3.61     >> physical machine behind intf ens2
3     52:54:00:ed:c9:fc       no                 0.67     >> linux VM guest
3     fe:54:00:ed:c9:fc       yes                0.00
4     52:54:00:d9:2d:b0       no                 1.29     >> windows VM guest
4     fe:54:00:d9:2d:b0       yes                0.00

현재 iptables 출력:

lwobker@lwobker-vms:/storage/unifi$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps
ACCEPT     udp  --  anywhere             anywhere             multiport dports mdns
ACCEPT     tcp  --  anywhere             anywhere             multiport dports 4000

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

Chain DOCKER (1 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            



lwobker@lwobker-vms:/storage/unifi$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                 PORTS               NAMES
be342a77a105        jacobalberty/unifi:stable   "/usr/local/bin/dock…"   23 hours ago        Up 5 hours (healthy)                       unifi

브리지 도커 네트워크 검사 출력...

lwobker@lwobker-vms:/storage/unifi$ docker network inspect 20d74e3d7efc
[
    {
        "Name": "bridge",
        "Id": "20d74e3d7efc41320c054dbd4fde76808a7c0e021e737e22cfceebefacb24b8c",
        "Created": "2019-10-15T12:36:22.059240054-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "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": {}
    }
]

VM 호스트 ifconfig 출력...

lwobker@lwobker-vms:~$ ifconfig | egrep -v 'errors|0.0 B|device mem'
bridge1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.15.150  netmask 255.255.255.0  broadcast 192.168.15.255
        ether 00:17:b6:00:66:e8  txqueuelen 1000  (Ethernet)
        RX packets 105730  bytes 73076273 (73.0 MB)
        TX packets 47591  bytes 11607902 (11.6 MB)

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:bd:3d:46:32  txqueuelen 0  (Ethernet)

eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether ac:1f:6b:b3:ad:fa  txqueuelen 1000  (Ethernet)
        RX packets 479110  bytes 451330614 (451.3 MB)
        TX packets 352901  bytes 284906323 (284.9 MB)

eno2: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether ac:1f:6b:b3:ad:fb  txqueuelen 1000  (Ethernet)

eno2:avahi: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 169.254.11.170  netmask 255.255.0.0  broadcast 169.254.255.255
        ether ac:1f:6b:b3:ad:fb  txqueuelen 1000  (Ethernet)

ens2: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 00:17:b6:00:66:e8  txqueuelen 1000  (Ethernet)
        RX packets 375663  bytes 281196261 (281.1 MB)
        TX packets 292663  bytes 270964344 (270.9 MB)

ens2:avahi: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 169.254.8.164  netmask 255.255.0.0  broadcast 169.254.255.255
        ether 00:17:b6:00:66:e8  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 92697  bytes 34802204 (34.8 MB)
        TX packets 92697  bytes 34802204 (34.8 MB)

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:96:aa:f5  txqueuelen 1000  (Ethernet)

virbr0-nic: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 52:54:00:96:aa:f5  txqueuelen 1000  (Ethernet)

vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether fe:54:00:ed:c9:fc  txqueuelen 1000  (Ethernet)
        RX packets 4563  bytes 509949 (509.9 KB)
        TX packets 28463  bytes 2796658 (2.7 MB)

vnet1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether fe:54:00:d9:2d:b0  txqueuelen 1000  (Ethernet)
        RX packets 50067  bytes 5253268 (5.2 MB)
        TX packets 82339  bytes 105281318 (105.2 MB)

vnet0:avahi: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 169.254.12.44  netmask 255.255.0.0  broadcast 169.254.255.255
        ether fe:54:00:ed:c9:fc  txqueuelen 1000  (Ethernet)

vnet1:avahi: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 169.254.8.4  netmask 255.255.0.0  broadcast 169.254.255.255
        ether fe:54:00:d9:2d:b0  txqueuelen 1000  (Ethernet)

답변1

빠른 수정:

iptables -t filter -P FORWARD ACCEPT

더 나은 수정:

iptables -A FORWARD -p udp --sport 68 --dport 67 -m conntrack --ctstate NEW -j ACCEPT

답변2

빠르고 자세한 수정 사항을 제공해 주셔서 "감사합니다"라고 말하고 싶어서 가입했습니다. 나는 그의 답변에 직접적으로 논평할 만큼 충분한 평판을 갖고 있지 않습니다. 셀 수 없이 많은 시간 동안 디버깅하고 머리를 뽑아낸 후 도움을 준 @Stuart Cardall에게 감사드립니다.

몇 가지 추가 결과를 추가해야 합니다. 첫 번째 제안 명령은 신속할 뿐만 아니라 임시 수정이기도 합니다. docker가 시작되기 전에 규칙이 적용되면 docker가 시작된 직후 다시 DENY로 전환됩니다.

두 번째 명령의 경우 이것이 필요한 명령 중 하나이지만 패킷을 다른 방향으로 전달하는 명령도 필요합니다. 그래서 결국 나는 사용했다

iptables -A FORWARD -p udp --sport 68 --dport 67 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -p udp --sport 67 --dport 68 -m conntrack --ctstate NEW -j ACCEPT

이러한 규칙과 모든 종류의 iptables 지속성(ArchLinux의 /etc/iptables/iptables.rules)을 사용하면 VPN 클라이언트가 네트워크 라우터에서 주소를 가져오도록 할 수 있습니다.

관련 정보