是否可以在 Linux 容器内部模拟临时网络断开?

问题描述 投票:0回答:1

背景

为了在 docker 上运行的 Linux (openSUSE Leap 15) 应用程序上执行一些单元测试,我有一个管理器,它通过套接字向 docker 中的应用程序发送命令。

问题

在这种情况下,对于一些测试,我希望能够发送命令以暂时从容器内部禁用网络,要明确命令发送/接收不是问题,但当我收到此类命令时我会做什么,我尝试了

 ip link eth0 down/up
down
实际上可以工作,但不能启动,这里是一个重现的示例,使用以下 docker 文件:

FROM opensuse/leap:15

# We just need ping and ip
RUN zypper --non-interactive --no-gpg-checks --ignore-unknown --no-cd in --auto-agree-with-licenses --allow-unsigned-rpm ping iproute2

ENTRYPOINT [ "bash" ]
  • 使用
    docker build -t opensuse-leap-15-if-down-up:1.0 .
    ,
  • 构建图像
  • docker run -dti --cap-add NET_ADMIN --hostname opensuse-leap-15-if-down-up --name opensuse-leap-15-if-down-up opensuse-leap-15-if-down-up:1.0
    ,
  • 一起跑步
  • 使用
    docker exec -ti opensuse-leap-15-if-down-up bash
    ,
  • 执行
  • 从容器内部:
    • ping google.com
      检查您能否到达,
    • ip link eth0 down
      停用 eth0 接口,
    • ping google.com
      再次检查您是否不能再这样做:好的,“ping:google.com:名称解析暂时失败”错误,
    • ip link eth0 up
      重新激活eth0接口,
    • ping google.com
      再次检查是否正常:KO,仍然出现“ping:google.com:名称解析暂时失败”错误。

知道为什么这不起作用,或者知道如何从 Linux 容器内部模拟临时网络断开吗?

编辑:我也尝试过

systemctl stop systemd-networkd
但没有成功(
ping google.com
停止后仍然回答),我看到也有一个
systemd-networkd-wait-online.service
,不确定它的作用,但停止它也不会断开网络。

Edit2:我也尝试过this,但是

route add default gw 172.17.0.1
给了我
SIOCADDRT: Network is unreachable
,而不是我必须安装
net-tools-deprecated
包才能获得
route
命令,如果可能的话,我不想要什么。但我不太熟悉
ip route
命令,例如
ip r add 172.17.0.1/8 dev eth0
和其他测试总是给我
Error: Invalid prefix for given prefix length
错误。

linux docker opensuse
1个回答
0
投票

基于另一个问题中的这个答案给了我一个线索,但是

route add default gw 172.17.0.1
对我不起作用(给我
SIOCADDRT: Network is unreachable
错误),最后除了我的问题中的@KamilCuk评论之外,我再次获得了网络:

ip link eth0 up
ip route add default via 172.17.0.1 dev eth0

然后我可以通过以下方式断开连接:

ip link eth0 down

然后依次使用上面的

up
route add
重新连接以模拟临时网络断开连接。

© www.soinside.com 2019 - 2024. All rights reserved.