
듀얼 포트 이더넷 NIC가 있고 두 포트를 모두 루프로 연결하고 다음 IP를 2개의 이더넷 인터페이스에 할당했다고 가정해 보겠습니다.
- eth2 -> 192.168.2.1
- eth3 -> 192.168.3.1
물리적 네트워크를 통해 포트 중 하나에서 다른 포트로 트래픽을 보내고 싶습니다(예: ping 192.168.3.1
from ) 192.168.2.1
. 그러나 Linux 커널의 TCP/IP 스택은 이 두 주소가 로컬임을 인식하고 대신 루프백 어댑터로 트래픽을 보내므로 트래픽이 물리적 네트워크에 도달하지 않습니다.
내가 해결책에 가장 가까운 것은 Anastasov의 것입니다.자신에게 보내기 패치, 안타깝게도 커널 3.6부터 중단되었으므로 Ubuntu 13.10(커널 3.11)에서는 작동하지 않습니다. 3.11용 패치를 다시 작성하려고 시도했지만 Ubuntu 배포판에서 해당 패치를 찾을 수 없는 것 같습니다.
- include/linux/inetdevice.h
- net/ipv4/devinet.c
- net/ipv4/fib_frontend.c
- net/ipv4/route.c
- 문서/네트워킹/ip-sysctl.txt
Send-to-Self 패치가 작동하도록 할 수 있는 방법이나 대체 솔루션이 있습니까?
답변1
네트워크 네임스페이스를 생성하고 인터페이스 중 하나를 해당 네임스페이스로 이동합니다.
ip netns add test
ip link set eth1 netns test
새 네임스페이스에서 셸을 시작합니다.
ip netns exec test bash
그런 다음 두 대의 컴퓨터가 있는 것처럼 진행합니다. 완료되면 셸을 종료하고 네임스페이스를 삭제합니다.
ip netns del test
답변2
아직 시도하지는 않았지만 해결 방법에 대한 몇 가지 가능성이 있다고 생각합니다.
가상 머신
호스트의 IP 스택에서 하나 이상의 NIC를 분리하여 IP 스택 문제를 해결합니다. 이를 가상 머신에 할당합니다. 그러나 성능 테스트의 경우 이는 바람직하지 않을 수 있습니다. 그러나 CPU 성능이 충분하다면 추가 소프트웨어 계층이 병목 현상을 일으키지 않을 수도 있습니다(그러나 어떻게 알 수 있습니까?).
다른 대상 주소
NIC 성능 테스트를 위해서만 레이어 2에서 패킷을 전송하려는 것 같습니다. 따라서 다른 IP 주소(어떤 경우에도 패킷이 유선을 통해 전송되도록 로컬이 아닌 주소)의 IP 패킷을 사용할 수 있습니다. 그런 다음 속임수를 씁니다. ip neigh
이 가짜 IP 주소를 다른 NIC MAC 주소에 매핑하는 영구 ARP 항목을 만드는 데 사용합니다.
그런 식으로 IP 연결을 만들 수도 있습니다. 그러나 두 NIC가 필요한 가짜 IP 두 개 중 하나와 통신하고 있다고 믿도록 및 를 iptables
사용해야 합니다 .SNAT
DNAT
원시 액세스
사소하지 않은 프로그래밍을 수행하려는 경우 원시 소켓을 열고 이더넷 프레임을 직접 만들 수 있습니다. 아마도 이것이 가장 빠른 해결책일 것입니다.