1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- From 7b9c2905883df5171fda10a364a81b8c6176c8e2 Mon Sep 17 00:00:00 2001
- From: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
- Date: Mon, 26 Apr 2021 15:28:40 +0900
- Subject: [PATCH] fix port forwarding with ipv6.disable=1
- Make `docker run -p 80:80` functional again on environments with kernel boot parameter `ipv6.disable=1`.
- Fix moby/moby issue 42288
- Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
- [Upstream: https://github.com/moby/libnetwork/pull/2635,
- https://github.com/moby/moby/pull/42322]
- [Rework path/drop test for docker-engine]
- Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
- ---
- vendor/github.com/docker/libnetwork/drivers/bridge/port_mapping.go | 31 +++++++++++++++++++++++++++++++
- 1 file changed, 35 insertions(+), 0 deletion(-)
- diff --git a/vendor/github.com/docker/libnetwork/drivers/bridge/port_mapping.go b/vendor/github.com/docker/libnetwork/drivers/bridge/port_mapping.go
- index 946130ec..17bf36f9 100644
- --- a/vendor/github.com/docker/libnetwork/drivers/bridge/port_mapping.go
- +++ b/vendor/github.com/docker/libnetwork/drivers/bridge/port_mapping.go
- @@ -5,6 +5,7 @@ import (
- "errors"
- "fmt"
- "net"
- + "sync"
-
- "github.com/docker/libnetwork/types"
- "github.com/ishidawataru/sctp"
- @@ -50,6 +51,13 @@ func (n *bridgeNetwork) allocatePortsInternal(bindings []types.PortBinding, cont
- bs = append(bs, bIPv4)
- }
-
- + // skip adding implicit v6 addr, when the kernel was booted with `ipv6.disable=1`
- + // https://github.com/moby/moby/issues/42288
- + isV6Binding := c.HostIP != nil && c.HostIP.To4() == nil
- + if !isV6Binding && !IsV6Listenable() {
- + continue
- + }
- +
- // Allocate IPv6 Port mappings
- // If the container has no IPv6 address, allow proxying host IPv6 traffic to it
- // by setting up the binding with the IPv4 interface if the userland proxy is enabled
- @@ -211,3 +219,26 @@ func (n *bridgeNetwork) releasePort(bnd types.PortBinding) error {
-
- return portmapper.Unmap(host)
- }
- +
- +var (
- + v6ListenableCached bool
- + v6ListenableOnce sync.Once
- +)
- +
- +// IsV6Listenable returns true when `[::1]:0` is listenable.
- +// IsV6Listenable returns false mostly when the kernel was booted with `ipv6.disable=1` option.
- +func IsV6Listenable() bool {
- + v6ListenableOnce.Do(func() {
- + ln, err := net.Listen("tcp6", "[::1]:0")
- + if err != nil {
- + // When the kernel was booted with `ipv6.disable=1`,
- + // we get err "listen tcp6 [::1]:0: socket: address family not supported by protocol"
- + // https://github.com/moby/moby/issues/42288
- + logrus.Debugf("port_mapping: v6Listenable=false (%v)", err)
- + } else {
- + v6ListenableCached = true
- + ln.Close()
- + }
- + })
- + return v6ListenableCached
- +}
- --
- 2.20.1
|