KVM과 함께 Ubuntu 서버 16.04를 실행하는 베어메탈과 Ubuntu 서버 16.04를 실행하는 게스트 VM에 브리지 br1, br2 및 br3로 연결된 3개의 NIC가 있습니다.
첫 번째 NIC인 br1은 인터넷에 연결되어 있으며 해당 라우터 주소는 게스트의 기본 게이트웨이로 정의됩니다.
br2 및 br3에서 수신한 패킷을 수신해야 하는 게스트에서 실행 중인 코드가 있습니다. 코드는 1개의 NIC만 수신해야 합니다.
다음과 같이 en2(br2를 통해 브리지되는 게스트 NIC의 이름)에서 en3(br3과 동일)로 트래픽을 전달해 보았습니다.이에 따라:
sudo nano /etc/sysctl.conf
uncomment net.ipv4.ip_forward = 1
sudo sysctl -p
sudo iptables -t nat -A POSTROUTING --out-interface en3 -j MASQUERADE
sudo iptables -A FORWARD --in-interface en2 --out-interfac en3 -j ACCEPT
그러나 NIC2를 사용하고 ping 메시지를 보낼 때 기록된 내용은 없습니다 sudo tpcdump -i en3
(실행하면 sudo tpcdump -i en2
ping 메시지를 볼 수 있습니다).
내가 여기서 무엇을 놓치고 있는 걸까요? 원하는 결과를 얻을 수 있는 더 좋은 방법이 있습니까(내 코드가 1개의 NIC를 수신하고 두 NIC의 트래픽을 모두 가져오는 것)?
답변1
nflog
전달된 트래픽을 구체적으로 수신하려면 규칙/인터페이스를 만드는 것이 좋습니다 .
따라서 인터페이스를 생성합니다 nflog
.
sudo iptables -t filter -I FORWARD -j NFLOG --nflog-group 6
그런 다음 들어보세요.
sudo tcpdump -s 0 -n -i nflog:6
문제에 대한 해결책은 iptables 프레임워크의 nflog 인터페이스를 사용하여 우리가 관심 있는 패킷을 정확하게 얻는 것입니다.
nflog 규칙은 0 - 2^16-1 범위의 정수로 식별되는 커널 내부 멀티캐스트 그룹에 기록됩니다. 프레임워크가 보는 데이터그램 부분만 캡처됩니다. IPv4 패킷인 iptables의 경우.
nflog를 사용하여 패킷을 덤프하면 tcpdump 및 Wireshark에 대한 특수 인터페이스 구문을 사용해야 합니다. nflog:groupnumber를 인터페이스로 사용해야 합니다.
nflog 규칙은 일반적인 iptables 규칙이므로 원하는 트래픽을 정확하게 얻을 수 있도록 규칙에 적절한 일치 항목과 대상 부분이 필요합니다. 또한 관심 있는 패킷을 가져오려면 규칙을 올바른 위치에 배치해야 합니다.