我正在构建一个库来模拟系统中的一些故障。其中一个故障是模拟网络故障,这将禁止任何连接。目前,我正在使用此 Kotlin 代码禁用容器网络接口:
Runtime.getRuntime().exec("ifconfig eth0 down")
// wait some time
Runtime.getRuntime().exec("ifconfig eth0 up")
当重新启用接口时,我无法恢复与容器的连接。我在命令行上试过了,效果是一样的:
docker run --privileged -it alpine:latest sh
/ # apk add curl
...
OK: 7 MiB in 18 packages
/ # curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
/ # ifconfig eth0 down
/ # ifconfig eth0 up
/ # curl google.com
curl: (6) Could not resolve host: google.com
有人知道为什么它会在 Docker 容器内发生吗?
答案1
问题是 Docker 丢失了默认网关地址。我只需在重新启动接口后添加另一个命令来重置网关地址,一切又恢复正常了:
route add default gw ${this.defaultGatewayAddress}
最后,我得到了这个有效的 Kotlin 代码:
data class NetworkInterface(val name: String) {
private var defaultGatewayAddress: String
init {
this.defaultGatewayAddress = getDefaultGatewayIpAddress().address
}
fun disable() {
Environment.runCLICommand("ifconfig $name down")
}
fun enable() {
Environment.runCLICommand("ifconfig $name down")
Environment.runCLICommand("route add default gw ${this.defaultGatewayAddress}")
}
fun getDefaultGatewayIpAddress(): IpAddress {
val command = "netstat -nr | awk '{print $2}' | head -n3 | tail -n1"
return IpAddress(Environment.runCLICommand(command).trim())
}
}