내 초기 상태는 다음과 같습니다.
- 서브넷 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 네트워킹과 브리징에 대해 잘 알고 있지만 이것은 내 능력을 넘어서는 것입니다. 몇 번 부팅했는데 tcpdump
iptables와 관련이 있을 가능성이 가장 높다는 내용을 읽어 보면 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 클라이언트가 네트워크 라우터에서 주소를 가져오도록 할 수 있습니다.