iptables NAT OUTPUT 체인은 라우팅 결정 후에 위치합니다. 이 부분은 DNAT에 대해 너무 늦습니다. IP 패킷이 DNAT된 경우 경로를 다시 지정하여 해결됩니다. 이것은 Linux 커널의 표준 동작입니다.
그림 3a와 3b는 iptables 체인이 IP 후크에 연결된 위치를 명확하게 보여줍니다. 브릿지 코드와 netfilter가 커널에서 활성화되면 iptables 체인도 브리징 코드의 후크에 연결됩니다. 그러나 이것이 더 이상 표준 IP 코드 후크에 연결되지 않는다는 의미는 아닙니다. 브리징 코드와 접촉하는 IP 패킷의 경우 br-nf 코드는 iptables 체인이 통과할 네트워크 코드의 위치를 결정합니다. 분명히 동일한 패킷이 체인을 두 번 통과하지 않는다는 것이 보장됩니다. 브리지 코드와 접촉하지 않는 모든 패킷은 그림 3b와 같이 표준 방식으로 iptables 체인을 통과합니다.
단일 IP 패킷/프레임이 NAT PREROUTING, FILTER INPUT, NAT OUTPUT, FILTER OUTPUT 및 NAT POSTROUTING ebtables 체인을 통과하는 것을 볼 수 있습니다.
이것은 브리지가 라우터로도 사용될 때 발생할 수 있습니다. 해당 IP 패킷을 포함하는 이더넷 프레임은 브리지의 대상 MAC 주소를 가지지만 목적지 IP 주소는 브리지의 주소가 아닙니다. iptables 체인을 포함하여 다음은 IP 패킷이 브리지/라우터를 통해 실행되는 방식입니다.
이것은 라우팅 결정이 패킷을 브리지 인터페이스로 보낸다고 가정합니다. 라우팅 결정이 패킷을 브릿지가 아닌 인터페이스로 보내는 경우 다음과 같은 현상이 발생합니다.
그림 3c와 3d는 IP 패킷이 브리지 포트에 도착했다고 가정합니다. 여기에서 분명히 "비대칭"인 것은 iptables PREROUTING 체인이 ebtables INPUT 체인보다 먼저 탐색되지만 기능을 희생하지 않고는 도움이 될 수 없다는 것입니다.
ebtables는 TCP/IP 네트워크 모델에 의한 OSI 계층 2(데이터 링크 계층) 또는 계층 1(링크 계층, 네트워크 액세스 계층)에 에서 동작합니다.
이더넷 계층에서 작동하는 브리지에 따라 로컬 컴퓨터로 향하는 패킷이 반드시 IP 레이어에 따라 로컬 컴퓨터로 향하는 것은 아닙니다. 이것은 라우팅이 작동하는 방식입니다(MAC 대상은 라우터이고 IP 대상은 통신하려는 실제 대상자입니다).
Linux 브리징 코드에는 6개의 관문이 정의되어 있으며, 그 중 ebtables용으로 BROUTING 관문이 추가되었습니다.
관문은 소프트웨어가 해당 위치를 통과하는 패킷/프레임을 처리하기 위해 자체적으로 연결할 수 있는 네트워크 코드의 특정 위치를 말합니다. 예를 들어, ebtables FORWARD 체인을 담당하는 커널 모듈은 브리지 FORWARD 관문에 연결됩니다. 이것은 모듈이 커널에 로드되거나 부팅될 때 수행됩니다.
ebtables BROUTING 및 PREROUTING 체인은 브리징 결정 전에 통과하므로 이러한 체인은 브리지에서 무시할 프레임도 볼 수 있습니다. 이 체인을 사용할 때 이를 고려해야 합니다. 또한 체인은 전달되지 않는 브리지 포트로 들어오는 프레임을 볼 수 없습니다. 프레임에 대한 브리지의 결정(그림 2b 참조)은 다음 중 하나일 수 있습니다.
1) 대상 MAC 주소가 브리지의 다른 쪽에 있는 경우 브리지합니다. 2) 대상 MAC이 있는 상자의 위치가 브리지에 알려지지 않은 경우 모든 포워딩 브리지 포트에 플러딩합니다. 3) 목적지 MAC 주소가 브리지 또는 포트 중 하나의 주소인 경우 상위 프로토콜 코드(IP 코드)로 전달합니다. 4) 대상 MAC 주소가 브리지의 같은 쪽에 있으면 무시합니다.
Ebtables에는 그림 2c와 같이 filter, nat 및 broute의 세 가지 테이블이 있습니다.
broute 테이블에는 BROUTING 체인이 있습니다. filter 테이블에는 FORWARD, INPUT 및 OUTPUT 체인이 있습니다. nat 테이블에는 PREROUTING, OUTPUT 및 POSTROUTING 체인이 있습니다.
filter OUTPUT과 nat OUTPUT 체인은 분리되어 사용됩니다.
그림 2b와 2c는 ebtables 체인이 브리지 관문에 부착된 위치를 명확하게 보여줍니다.
브리지에 종속된 NIC가 프레임을 수신하면 프레임은 먼저 BROUTING 체인을 거칩니다. 이 체인에서는 프레임을 Routing할지 브리지할지 여부를 선택할 수 있어 brouter를 만들 수 있습니다.
BROUTING은 라우터가 일부 프레임/패킷을 연결하고(즉, 링크 계층 정보를 기반으로 전달) 다른 프레임/패킷을 라우팅(즉, 네트워크 계층 정보를 기반으로 전달)하는 장치입니다. 브리지/Route 결정은 구성 정보를 기반으로 합니다. 예를 들어, Router는 두 네트워크 사이의 특정 트래픽(NetBEUI, ARP 등)을 브리징하는 동안 2개의 네트워크 사이의 IP 트래픽에 대한 일반 Router 역할을 하는 데 사용할 수 있습니다. IP 라우팅 테이블은 브리지 논리 장치를 사용하지 않으며 대신 상자에는 브리지 포트(브리지 종속 NIC)이기도 한 물리적 네트워크 장치에 할당된 IP 주소가 있습니다. BROUTING 체인의 기본 결정은 브리징입니다.
다음으로 프레임은 PREROUTING 체인을 통과합니다. 이 체인에서 프레임의 대상 MAC 주소(DNAT)를 변경할 수 있습니다. 프레임이 이 체인을 통과하면 브리징 코드가 프레임을 보낼 위치를 결정합니다. 브리지는 대상 MAC 주소를 보고 이를 수행하며 네트워크 계층 주소(예: IP 주소)는 신경 쓰지 않습니다.
브리지가 프레임이 로컬 컴퓨터를 대상으로 한다고 결정하면 프레임은 INPUT 체인을 통과합니다. 이 체인에서 브리지 상자로 향하는 프레임을 필터링할 수 있습니다. INPUT 체인을 통과한 후 프레임은 네트워크 계층 코드(예: IP 코드)로 전달됩니다. 따라서 라우팅된 IP 패킷은 ebtables FORWARD 체인이 아니라 ebtables INPUT 체인을 통과합니다. 이것은 논리적입니다.
그렇지 않으면 프레임이 브리지의 다른 쪽으로 보내질 수 있습니다. 그렇다면 프레임은 FORWARD 체인과 POSTROUTING 체인을 통과합니다. 브리지된 프레임은 FORWARD 체인에서 필터링할 수 있습니다. POSTROUTING 체인에서 MAC 소스 주소(SNAT)를 변경할 수 있습니다.
로컬에서 생성된 프레임은 브리징 결정 후 nat OUTPUT, filter OUTPUT 및 nat POSTROUTING 체인을 통과합니다. NAT OUTPUT 체인은 대상 MAC 주소를 변경할 수 있도록 하고 filterOUTPUT 체인은 브리지 박스에서 발생하는 프레임을 필터링할 수 있습니다. nat OUTPUT 체인은 브리징 결정 후에 탐색되므로 실제로는 너무 늦습니다. 속도를 빠르게 하려면, 이 부분을 변경해야 합니다. nat POSTROUTING 체인은 위에서 설명한 것과 동일합니다.
대상 장치가 논리적 브리지 장치인 경우 라우팅된 프레임이 이 세 가지 체인을 통과할 수도 있습니다.
iptables와 ebtables 필터링 테이블이 Linux 기반 브리지에서 어떻게 상호 작용하는지 설명합니다.
Linux 커널 영역에서 사용되는 패킷 필터링 도구를 netfilter라고 합니다. 이 netfilter를 조작하기 위한 사용자 영역에서 사용되는 유틸리티는 iptables, ebtables, arptables 등이 있습니다. iptables는 시스템 관리자가 리눅스 커널 방화벽이 제공하는 테이블들과 그것을 저장하는 체인, 규칙들을 구성할 수 있게 해주는 사용자 영역의 응용 프로그램을 말합니다. ebtables는 이더넷 프레임(OSI 2계층) 관점에서 netfilter rule을 설정하는 사용자 영역의 응용 프로그램을 말합니다. iptables와 유사하지만 이더넷 프로토콜이 IP 프로토콜보다 훨씬 간단하기 때문에 덜 복잡합니다.
2.6 커널에는 ebtables 및 br-nf 코드가 포함되어 있는데, br-nf 코드는 브릿지된 IP 프레임/패킷이 iptables 체인을 통과하도록 합니다. Ebtables는 이더넷 계층에서 필터링하지만 iptables는 IP 패킷만 필터링합니다.
연재하는 리눅스 기반 브릿지에서의 ebtables/iptables 상호 작용에서는 TCP/IP 네트워크 모델을 사용합니다. br-nf 코드는 TCP/IP 네트워크 모델을 위반하기도 하는데, 예를 들어 Link Layer 내부에서 IP DNAT를 수행하는 것이 가능합니다.