Skip to content

Commit c98368d

Browse files
committed
bridge: bind ip for aardvark-dns in unmanaged mode if gateway ip is not on the host
Signed-off-by: Shivang K Raghuvanshi <[email protected]>
1 parent 88c9c51 commit c98368d

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

src/network/bridge.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use netlink_packet_route::link::{
1010
use crate::dns::aardvark::SafeString;
1111
use crate::network::core_utils::get_default_route_interface;
1212
use crate::network::dhcp::{dhcp_teardown, get_dhcp_lease};
13+
use crate::network::netlink::LinkID;
1314
use crate::{
1415
dns::aardvark::AardvarkEntry,
1516
error::{ErrorWrap, NetavarkError, NetavarkErrorList, NetavarkResult},
@@ -252,18 +253,36 @@ impl driver::NetworkDriver for Bridge<'_> {
252253
}
253254
}
254255

255-
let gw = data
256-
.ipam
257-
.gateway_addresses
258-
.iter()
259-
.map(|ipnet| ipnet.addr())
260-
.collect();
256+
// Fixes #1177: In unmanaged mode, the gateway IP may not be on the host.
257+
// We need to find an IP on the bridge itself for aardvark-dns to bind to.
258+
let bind_addr: Vec<IpAddr> = if data.mode == BridgeMode::Unmanaged {
259+
let addresses = host_sock
260+
.dump_addresses(Some(LinkID::Name(data.bridge_interface_name.clone())))?;
261+
let mut bind_addr = Vec::with_capacity(addresses.len());
262+
for addr_msg in addresses {
263+
for attr in addr_msg.attributes {
264+
if let netlink_packet_route::address::AddressAttribute::Address(ip) = attr {
265+
bind_addr.push(ip);
266+
}
267+
}
268+
}
269+
if bind_addr.is_empty() {
270+
return Err(NetavarkError::msg(format!("bridge '{}' in unmanaged mode has no IP addresses, but aardvark-dns requires at least one address to bind to. Please add an IP address or disable DNS for this network (--disable-dns).", data.bridge_interface_name)));
271+
}
272+
bind_addr
273+
} else {
274+
data.ipam
275+
.gateway_addresses
276+
.iter()
277+
.map(|ipnet| ipnet.addr())
278+
.collect()
279+
};
261280

262281
match self.info.container_id.as_str().try_into() {
263282
Ok(id) => Some(AardvarkEntry {
264283
network_name: &self.info.network.name,
265284
container_id: id,
266-
network_gateways: gw,
285+
network_gateways: bind_addr,
267286
network_dns_servers: &self.info.network.network_dns_servers,
268287
container_ips_v4: ipv4,
269288
container_ips_v6: ipv6,

0 commit comments

Comments
 (0)