Skip to content

Commit

Permalink
fix host.containers.internal entry for macvlan networks
Browse files Browse the repository at this point in the history
For ip/macvlan networks we cannot use the gateway as address for this
hostname. In this case the gateway is normally not on the host so we
just try to use a local ip instead.

[NO NEW TESTS NEEDED] We cannot run macvlan networks in CI.

Fixes containers#11351

Signed-off-by: Paul Holzinger <[email protected]>
  • Loading branch information
Luap99 committed Jan 11, 2022
1 parent 0464011 commit f04465b
Showing 1 changed file with 34 additions and 17 deletions.
51 changes: 34 additions & 17 deletions libpod/container_internal_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -2221,33 +2221,50 @@ func (c *Container) getHosts() string {
depCtr = c
}

// getLocalIP returns the non loopback local IP of the host
getLocalIP := func() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range addrs {
// check the address type and if it is not a loopback the display it
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
}
return ""
}

if depCtr != nil {
for _, status := range depCtr.getNetworkStatus() {
host := ""
outer:
for net, status := range depCtr.getNetworkStatus() {
network, err := c.runtime.network.NetworkInspect(net)
// only add the host entry for bridge networks
// ip/macvlan gateway is normally not on the host
if err != nil || network.Driver != types.BridgeNetworkDriver {
continue
}
for _, netInt := range status.Interfaces {
for _, netAddress := range netInt.Subnets {
if netAddress.Gateway != nil {
hosts += fmt.Sprintf("%s host.containers.internal\n", netAddress.Gateway.String())
host = fmt.Sprintf("%s host.containers.internal\n", netAddress.Gateway.String())
break outer
}
}
}
}
} else if c.config.NetMode.IsSlirp4netns() {
// getLocalIP returns the non loopback local IP of the host
getLocalIP := func() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range addrs {
// check the address type and if it is not a loopback the display it
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
// if no bridge gw was found try to use a local ip
if host == "" {
if ip := getLocalIP(); ip != "" {
host = fmt.Sprintf("%s\t%s\n", ip, "host.containers.internal")
}
return ""
}
hosts += host
} else if c.config.NetMode.IsSlirp4netns() {
if ip := getLocalIP(); ip != "" {
hosts += fmt.Sprintf("%s\t%s\n", ip, "host.containers.internal")
}
Expand Down

0 comments on commit f04465b

Please sign in to comment.