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