提交 65115321 编写于 作者: D Daniel P. Berrange

Disable IPv6 on virtual networks

If the bridge device is configured to have IPv6 address and
accept router advertisments, then a malicious guest can send
out bogus advertisments and hijack/DOS host IPv6 connectivity

* src/network_driver.c: Set accept_ra=0, disable_ipv6=1, autoconf=0
  for IPv6 sysctl on virual network bridge devices
上级 a49cf8a5
......@@ -788,6 +788,55 @@ networkEnableIpForwarding(void)
return virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n");
}
#define SYSCTL_PATH "/proc/sys"
static int networkDisableIPV6(virConnectPtr conn,
virNetworkObjPtr network)
{
char *field = NULL;
int ret = -1;
if (virAsprintf(&field, SYSCTL_PATH "/net/ipv6/conf/%s/disable_ipv6", network->def->bridge) < 0) {
virReportOOMError(conn);
goto cleanup;
}
if (virFileWriteStr(field, "1") < 0) {
virReportSystemError(conn, errno,
_("cannot enable %s"), field);
goto cleanup;
}
VIR_FREE(field);
if (virAsprintf(&field, SYSCTL_PATH "/net/ipv6/conf/%s/accept_ra", network->def->bridge) < 0) {
virReportOOMError(conn);
goto cleanup;
}
if (virFileWriteStr(field, "0") < 0) {
virReportSystemError(conn, errno,
_("cannot disable %s"), field);
goto cleanup;
}
VIR_FREE(field);
if (virAsprintf(&field, SYSCTL_PATH "/net/ipv6/conf/%s/autoconf", network->def->bridge) < 0) {
virReportOOMError(conn);
goto cleanup;
}
if (virFileWriteStr(field, "1") < 0) {
virReportSystemError(conn, errno,
_("cannot enable %s"), field);
goto cleanup;
}
ret = 0;
cleanup:
VIR_FREE(field);
return ret;
}
static int networkStartNetworkDaemon(virConnectPtr conn,
struct network_driver *driver,
virNetworkObjPtr network) {
......@@ -806,6 +855,9 @@ static int networkStartNetworkDaemon(virConnectPtr conn,
return -1;
}
if (networkDisableIPV6(conn, network) < 0)
goto err_delbr;
if (brSetForwardDelay(driver->brctl, network->def->bridge, network->def->delay) < 0)
goto err_delbr;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册