跳至主要内容

(migrated)docker容器无法访问网络

 现象

1. 最初始现象是发现docker容器里使用apt-get更新(update)时失败, 由于容器里没有ping等一系列工具软件, 无法确认问题具体情况

2. 接着就找image里有ping的包, 用docker search发现pentest-tools里有, 但pull下来后发现运行错误, 报错信息如下:

standard_init_linux.go:211: exec user process caused "exec format error"

查了下, 有人说是因为不兼容引起的错误: docker运行容器报错standard_init_linux.go:211: exec user process caused “exec format error“的可能解决办法

3. 在查找中突然发现有说centos的image里有ping, 想着操作系统可能都会有整套网络工具软件, 就找了个ubutu的包pull下来, 结果里面还是没有.

    虽然centos不熟, 都是linux应该也差不太多, 回头就pull了centos. 

    用docker运行并进入到容器里

#  docker run -it centos /bin/bash

[root@a688b8f2101e /]# ping 192.168.1.1

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.

^C

--- 192.168.1.1 ping statistics ---

2 packets transmitted, 0 received, 100% packet loss, time 26ms

[root@a688b8f2101e /]# ping 192.168.1.7

PING 192.168.1.7 (192.168.1.7) 56(84) bytes of data.

64 bytes from 192.168.1.7: icmp_seq=1 ttl=64 time=0.361 ms

[root@a688b8f2101e /]# ping www.sina.com

PING spool.grid.sinaedge.com (123.126.55.41) 56(84) bytes of data.

^C

--- spool.grid.sinaedge.com ping statistics ---

3 packets transmitted, 0 received, 100% packet loss, time 27ms

    现象是除了本宿主机的IP(192.168.1.7), 其它地址都不能ping通

[root@a688b8f2101e /]# tracepath www.sina.com

 1?: [LOCALHOST]                      pmtu 1500

 1:  119.167.237.233                                       2.100ms reached

 1:  119.167.237.233                                       0.436ms reached

     Resume: pmtu 1500 hops 1 back 1 

用tracepath跟踪路由也看不出什么

测试的结论是:

   a. 除了本宿主机地址外, 其它地址都不能ping通

   b. 虽然ping不通, 但是dns解析还是可以的.

4. 怀疑是宿主机的防火墙挡住了, 把防火墙关了

# /etc/init.d/firewall stop

再进入容器测试, 发现依然ping不通其它设备网址, 而且dns解析也不行了

[root@88a5cfa727dc /]# ping www.sina.com

ping: www.sina.com: Name or service not known

这只能说明, 宿主机的防火墙至少还帮着把DNS解析的包给双向转发了.

问题不是要不要开防火墙, 而是防火墙必须得开, 但是防火墙的规则写的少了点东西.


要不要处理

    本来如果凑合对付着用也行, 但看了下素版的wordpress好象东西还是有点少, 据说很多插件都需要从网上下载, 没法忍, 必须得处理这个问题.


怎么处理:

      iptables我也不熟, 要不先来个简单的思路?

处理方式一 docker网络改用host模式

  Host模式说明: (来自 Docker的四种网络模式)

      如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口.
      这样就不会有包转发的问题了.
      在docker启动时, Host模式需要使用"--network=host"参数.

测试Host模式:

    还是用centos的包来做测试
# docker run --network=host -it centos /bin/bash
[root@Q7Op /]# ping www.sina.com
PING ww1.sinaimg.cn.w.alikunlun.com (119.167.237.230) 56(84) bytes of data.
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=1 ttl=55 time=15.4 ms
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=2 ttl=55 time=15.4 ms
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=3 ttl=55 time=15.4 ms
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=4 ttl=55 time=15.3 ms
^C
--- ww1.sinaimg.cn.w.alikunlun.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 15.308/15.348/15.363/0.023 ms
网络就可以正常访问了.

把现有的容器改成host模式:

    docker启动容器时, 如果设置network模式, 容器就会以bridge模式运行.
1. 在portainer.io(web管理)界面里, 试着把已经运行的bridge模式的容器改为host模式, 好像不行, 再试一下, 一样的报错:
failure  container sharing cannot be connected to any other network
     即使暂停或停止容器, 也是报一样的错误.
     看来不可能简单的用管理界面搞定这个事.
2. 网上有篇文章可能跟这有关: Docker网络管理-网络模式
文章有点复杂,没看懂

3. 在portainer.io(web管理)界面里, 想用复制容器的方式, 在复制时, 修改网络为host模式.
    但是, 复制的容器就一直有问题, 试图连接时报错:
# docker exec -it WordPressHostNet /bin/bash
Error response from daemon: Container 0dd20f7ed6587ba9900acbef9f7da926974c49bebc0fa076d19cbae573c5116c is restarting, wait until the container is running
说是始终在重启状态
web端口也连不上, 原因不清楚.

两个方法:
1. docker update --network=host ……
2. 设置网桥,连接不同网段
或者,docker有nat桥?

和当前现象相似

测试:

1. 参考 Docker 容器内无法通过 HTTP 访问外网 

# service dockerd stop
# killall dockerd
# 检查点: 检查网络
# ifconfig 
# ifconfig docker0 down
# brctl delbr docker0
# service dockerd start
# 检查点: 检查网络
# ifconfig 
# 测试:
# docker run --rm -it centos /bin/bash
测试结果: 失败

2. 参考 Docker第五篇(docker网络管理), 用update改network
# docker update --network=host -it e7d3c1eca2fb
unknown flag: --network
See 'docker update --help'.
结果: update不支持修改network
测试结果: 失败

3. 测试用已有的容器作镜像, 用host模式运行生成的镜像, 发现会自动退出
    再测试用wordpress以host模式运行, 也同样会自动退出
    原因可能是某个端口被宿主机占了, 谁知道
    结论: wordpress在当前系统上, 只能以bridge方式运行.

看来应该是网桥的问题, 估计最终还是iptables的问题

估计一时半会也搞不定了, 先准备手动安装wp包和插件吧:

评论

此博客中的热门博文

(migrated)联通(数码视讯)Q7电视盒子刷机成功, 但这Q7盒子是真的垃圾!

 一、破解方式       联通(数码视讯)Q7(以下简称Q7)有很多种破解方式:          a. 不拆机破解: 主要通过漏洞是装上可以装App的市场或其他工具          b. TTL破解: 连接TTL线,通过进入底层系统打开adb调试, 再通过其它工具安装App, 如:                        “北京联通盒子-数码视讯Q7-破解"             或者在底层的Linux系统里直接安装App.         c. 使用USB Burn方式刷机: 直接刷成别的系统,如:                   " 【2020年11月】北京联通数码视讯Q7破解教程"                          最后用的是这种方式进行刷机 。          相关的包下载地址:          1) 刷机固件:             链接: https://pan.baidu.com/s/18ukQVyQiScAeQPCReoBr0Q                    提取码:yp6t             里面有个压缩包: 20191218-Q7-4.4.2-root-twrp-...

P3TERX/OpenWrt-Newifi_D2的Actions编译配置文件简单分析

  链接 :  https://github.com/P3TERX/OpenWrt-Newifi_D2 Code 目录结构 : 根目录 : .github/ 目录 : .github /workflows / 目录 : 可能需要修改的文件 : .github /workflows /build-openwrt.yml:    文件及参数设置。 文件中可能修改的部分 : name: Build OpenWrt env:   REPO_URL: https://github.com/coolsnowwolf/lede   #  库地址    #  lean 的 https://github.com/coolsnowwolf/lede.git    # or     #  Lienol 的 https://github.com/Lienol/openwrt )   REPO_BRANCH: master           #  不同分支      #  以 Lienol OpenWrt 源码为例 ,  分支 dev-master  激进; dev-19.07 OpenWrt 官方平稳版; dev-lean-lede    lean 的源码   FEEDS_CONF: feeds.conf.default   CONFIG_FILE: open.config         #  编译配置文件  open.config   DIY_P1_SH: diy-part1.sh   ...

(migrated)联通(数码视讯)Q7盒子再刷Openwrt

说明:     联通(数码视讯)Q7盒子(以下简称Q7)做为一个电视盒子应该是没有什么可取之处, 但还可以做点别的, 比如, 做Openwrt盒子。     恩山论坛 的 flippy大侠 推出了 "55+、55+O S905x3、S922x、贝壳云、我家云、微加云等OP固件" , 是基于 amlogic(晶晨) 的S9xx系列arm SOC的openwrt固件, 现在支持包括基于 amlogic(晶晨)  S922x、S912、S905x、s905x2、S905x3、S905d等多款SOC的盒子。    但是,  flippy大侠 的固件说明中, 并未明确指出对S905L的支持, 而Q7用的SOC是S905L。    查到 维基Amlogic 说明中是这么说的:            Amlogic S905L: 与S905X相似,不同之处在于它支持HDMI 2.0b,但缺少VP9解码,摄像头接口和TS输入。     按这种说法, S905L可能是和S905X差不多, 支持S905X应该就能支持S905L, 那么Q7就应该能用。     推论如此, 然后在网上找到了一个实例,  恩山论坛 的 Len_大侠 在 "联通北京数码Q7,S905L电视盒刷成了openwrt系统路由器" 贴子里, 明确说明他已经成功完成了将Q7刷上了Openwrt, 虽然没有详细说明, 但从帖子里可以看出来大概是怎么做的, 那么, 就跟随 Len_大侠 , 让Q7废物利用吧。     为了简单化(偷懒😁), 选用的是使用 外接存储( U盘或TF卡) 启动 Q7的方式。     Q7自带TF卡槽 , 这倒是为数不多的优点之一。 另:       在 Github 上找了下 flippy大侠 的源码,  感觉应该是这个:  lllrrr/mknop       tuanqing/mknop 这个肯定是分支。 另外,  flippy大侠 还做了 Doc...