概括:我在 LXC 容器中有一个邮件服务器(exim 4、Debian 10)。该主机正在运行 Debian 11。从昨天晚上开始,垃圾邮件流量就不断涌入,似乎来自 LXC 主机。但是,tcpdump 日志显示它实际上是远程流量。到底是怎么回事?
这是邮件服务器上的 exim4 日志条目的示例,对于看似来自 lxc 主机的垃圾邮件:
2023-07-23 11:15:51 1qNX42-009wSW-VR <= [email protected] H=LXCHOST (prvzvtrfnh) [LXCHOSTIPV4] P=esmtp S=615 [email protected]
然而,在主机上的 tcpdump 日志上,我看到了如下相应的条目:
14:06:07.165374 IP 39.170.36.149.34307 > MAILSERVERCONTAINER.smtp: Flags [P.], seq 5672:5702, ack 1397, win 27, options [nop,nop,TS val 1151815058 ecr 475541370], length 30: SMTP: MAIL FROM:<[email protected]>
因此流量似乎来自(中国)IP 39.170.36.149。 (该 IP 根本不会出现在容器日志中。)那么为什么此流量显示为从主机到邮件服务器呢?
主机上的相关网络接口有:
- eno1,物理接口
- br0,连接物理接口和多个 lxc 容器的桥
显示垃圾邮件流量的主机上的 tcpdump 命令是:
tcpdump -i br0 port 25 and dst host [MAILSERVERIPV4]
桥接口的设置如下/etc/network/interfaces
:
auto br0
iface br0 inet static
bridge_ports regex eth.* regex eno.*
bridge_fd 0
address HOSTADDRES
netmask 255.255.255.192
gateway HOSTGATEWAY
容器和主机都已更新到最新的安全更新。但主机的正常运行时间为 248 天,因此它可能正在运行过时的二进制文件。
更新
我认为问题是由主机上的 iptables 规则引起的-t nat -A POSTROUTING -o br0 -j MASQUERADE
。此规则适用于没有外部 IP 来访问互联网的容器。我显然误解了它的作用。难道它不应该只伪装从内部 IP 路由到互联网的流量吗?据我了解,到邮件服务器的外部流量是桥接的,根本不路由。此外,只有一个特定的垃圾邮件发送者能够利用我的设置。我的邮件服务器的正常流量显示外部 IP。垃圾邮件发送者是如何做到这一点的?
更新2:在主机上安装docker后问题就开始了。难道是 docker 和 lxc 交互的方式造成了这些问题?
答案1
我认为问题是由
iptables
主机上的规则引起的iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
此规则适用于没有外部 IP 来访问互联网的容器。
这个规则的作用是伪装任何交通出去通过br0
.它可能是从主机到容器的流量,也可能(按预期)是离开主机并流向更广泛的互联网的流量。
在主机上安装docker后问题就开始了。难道是 docker 和 lxc 交互的方式造成了这些问题?
是的,我想说这很有可能。您将需要修改规则以避免伪装本地流量。
例如,假设您的主机是 192.168.1.1(并且可能还有公共 IPv4 地址),并且您有一个隐藏的容器子网 192.168.1.0/24。 Docker 出现并抢占了 172.17.0.0/16。
我们可能会假设该规则旨在伪装任何离开 Docker 子网的内容,
iptables -t nat -A POSTROUTING -o br0 --src 172.17.0.0/24 -j MASQUERADE