docker 네트워크의 ipv6 대응 방법과 통신 경로의 정리

10456 단어 네트워크도커IPv6

개요



squid로 ActiveDirectory 연계와 SSL 인터셉트하는 Proxy를 docker로 간편하게 만든다 에서 squid4.4 구축시
squid가 IPv6에서 자신에게 액세스하기 때문에 docker도 IPv6을 활성화해야했습니다.
절차와 통신 경로를 정리합니다.

docker 엔진 데몬의 IPv6화



다음 파일을 만들고 데몬을 다시 시작합니다.
IPv6의 표기는 문서용이므로, 적절히 수정해 주세요.

/etc/docker/daemon.json
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

이미 daemon.json가 있으면 위를 추가하십시오.
systemctl restart docker

멈추고 싶지 않기 때문에 reload 했지만 반영되지 않았기 때문에 restart 했습니다.

참고 : htps : // / cs. 오 c. 이 m / cd / 에 77565_01 / 에 87205 / HTML / 도 c 케 r_ 인 s 툭 l_ 우 pg 등 _ 이 pv6. HTML

Docker 네트워크 및 컨테이너



IPv6을 활성화한 네트워크를 만들고 거기에 생성된 컨테이너를 참여시킨다.
# docker network create --ipv6  --driver=bridge  --subnet=fd5a:ceb9:ed8d:1::/64 br_ipv6_nw \
   -o com.docker.network.bridge.name="br_ipv6_nw"
# docker run --network br_ipv6_nw --name cnt01 -it -d centos:centos8 /bin/bash

Docker 네트워크 상태
# docker network inspect br_ipv6_nw
[
    {
        "Name": "br_ipv6_nw",
        "Id": "ae1e90ac38bbdd208394922263053e8cfac4d31d6d6bbfecf50c345f18606e30",
        "Created": "2020-02-24T18:36:33.239261559+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.26.0.0/16",
                    "Gateway": "172.26.0.1"
                },
                {
                    "Subnet": "fd5a:ceb9:ed8d:1::/64"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "286e2d07ab7a0d04f061ffbe4451f2a5d0a6553ad4cf6063ab21f7cdb4f40441": {
                "Name": "cnt01",
                "EndpointID": "d057150483d194c0e95eca386189482b431cff3b351411b01cb0394b92dd1852",
                "MacAddress": "02:42:ac:1a:00:02",
                "IPv4Address": "172.26.0.2/16",
                "IPv6Address": "fd5a:ceb9:ed8d:1::2/64"
            }
        },
        "Options": {
            "com.docker.network.bridge.name": "br_ipv6_nw"
        },
        "Labels": {}
    }
]

Docker 호스트와 Docker 컨테이너 인터페이스



Docker 호스트



인터페이스
호스트의 인터페이스 ID는 서브넷의 가장 젊습니다.
그리고 링크 로컬도 가장 젊은 fe80::1이 된다.
# ip add
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:62:2e:fa brd ff:ff:ff:ff:ff:ff
    inet 10.254.10.252/24 brd 10.254.10.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fd5a:ceb9:ed8d:fe0a:ed57:61d8:20eb:aba5/64 scope global dynamic noprefixroute
       valid_lft 2591966sec preferred_lft 604766sec
    inet6 fe80::f7f9:b2ce:3e89:7281/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
75: br_ipv6_nw: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:c1:de:82:5c brd ff:ff:ff:ff:ff:ff
    inet 172.26.0.1/16 brd 172.26.255.255 scope global br_ipv6_nw
       valid_lft forever preferred_lft forever
    inet6 fd5a:ceb9:ed8d:1::1/64 scope global tentative
       valid_lft forever preferred_lft forever
    inet6 fe80::1/64 scope link tentative
       valid_lft forever preferred_lft forever

라우팅(관련되지 않는 docker0은 제외됨)
디폴트는 ens192의 대향처
# ip -6 route | grep -v docker0
::1 dev lo proto kernel metric 256 pref medium
fd5a:ceb9:ed8d:1::/64 dev br_ipv6_nw proto kernel metric 256 pref medium
fd5a:ceb9:ed8d:fe0a::/64 dev ens192 proto ra metric 100 pref medium
fe80::/64 dev ens192 proto kernel metric 100 pref medium
fe80::/64 dev br_ipv6_nw proto kernel metric 256 pref medium
fe80::/64 dev veth671b926 proto kernel metric 256 pref medium
default via fe80::1 dev ens192 proto ra metric 100 pref medium

Docker 컨테이너



인터페이스
호스트의 인터페이스 ID는 Docker 호스트로부터 오름차순으로의 할당의 모양.
그리고 링크 로컬 MAC 주소에서 자동 번호 매기기.
# docker exec -it cnt01 bash
[root@45b84c2182a5 /]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
82: eth0@if83: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:1a:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.26.0.2/16 brd 172.26.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd5a:ceb9:ed8d:1::2/64 scope global nodad
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe1a:2/64 scope link
       valid_lft forever preferred_lft forever

라우팅
디폴트는 ULA의 Docker 호스트가 되는 것 같다.
# ip -6 route
fd5a:ceb9:ed8d:1::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via fd5a:ceb9:ed8d:1::1 dev eth0 metric 1024 pref medium

소통 확인



호스트 → 컨테이너 통신 확인


# ping6 -c 1 fd5a:ceb9:ed8d:1::2 | grep icmp_seq
64 bytes from fd5a:ceb9:ed8d:1::2: icmp_seq=1 ttl=64 time=0.297 ms
# ping6 -c 1 fe80::1%br_ipv6_nw | grep icmp_seq
64 bytes from fe80::1%br_ipv6_nw: icmp_seq=1 ttl=64 time=0.195 ms

컨테이너 → 호스트 통신 확인


# ping6 -c 1 fd5a:ceb9:ed8d:1::1 | grep icmp_seq
64 bytes from fd5a:ceb9:ed8d:1::1: icmp_seq=1 ttl=64 time=0.114 ms
# ping6 -c 1 fe80::1 | grep icmp_seq
64 bytes from fe80::1%eth0: icmp_seq=1 ttl=64 time=0.129 ms

컨테이너 → 호스트 → 외부 통신 확인


# ping6 -c 1 dns.google | grep icmp_seq
64 bytes from dns.google (2001:4860:4860::8844): icmp_seq=1 ttl=52 time=6.74 ms

통신경로



개요



dns.google에 ping6하면 다음과 같이 통신합니다.

HOST에서는 IP 마스커레이드하고 src 주소를 HOST 주소로 바꿉니다.
GATEWAY에서는 fd5a:ceb9:ed8d:fe0a::/64 를 ROUTINGPREFIX:ff66/64 에 NPTv6 하고 있습니다.

HOST 설정 및 동작 Docker 호스트의 IP 마스커레이드는 firewall-cmd --masquerade --zone=public --permanent에 의해 다음 규칙이 추가되었습니다. #nft list chain ip6 firewalld nat_POST_public_allow 테이블 ip6 firewalld { 체인 nat_POST_public_allow { oifname != "lo" masquerade } } 이렇게하면 컨테이너의 패킷이 호스트에서 SNAT됩니다. conntrack에서 확인하면 다음과 같습니다. #conntrack -E -p icmpv6 [NEW] icmpv6 58 30 src=fd5a:ceb9:ed8d:1::2 dst=2001:4860:4860::8888 type=128 code=0 id=38 [UNREPLIED] src=2001:4860:4860 dst=fd5a:ceb9:ed8d:fe0a:ed57:61d8:20eb:aba5 type=129 code=0 id=38 [UPDATE] icmpv6 58 30 src=fd5a:ceb9:ed8d:1::2 dst=2001:4860:4860::8888 type=128 code=0 id=38 src=2001:4860:4860::8888 :ceb9:ed8d:fe0a:ed57:61d8:20eb:aba5 type=129 code=0 id=38 ROUTER 설정 및 동작 ROUTER의 라우팅은 다음과 같이 설정됩니다. (어째서 fe80::1로 하지 않았는데...) Rdc01#sh run | in ::/0 ipv6 route ::/0 Vlan252 FD5A:CEB9:ED8D:FEFC::1 GATEWAY 설정 및 동작 GATEWAY의 인터페이스는 다음과 같이 설정됩니다. (아직도 CLI를 다룰 수 없다...) admin@FWdc01 > show interface all (~ 생략~) ethernet1/1.999 271 1 zUntrust vr:default 999 192.168.1.250/24 fe80::b60c:25ff:fe0f:df10/64 ROUTINGPREFIX:ffff:192:168:1:250/64 fe80::192:168:1:250/128 (~ 생략~) ethernet1/2.252 260 1 zTrust vr:default 252 10.254.252.1/24 fe80::b60c:25ff:fe0f:df11/64 fd5a:ceb9:ed8d:fefc::1/64 fe80::1/128 (~ 생략~) GATEWAY의 NPTv6은 다음과 같이 설정됩니다. 사실은 Prefix64bit 마다 NPTv6의 트랜슬레이터를 준비하지 않으면 안됩니다만, 빼고 2세그를 정리하고 있습니다. "nat66_NPTv6_to_internet; index: 1" { nat-type nptv6; from zTrust; source [ fd5a:ceb9:ed8d:fe0a:0:0:0:0/64 fd5a:ceb9:ed8d:fefc:0:0:0:0/64 ]; to zUntrust; to-interface ethernet1/1.999 ; destination any; service 0:any/any/any; translate-to "src: ROUTINGPREFIX:ff66:0:0:0:0/64 (static-ip) (pool idx: 0)"; terminal no; } 이렇게 하면 패킷이 GATEWAY에서 SNAT됩니다. NAT 후 트래픽 로그는 다음과 같습니다. (CLI 확인 방법을 모르겠다...)

좋은 웹페이지 즐겨찾기