
다음과 같은 네트워크 토폴로지가 있습니다.
보시다시피 em1
(1.1.8.209)는 인터넷을 통해 통신할 수 있는 물리적 인터페이스입니다. 두 개의 vm 인스턴스를 만들었습니다. PID 8740
및 PID 8817
둘 다 네트워크 IP를 사용 1.1.8.210/29
하고 1.1.8.211/29
둘 다 공용 IP 주소를 사용합니다.
이제 인터넷을 통해 em1과 통신할 수 있습니다.
하지만 요구 사항이 있습니다. 두 VM에 직접 액세스하고 싶기 때문에 em1을 br0
.
그런 다음 이것을 실행했습니다.
brctl addif br0 em1
토폴로지는 다음과 같습니다.
1.1.8.209
하지만 이 명령을 실행한 후 오류가 발생하고 더 이상 통신할 수 없습니다 . 그런 다음 첨부 파일을 삭제하면 이제 brctl delif br0 em1
액세스할 수 있습니다 1.1.8.209
.
이 문제가 발생하는 이유는 무엇입니까? 이해가 안 돼요. 이유를 설명해 주세요.
답변1
인터페이스가 브리지 포트가 되면 더 이상 라우팅에 참여하지 않습니다.
낮은 수준의 세부 사항은 이 블로그에 설명되어 있습니다.Linux 브리지의 적절한 격리:
프레임을 전역 또는 장치별 프로토콜 처리기(예: IPv4, ARP, IPv6)에 넘겨줍니다.
브리지 인터페이스의 경우 커널은 장치별 수신 핸들러인
br_handle_frame()
. 이 기능은 STP 및 LLDP 프레임을 제외하고 또는 "브라우팅"이 활성화된 경우를 제외하고 수신 인터페이스의 컨텍스트에서 추가 처리를 허용하지 않습니다. 그러므로,프로토콜 핸들러는 실행되지 않습니다.이 경우.
이러한 브리지 포트의 IP 주소는 들어오는 패킷과 관련이 없게 됩니다. 설정된 상태로 놔두면 나가는 패킷의 적절한 라우팅이 여전히 중단될 수 있습니다. 왜냐하면 이러한 패킷은 더 이상 브리지 포트를 통해 직접 전송될 수 있기 때문입니다.
해야 할 일은 IP 주소를 브리지에 연결된 다른 쪽 끝이 있는 시스템(또는 네트워크 네임스페이스 또는 동일한 위치에 있는 veth 쌍의 다른 자유 끝)이나 브리지의 자체 포트, 즉 브리지 자체로 이동하는 것입니다. . 이 이동 중에 중단이 발생하는 작은 시간 창이 항상 있으므로 이 구성을 변경하기 위해 로컬에서 수행되는 작업은 네트워크 액세스에 의존해서는 안 됩니다(예: 중단된 경로를 사용하여 셸을 통해 원격으로 명령을 입력하는 데 의존해서는 안 됩니다).
아래에서는 최신 구문을 갖춘 최신 도구만 사용하겠습니다.
예를 들어:
ip address flush dev em1
ip address add 1.1.8.209/29 dev br0
대신 브리지를 라우팅에 참여하지 않고 추가로 사용하는 다른 방법이 있습니다.베스라우팅에 참여할 쌍의 끝(동일한 네트워크 네임스페이스에 있음)은 다음과 같을 수 있습니다.
ip address flush dev em1
ip link add name em1twin type veth peer name br0portem1twin
ip link set br0portem1twin master br0 up
ip link set em1twin up
ip address add 1.1.8.209/29 dev em1twin
두 경우 모두 기본 경로(또는 다른 경로)가 이 주소의 존재에 의존하는 경우 이 경로도 사라졌으므로 다시 추가해야 합니다.