让我们深入探讨 Linux 网络 - 不仅仅是基础知识,而是当你在调试生产问题时真正重要的东西。

🌐 Linux 网络栈:不仅仅是普通的 OSI 模型

Linux 处理网络的方式与 Windows 或 macOS 不同。它更透明,更可配置,有时也更令人困惑。Linux 中的网络栈就像一个组织良好的(但有时混乱的)工具箱,只要你知道在哪里找,一切都触手可及。


# 查看网络接口的现代方法
ip addr show

# 你能理解的输出
1: lo: 
2: eth0: 
    inet 192.168.1.100/24

你会实际使用的关键组件

  • 网络接口:物理接口(eth0)或虚拟接口(docker0, veth)
  • IP 栈:IPv4/IPv6 地址,路由表
  • 套接字层:你的应用程序与网络实际交互的地方
专业提示:忘掉 ifconfig。它已被弃用。使用 'ip' 命令代替。你的未来会感谢你。

🔍 网络配置:重要的部分

与其列出所有可能的命令,不如专注于你真正需要的:

实际有效的 IP 配置


# 查看 IP 地址(现代方法)
ip addr show eth0

# 添加 IP 地址(当你需要时)
ip addr add 192.168.1.100/24 dev eth0

# 实际运行的是什么?
ss -tuln

DNS:因为“在我的机器上可以运行”还不够好

DNS 问题可能是导致 42% 开发者头痛的原因。以下是如何调试它们:


# 检查 DNS 解析
dig google.com

# 快速 DNS 查找
host kubernetes.default.svc.cluster.local

# 查看 DNS 配置
cat /etc/resolv.conf

⚠️ 常见陷阱

不要直接编辑 /etc/resolv.conf - 它通常由 systemd-resolved 或 NetworkManager 管理。请使用正确的工具。

🐛 现实世界的调试:因为事情会出错

让我们解决一个真实的场景:你的微服务无法连接到数据库。

实际有效的调试流程


# 1. 检查端口是否打开
ss -tuln | grep 5432

# 2. 测试基本连接
ping database.internal

# 3. 跟踪路由(是的,即使在容器中)
traceroute database.internal

# 4. 检查是否是 DNS 问题
dig database.internal

🐋 容器网络:事情变得有趣的地方

容器网络增加了另一层复杂性。以下是你需要知道的:


# 查看 Docker 网络
docker network ls

# 检查网络详情
docker network inspect bridge

# 从容器内部调试
docker exec -it container-name bash

💡 快速提示

在配置中总是使用容器名称而不是 IP 地址。在 Docker 网络中,DNS 解析比硬编码的 IP 更可靠。

🚀 性能调优:当速度很重要时

有时,默认设置不够用。以下是一些实际的性能调整:


# 增加最大打开文件数
ulimit -n 65535

# 调整 TCP 参数
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.core.somaxconn=1024

🎯 现实世界的例子:丢失连接的案例

最近,我们遇到了一个问题,我们的 Node.js 服务无法连接到 Kubernetes 中的 Redis。以下是我们如何调试的:


# 1. 检查 pod 是否能互相看到
kubectl exec -it web-pod -- ping redis-pod

# 2. 验证 DNS 解析
kubectl exec -it web-pod -- nslookup redis-service

# 3. 检查服务端点
kubectl get endpoints redis-service

# 实际问题?kube-dns 配置错误!

🎓 关键要点

  • 掌握 'ip' 命令 - 它是你的好朋友
  • DNS 问题很常见 - 学会有效调试它们
  • 容器网络增加了复杂性 - 理解基础知识
  • 性能调优应以数据为驱动

记住:网络问题会发生。拥有这些工具会让它们不那么可怕,更易于管理。

进一步阅读

在评论中分享你的想法和经验 - 你遇到过哪些网络问题,你是如何解决的?