원격 SMTP 트래픽이 LXC 호스트에서 컨테이너로 들어오는 것으로 나타납니다.

원격 SMTP 트래픽이 LXC 호스트에서 컨테이너로 들어오는 것으로 나타납니다.

요약:LXC 컨테이너에 메일 서버(exim 4, Debian 10)가 있습니다. 호스트가 Debian 11을 실행 중입니다. 어젯밤부터 스팸 트래픽이 쏟아져 들어왔고 LXC 호스트에서 들어오는 것으로 보입니다. 그러나 tcpdump 로그에는 실제로 원격 트래픽인 것으로 표시됩니다. 무슨 일이야?

다음은 lxc 호스트에서 오는 것으로 보이는 스팸에 대한 메일 서버의 exim4 로그 항목의 예입니다.

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

관련 정보