두 Linux 호스트 사이에 VXLAN 터널이 있습니다. 터널은 MTU가 1500바이트인 이더넷 링크를 통해 전달됩니다. 각 끝에서 VXLAN 인터페이스와 다른 이더넷 인터페이스가 브리지에 종속됩니다. 다음과 같습니다.
| Host A | Host B |
Client Device <--> eth0 <--> br0 <--> vxlan0 <-|-> vxlan0 <--> br0 <--> eth0 <--> Client Device
| | |
| eth1 <-|-> eth1 |
여기서는 클라이언트 장치와 eth1에만 IP 구성이 있습니다. 다른 모든 것은 두 사이트 간의 레이어 2 링크일 뿐입니다.
VXLAN에는 50바이트의 오버헤드가 포함됩니다. 일부 프로토콜이 중단되는 것을 방지하기 위해 계층 2 링크(eth0, br0, vxlan0)의 MTU를 1500바이트로 설정했습니다. TCP 조각화를 방지하기 위해 vxlan0 인터페이스의 TCP MSS를 1400바이트로 설정하고 싶습니다. 어떻게 해야 하나요?
나는 브리지에 대해 iptables()를 켤 수 있다는 것을 알고 있습니다 echo 1 > /sys/class/net/br0/bridge/nf_call_iptables
. 그러나 iptables에는 시스템의 이 부분과 관련이 없는 다른 많은 규칙이 있으며 그렇게 하면 상당한 성능 비용이 발생합니다.
을 사용하여 라우팅을 위해 MSS를 설정할 수 있다는 것을 알고 있습니다 ip route add ... advmss 1400
. 그러나 관련된 패킷은 호스트 A 또는 호스트 B에서 라우팅되지 않습니다. 그들은 단순히 한 인터페이스에서 다른 인터페이스로 연결됩니다.
iptables 성능 저하를 초래하지 않고 이 트래픽에 더 낮은 TCP MSS를 적용할 수 있는 방법이 있습니까?
답변1
nftables교체할 예정ebtables+iptables: 대부분의 기능은 IP 수준에서와 마찬가지로 브리지 수준에서도 사용할 수 있습니다.br_netfilter(브리지 수준의 상태 저장 IP 방화벽, 커널 >= 5.3 포함)
bridgemss.nft
다음은 HostA 및 HostB에 로드된 규칙 세트(라고 부르겠습니다)입니다 nft -f bridgemss.nft
.
table bridge t
delete table bridge t
table bridge t {
chain c {
type filter hook forward priority filter; policy accept;
oifname vxlan0 tcp flags syn tcp option maxseg size set 1400
}
}
물론 필요에 맞게 규칙 세트를 변경할 수 있습니다(예: 호스트 A와 호스트 B에서 각각 한 방향을 사용하는 대신 호스트 A에서만 두 방향을 사용).
br0
HostA와 HostB에 직접 통신 대신 VXLAN을 통해 통신할 주소를 할당해야 합니까?이더넷 1, 이 규칙은 브리지 출력 후크(또는 시스템 출력 + 입력 후크)에서 반복되어야 합니다. 이는 전달된 프레임으로 간주되지 않기 때문입니다.