Linux 브리지는 이전 BSD 시스템의 IP 패킷을 전달하지 않지만 다른 Linux 시스템의 패킷은 괜찮습니다.

Linux 브리지는 이전 BSD 시스템의 IP 패킷을 전달하지 않지만 다른 Linux 시스템의 패킷은 괜찮습니다.

개요

저는 Linux 단일 보드 컴퓨터를 AWS 호스트로 사용하고 있으며매우 오래되고 매우 희귀한 Unix 컴퓨터. 이 설정은 sudo apt upgrade그림과 같이 싱글 보드 컴퓨터에서 일부 문제가 발생한 최근까지 작동했습니다.이 사진에서.이제 브리지는 더 이상 기존 Unix 상자의 일부 이더넷 프레임을 전달하지 않는 것 같습니다.~ 할 것이다최신 Linux 컴퓨터의 이더넷 프레임에 대해 이 작업을 수행하십시오!무엇이 바뀌었는지, 어떻게 해결하는지 알고 싶습니다.

설정

위에 링크된 차트에 액세스할 수 없는 경우 회로도는 다음과 같습니다.

                     +----------------------------+            +----------------+
                     |  Raspberry Pi              |            |  AWS host      |
                     |                +--------+  |            | +---------+    |
+---------+          |                | fastd   \....internet.....\  fastd |    |
| Vintage |--10bT--[eth0]===[br0]===[lance0]    / |            |  /   [lance0]  |
| BSD 4.2 |          |                +--------+  |            | +---------+    |
+---------+          |                            |            |                |
                     +----------------------------+            +----------------+

이 설정에서 인스턴스는빠른(TAP 모드에서) Pi와 AWS 호스트는 두 시스템 사이에서 가상 이더넷 케이블 역할을 합니다. 나는 그것이 작동하는지 테스트했습니다.에테르Pi에서 AWS로 또는 그 반대로 링크를 통해 원시 이더넷 프레임을 양방향으로 보냅니다. 이더넷 인터페이스의 이름이 필요하기 lance0때문에역사적인 공물.

이제 Pi에서 가상 이더넷 케이블과 실제 이더넷 인터페이스를 eth0가상 이더넷 허브에 연결하고 싶습니다 br0. 이것은 귀하의 표준 TAP 브리지입니다.

ip link add name br0 type bridge
ip link set dev br0 up

ip link set dev lance0 master br0
ip link set dev eth0 master br0

이 작업을 수행하면 마치 기존 BSD 상자와 [lance0].......[lance0]"이더넷 케이블"을 동일한 이더넷 허브에 연결한 것과 같습니다. BSD와 AWS는 두 컴퓨터의 이더넷을 통해 서로 통신할 수 있어야 합니다.

질문

내가 AWS 호스트에 로그인했다고 상상해 보세요. IP가 할당되어 있습니다 (물론 v4) lance0. 기존 BSD 상자에 ping을 보내고 싶습니다. 작업을 단순화하기 위해 BSD 시스템(자체 IP 포함)과 AWS 호스트에 ARP 테이블을 수동으로 설정했습니다.오직트래픽은 ICMP 패킷이 됩니다(컴퓨터는 ARP 교환을 건너뛸 수 있음). 핑이 작동하지 않았기 때문에 조사를 위해 tcpdump -i [interface]. 우리는 다음을 관찰했습니다.

  • 좋아 보인다 eth0. AWS 상자의 에코 요청과 BSD 상자의 에코 응답을 볼 수 있습니다.
  • br0같은 이야기: 좋아 보인다.
  • 그러나 에서는 lance0에코 요청만 볼 수 있습니다. 에코 답글이 삭제됩니다!

eth0이제 케이블 끝에서 36년 된 BSD 시스템을 최신 Linux 시스템으로 교체한다고 상상해 보십시오 . 놀랍게도: 핑이 지워지고 모든 것이 정상입니다!

관찰 결과

이더넷과 TCP/IP는 구형 BSD 시스템에서 잘 작동합니다.모든 브리징을 제거하고 Pi에 IP를 연결하고 eth0하루 종일 Pi에서 BSD 상자를 ping/telnet/ftp할 수 있습니다.

ICMP 패킷은 BSD와 Linux에서 동일하게 보입니다.브리지를 사용하여 tcpdump -i br0 -XX핑 패킷과 해당 링크 계층 헤더의 16진수 덤프를 확인했습니다. 왜 최신 Linux 상자의 ping을 선호하지만 오래된 BSD 상자는 선호하지 않는지 이해할 수 없습니다. 직접 보시면서 비교해보실 수 있어요붙여넣기(이것은지원).

fastd 링크는 문제가 아닐 수도 있습니다.위에서 언급했듯이 그렇지 않으면 AWS 시스템과 최신 Linux 시스템 간의 핑이 작동하지 않습니다.

"일반적인 용의자"는 책임이 없는 것 같습니다. 이 페이지많은 StackOverflow/ServerFault 페이지에는 좋은 조언이 있지만 여기에는 적용되지 않는 것 같습니다. Pi에서는 전달 모드에 있고 관련된 모든 사람에게 올바른 이더넷 주소가 표시되는 것이 brctl show정상적으로 보입니다 . "filter" 및 "nat" 테이블은 모두 비어 있으며 ACCEPT 정책이 있습니다. 테이블 "필터"는 동일한 방식으로 작동합니다. 실행하면 아무것도 제공되지 않습니다(항목 없음).brctl showstp br0eth0lance0brctl showmacs br0ebtablesarptablesiptables-save

브리지는 이더넷 브로드캐스트 프레임을 전달합니다!때로는 BSD 시스템의 이전 NTP 데몬이 브로드캐스트 UDP 메시지를 보내는데, 이 메시지는 ff:ff:ff:ff:ff:ff로 주소가 지정된 이더넷 브로드캐스트 프레임에 압축됩니다. 이 프레임하다프레임이 브로드캐스트 주소가 아닌 주소로 전송되더라도 AWS 호스트에 도달하도록 합니다.아니요효과가 있었던 것 같습니다.

이 모든 것은 몇 달 전에 진행되었습니다.2월 초에 깨졌던 것 같아요.

질문

그렇다면 Pi의 Linux용 이더넷 탭 브리지가 더 이상 IP 페이로드가 포함된 일부 오래된(비브로드캐스트) 이더넷 프레임을 전달하는 것을 원하지 않는 이유는 무엇입니까? 아는 사람이 있다면 이러한 프레임워크 간의 차이점을 식별하는 데 사용할 수 있는 다른 도구가 있습니까?

관련 정보