怎么从传统的Linux网络视角理解容器网络?《三》

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 前二篇文章已经发布,请自行查看,否则好像看不大懂的

让外部世界可以访问容器(端口发布)

大家都知道可以将容器端口发布给一些(或者所有)主机的接口。但是端口发布到底是什么意思呢?

假设容器内运行着服务器:

$ sudo nsenter --net=/var/run/netns/netns0   
$ python3 -m http.server --bind 172.18.0.10 5000

如果我们试着从主机上发送一个HTTP请求到这个服务器,一切都工作得很好(root命名空间和所有容器接口之间有链接,当然可以连接成功):

# 从 root 命名空间   
    $ curl 172.18.0.10:5000   
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd">   
    # ... 忽略无关行 ...

但是,如果要从外部访问这个服务器,应该使用哪个IP呢?我们知道的唯一IP是主机的外部接口地址eth0:

$ curl 10.0.2.15:5000   
curl: (7) Failed to connect to 10.0.2.15 port 5000: Connection refused

因此,我们需要找到方法,能够将到达主机eth05000端口的所有包转发到目的地172.18.0.10:5000。又是iptables来帮忙!

# 外部流量    
    sudo iptables -t nat -A PREROUTING -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000   
    # 本地流量 (因为它没有通过 PREROUTING chain)   
    sudo iptables -t nat -A OUTPUT -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000

另外,需要让iptables能够在桥接网络上截获流量:

sudo modprobe br_netfilter

测试:

curl 10.0.2.15:5000   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd">  
      # ... 忽略无关行 ...

理解Docker网络驱动

我们可以怎么使用这些知识呢?比如,可以试着理解Docker网络模式。

从--network host模式开始。试着比较一下命令ip link和sudo docker run -it --rm --network host alpine ip link的输出。它们几乎一样!在host模式下,Docker简单地没有使用网络命名空间隔离,容器就在root网络命名空间里工作,并且和主机共享网络栈。

下一个模式是--network none。sudo docker run -it --rm --network host alpine ip link的输出只有一个loopback网络接口。这和之前创建的网络命名空间,没有添加veth设备前很相似。

最后是--network bridge(默认)模式。这正是我们前文尝试创建的模式。大家可以试试ip 和iptables命令,分别从主机和容器的角度观察一下网络栈。

rootless容器和网络

podman容器管理器的一个很好的特性是关注于rootless容器。但是,你可能注意到,本文使用了很多sudo命令。说明,没有root权限无法配置网络。Podman在root网络上的方案和Docker非常相似。但是在rootless容器上,Podman使用了slirp4netns项目:

从Linux 3.8开始,非特权用户可以创建user_namespaces(7)的同时创建network_namespaces(7)。但是,非特权网络命名空间并不是很有用,因为在主机和网络命名空间之间创建veth(4)仍然需要root权限。

slirp4netns可以用完全非特权的方式将网络命名空间连接到Internet上,通过网络命名空间里的一个TAP设备连接到用户态的TCP/IP栈(slirp)。

rootless网络是很有限的:“从技术上说,容器本身没有IP地址,因为没有root权限,无法实现网络设备的关联。另外,从rootless容器ping是不会工作的,因为它缺少CAP_NET_RAW安全能力,而这是ping命令必需的。”但是它仍然比完全没有连接要好。

结论

本文介绍的组织容器网络的方案仅仅是可能方案的一种(可能是最为广泛使用的一种)。还有很多别的方式,由官方或者第三方插件实现,但是所有这些方案都严重依赖于Linux网络虚拟化技术。因此,容器化可以认为是一种虚拟化技术。

目录
相关文章
|
13天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
38 2
|
25天前
|
域名解析 网络协议 安全
|
2月前
|
运维 监控 网络协议
|
2月前
|
Ubuntu 安全 Linux
|
18天前
|
存储 安全 网络安全
网络安全法律框架:全球视角下的合规性分析
网络安全法律框架:全球视角下的合规性分析
30 1
|
26天前
|
存储 Ubuntu Linux
2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 上集
在本节实验中,我们学习了 Linux 系统登录认证的过程,文件的意义,并通过做实验的方式对 Linux 系统 passwd 文件提权方法有了深入的理解。祝你在接下来的技巧课程中学习愉快,学有所获~和文件是 Linux 系统登录认证的关键文件,如果系统运维人员对shadow或shadow文件的内容或权限配置有误,则可以被利用来进行系统提权。上一章中,我们已经学习了文件的提权方法, 在本章节中,我们将学习如何利用来完成系统提权。在本节实验中,我们学习了。
|
2月前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。
|
2月前
|
弹性计算 Kubernetes 网络协议
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
|
2月前
|
存储 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系现代社会正常运转的关键支柱。本文旨在深入探讨网络安全漏洞的成因与影响,剖析加密技术的原理与应用,并强调提升公众安全意识的重要性。通过这些综合性的知识分享,我们期望为读者提供一个全面而深刻的网络安全视角,助力个人与企业在数字时代中稳健前行。
本文聚焦网络安全与信息安全领域,详细阐述了网络安全漏洞的潜在威胁、加密技术的强大防护作用以及安全意识培养的紧迫性。通过对真实案例的分析,文章揭示了网络攻击的多样性和复杂性,强调了构建全方位、多层次防御体系的必要性。同时,结合当前技术发展趋势,展望了未来网络安全领域的新挑战与新机遇,呼吁社会各界共同努力,共筑数字世界的安全防线。
|
2月前
|
Docker 容器
docker中检查容器的网络模式
【10月更文挑战第5天】
162 1
下一篇
无影云桌面