한 인터페이스에서 다른 인터페이스로 모든 패킷을 맹목적으로 전달하는 방법은 무엇입니까?

한 인터페이스에서 다른 인터페이스로 모든 패킷을 맹목적으로 전달하는 방법은 무엇입니까?

eth0에서 수신된 모든 L3 패킷을 다른 인터페이스로 전달하고 싶습니다. m0(m0은 고유한 L2 프레이밍 메커니즘을 사용하여 사용자 정의 하드웨어에 바인딩된 사용자 정의 인터페이스)를 호출하고 m0-> eth0을 역방향으로 설정해 보겠습니다. 예를 들어, m0의 샘플 구현은 SLIP 인터페이스일 수 있습니다. 이를 달성하려면 사용자 공간 도구를 사용하는 것이 가장 좋습니다.

까다로운 부분은 라우팅하고 싶지 않다는 것입니다. 소스 또는 대상 IPv4 주소가 무엇인지, MAC 주소가 무엇인지는 상관하지 않습니다. 나는 L3 패킷을 수정하지 않고 인터페이스 0의 모든 것을 맹목적으로 가져와서 인터페이스 1(또는 그 반대로)로 옮기고 싶습니다.

나는 eth0(이 사용 사례에서)을 통해 들어오는 모든 것이 조각 없이 이더넷 mtu 1500에 적합한 ipv4 UDP 패킷이라는 것을 알고 있습니다. 또한 멀티캐스트 주소 지정 패킷을 처리해야 합니다.

유감스럽게도 이를 달성하는 유일한 방법은 무차별 모드에서 인터페이스에 상주하는 사용자 정의 소프트웨어를 사용하는 것입니다. 패킷이 소스로 루프백되는 상황에 빠지는 것을 피하기 어렵기 때문에 이를 피하고 싶습니다.

예를 들어,

  1. eth0 및 m0을 폴링하여 데이터가 수신되었는지 확인
  2. eth0은 패킷 A를 수신합니다.
  3. 패킷 A는 eth0에서 캡처되어 m0으로 전송됩니다.
  4. m0은 패킷 A를 수신합니다.
    1. 패킷 A가 처리되었지만 소프트웨어는 이를 어떻게 알 수 있습니까? 이전에 처리된 패킷에 대한 일종의 테이블을 유지해야 하는데... 짜증나네요.

Linux에서 설정하는 경우, 제가 수행한 모든 연구를 통해 다음과 같은 조합을 찾을 수 있었지만 이 사용 사례에는 적합하지 않다고 생각합니다.

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i eth0 -o m0 -j ACCEPT
iptables -A FORWARD -i m0 -o eth0 -j ACCEPT

정적 라우팅을 통해 달성 가능

고정 경로를 설정하고 양방향 메시징을 확인하여 인터페이스가 모두 제대로 작동하는지, 이것이 하드웨어 문제가 아닌지 확인하십시오. 나는 이것이 불가능하다고 생각하기 시작했습니다.

이제 PC0은 테스트를 위해 PC1에 직접 연결할 수 있습니다.

    ping 192.168.2.110 -t 10

PC1의 응답은 무선을 통해 수신됩니다.

네트워크 맵:

                              eth0               eth0
                          192.168.0.111      192.168.2.112
              PC0 --- eth --- unit111 --- rf --- unit112 --- eth --- PC1
        192.168.0.110     192.168.1.111      192.168.1.112       192.168.2.110
                               m0                 m0

컴퓨터 0:

        IFPC=enx4865ee1495b5
        ip link set $IFPC up
        ip addr flush $IFPC
        ip addr add 192.168.0.110/24 dev $IFPC
        ip route add 192.168.1.0/24 via 192.168.0.111
        ip route add 192.168.2.0/24 via 192.168.0.111

111호:

        ip link set eth0 up
        ip addr flush eth0
        ip addr add 192.168.0.111/24 dev eth0
        ip link set m0 up
        ip addr flush m0
        ip addr add 192.168.1.111/24 dev m0
        ip route add 192.168.2.0/24 via 192.168.1.111
        echo 1 > /proc/sys/net/ipv4/ip_forward

112호:

        ip link set eth0 up
        ip addr flush eth0
        ip addr add 192.168.2.112/24 dev eth0
        ip link set m0 up
        ip addr flush m0
        ip addr add 192.168.1.112/24 dev m0
        ip route add 192.168.0.0/24 via 192.168.1.112
        echo 1 > /proc/sys/net/ipv4/ip_forward

컴퓨터 1:

        IFPC=enp0s31f6
        ip link set $IFPC up
        ip addr flush $IFPC
        ip addr add 192.168.2.110/24 dev $IFPC
        ip route add 192.168.1.0/24 via 192.168.2.112
        ip route add 192.168.0.0/24 via 192.168.2.112

애플리케이션 컨텍스트

이는 RF 전송을 위한 자체 L2/L1이 있는 무선 장치용입니다. 네트워크 가장자리에 있는 시스템에 배치되도록 보장되며 이더넷 인터페이스를 통해 수신되는 패킷만 RF를 통해 전송됩니다. RF 체인에 사용되는 L2 인터페이스는 DMA인데, (m0)에 대한 네트워크 인터페이스를 구축했습니다.아이디어이는 이더넷 인터페이스에 대한 연결을 단순화합니다. M0의 모든 L2/L1은 m0 DMA를 통해 패킷을 섞는 FPGA 구현입니다.

라디오에서 패킷을 보내고 받는 시스템의 관점에서 보면 라디오는 기본적으로 패킷이 들어오고 나가는 전선처럼 보입니다.

전송 체인:

[eth rx frame]->[??forward to m0??]->[m0 places pkt in dma for l2 chain]->[frame (L2),mod,out to rf]

수신 체인:

[rf,demod,deframe(L2)]->[m0 rx pkt creates skb]->[??forward to eth0??]->[eth0 rx skb transmits ethernet frame]

라디오는 전이중 방식이므로 동시에 송신과 수신을 모두 수행할 수 있어야 합니다. 즉, 이더넷에서 패킷을 가져와 무선 주파수를 통해 전송하고, 무선 주파수를 통해 패킷을 수신하여 이더넷으로 다시 보내는 것입니다.

문제 없이 일반 소켓 코드를 사용하여 m0을 통해 RF 체인에 패킷을 넣고 복원할 수 있습니다. 패킷을 건드리지 않거나 인터페이스를 난잡하게 열고 C 코드(언급한 대로 자체 웜 캔이 있음)에서 수동으로 수행하지 않고 인터페이스 간에 모든 트래픽을 전달하는 방법을 모르겠습니다.

답변1

편집: "브리지 없음" 세부 사항을 잊어버렸지만 두 번째 기사에서는 요청한 대로 작업을 수행하여 이더넷 및 무선 LAN과 같은 다양한 네트워크 유형을 연결할 수 있는 레이어 3 솔루션을 제공해야 합니다.

원래 답변:

나는 "linux kernel 인터페이스 passthrough"라는 문구를 사용하여 몇 가지 검색을 했고, 그 결과 debian.org에서 당신이 찾고 있는 답변을 정확히 제공하는 것처럼 보이는 몇 가지 기사를 발견했습니다. 따라서 여기서는 더 이상 멋진 설명이 필요하지 않습니다. 그러지 말고 추가하세요. 두 번째 기사에서는 유선 네트워크를 무선 네트워크에 연결하는 방법과 액세스 포인트 보안과 관련된 잠재적인 문제를 구체적으로 다루고 있습니다.

기사에서 다루는 소프트웨어는 일반적으로 현재 데비안 저장소에서 찾을 수 있습니다.

항목 1: "브리지 네트워크 연결"https://wiki.debian.org/BridgeNetworkConnections

항목 2: "프록시 ARP를 사용하여 네트워크 연결 브리지하기"https://wiki.debian.org/BridgeNetworkConnectionsProxyArp(3층교)

주어진 제안을 다시 작성하면(어쨌든 아무런 가치도 추가되지 않음) 머리가 아플 수 있기 때문에 이것이 앞으로 나아갈 합리적인 방법을 제공하기를 바랍니다.

답변2

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o wlan1 -m state --state ESTABLISHED,RELATED \
         -j ACCEPT
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

관련 정보