KVM이 포함된 Ubuntu Server 16.04를 실행하는 베어메탈과 브리지 br1, br2 및 br3을 통해 Ubuntu Server 16.04를 실행하는 게스트 VM에 연결된 3개의 NIC가 있습니다.
첫 번째 NIC인 br1은 인터넷에 연결되며 해당 라우터 주소는 게스트의 기본 게이트웨이로 정의됩니다.
br2 및 br3에서 수신한 패킷을 수신 대기해야 하는 코드가 게스트에서 실행 중입니다. 코드는 1개의 네트워크 카드만 수신해야 합니다.
en2(br2를 통해 브리지된 게스트 네트워크 카드의 이름)에서 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
sudo tpcdump -i en3
그러나 NIC2를 사용하고 ping 메시지를 보낼 때 아무 것도 기록되지 않습니다. (반면 실행하면 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 범위의 정수로 식별되는 커널 내부 멀티캐스트 그룹에 기록됩니다. 프레임워크가 보는 데이터그램 부분만 캡처합니다. iptables의 경우 이는 IPv4 패킷입니다.
nflog를 사용하여 패킷을 덤프하면 tcpdump 및 Wireshark에 대한 특수 인터페이스 구문을 사용해야 합니다. nflog:groupnumber를 인터페이스로 사용해야 합니다.
nflog 규칙은 일반적인 iptables 규칙이므로 원하는 트래픽을 정확히 얻으려면 규칙에 올바른 일치 항목과 대상 부분이 필요합니다. 또한 관심 있는 패킷을 얻을 수 있도록 규칙을 올바른 위치에 배치해야 합니다.