인터페이스 이름을 지정할 때 VLAN 브리지 인터페이스의 Ping이 실패하고 IP 주소 지정이 예상대로 작동합니다.

인터페이스 이름을 지정할 때 VLAN 브리지 인터페이스의 Ping이 실패하고 IP 주소 지정이 예상대로 작동합니다.

이상한 문제가 발생했습니다. IP 주소를 지정하는 VLAN 인터페이스에서 ping이 작동하지만 인터페이스 이름을 지정할 때는 작동하지 않습니다.

시스템은 Rocky Linux 8.5(4.18.0-348.el8.0.2.x86_64)를 실행하고 있습니다. 네트워크 인터페이스를 연결하고 레거시 네트워크 스크립트를 사용하여 4개의 브리지 인터페이스를 설정합니다(아래 스크립트 참조).

인터페이스/IP를 지정하지 않고 8.8.8.8로 핑하면 모든 것이 예상대로 작동합니다. 을 지정하면 br0모든 것이 예상대로 작동합니다. br1, br2또는 을 지정하면 br3응답을 받지 못합니다. br1등과 관련된 IP 주소를 지정하면 예상대로 작동합니다.

핑 출력

# PING WORKS
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=104 ms
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 104.224/104.224/104.224/0.000 ms

# PING WORKS
$ ping -I br0 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.3.15.22 br0: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=101 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=101 ms

# PING FAILS
$ ping -I br1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.4.15.22 br1: 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2031ms

# PING WORKS
$ ping -I 10.4.15.22 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.4.15.22 : 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=4.72 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=4.65 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=4.65 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 4.645/4.672/4.721/0.065 ms

아래 출력에서 ​​볼 수 있듯이 ip addr인터페이스 br1의 IP 주소는 10.4.15.22입니다. 이번에도 라우팅 테이블 vlan4를 사용하도록 설정되었으며 이와 관련된 올바른 규칙이 있습니다.

출력은 다음에서 비롯됩니다.ip addr show

# ip addr show
3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq master br0 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.3.15.22/16 brd 10.3.255.255 scope global br0
       valid_lft forever preferred_lft forever
7: eno1.4@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue master br1 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
8: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.4.15.22/16 brd 10.4.255.255 scope global br1
       valid_lft forever preferred_lft forever
9: eno1.5@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue master br2 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
10: br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.5.15.22/16 brd 10.5.255.255 scope global br2
       valid_lft forever preferred_lft forever
11: eno1.6@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue master br3 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
12: br3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.6.15.22/16 brd 10.6.255.255 scope global br3
       valid_lft forever preferred_lft forever

시스템 구성/네트워크 스크립트

$ cat /etc/sysconfig/network-scripts/ifcfg-eno1
TYPE=Ethernet
BOOTPROTO=none
DEVICE=eno1
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
MTU=9000

$ cat /etc/sysconfig/network-scripts/ifcfg-eno1.4 
DEVICE=eno1.4
BRIDGE=br1
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
MTU=9000
VLAN=yes

$ cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=10.3.15.22
GATEWAY=10.3.0.1
DNS1=10.3.0.1
NETMASK=255.255.0.0
ONBOOT=yes
NM_CONTROLLED=no
DEFROUTE=yes

$ cat /etc/sysconfig/network-scripts/ifcfg-br1
DEVICE=br1
IPADDR=10.4.15.22
GATEWAY=10.4.0.1
DNS1=10.4.0.1
DEFROUTE=no
TYPE=Bridge
BOOTPROTO=static
NETMASK=255.255.0.0
ONBOOT=yes
NM_CONTROLLED=no

$ cat /etc/sysconfig/network-scripts/route-br1 
10.4.0.0/16 dev br1 src 10.4.15.22 table vlan4
default via 10.4.0.1 dev br1 table vlan4

$ cat /etc/sysconfig/network-scripts/rule-br1 
from 10.4.15.22/32 table vlan4
to 10.4.15.22/32 table vlan4

/etc/iproute2/rt_tables

$ cat /etc/iproute2/rt_tables
3 vlan3
4 vlan4
5 vlan5
6 vlan6

ip route그리고 ip rule출력

$ ip route show
default via 10.3.0.1 dev br0 
10.3.0.0/16 dev br0 proto kernel scope link src 10.3.15.22 
10.4.0.0/16 dev br1 proto kernel scope link src 10.4.15.22 
10.5.0.0/16 dev br2 proto kernel scope link src 10.5.15.22 
10.6.0.0/16 dev br3 proto kernel scope link src 10.6.15.22 
169.254.0.0/16 dev br0 scope link metric 1006 
169.254.0.0/16 dev br1 scope link metric 1008 
169.254.0.0/16 dev br2 scope link metric 1010 
169.254.0.0/16 dev br3 scope link metric 1012

$ ip route show table vlan4
default via 10.4.0.1 dev br1 
10.4.0.0/16 dev br1 scope link src 10.4.15.22

$ ip rule
0:  from all lookup local
32758:  from all to 10.6.15.22 lookup vlan6
32759:  from 10.6.15.22 lookup vlan6
32760:  from all to 10.5.15.22 lookup vlan5
32761:  from 10.5.15.22 lookup vlan5
32762:  from all to 10.4.15.22 lookup vlan4
32763:  from 10.4.15.22 lookup vlan4
32764:  from all to 10.3.15.22 lookup vlan3
32765:  from 10.3.15.22 lookup vlan3
32766:  from all lookup main
32767:  from all lookup default

답변1

바인딩된 인터페이스에 대한 라우팅 규칙을 사용하여 전체 경로 테이블 선택SO_BINDTODEVICE, 키워드가 포함된 규칙oif다음도 사용해야 합니다.

oif 이름

일치시킬 발신 장치를 선택하십시오.나가는 인터페이스는 장치에 바인딩된 로컬 소켓에서 발생하는 패킷에 대해서만 작동합니다..

INADDR_ANY그렇지 않고 초기 조회 중에 소스 주소가 지정되지 않으면 조회 에서는 올바른 소스 IP 주소(예: 프롬프트 소스 또는 기타 알고리즘에서)를 계산하기 전에 기본값(즉, 0.0.0.0/0)을 소스 선택기로 사용합니다. . 추가된 라우팅 규칙은 다른 모든 테이블과 일치하지 않으므로 INADDR_ANY모든 추가 테이블을 건너뛰고 결국 다음을 사용하게 됩니다.기본br0결합된 장치에 대한 추가 필터가 있는 경로 테이블: 기본 경로가 정의되지 않으므로 기본 테이블에도 기본 경로가 없는 한 게이트웨이가 충분하지 않습니다 .

따라서 다음 명령을 추가해야 합니다. 각 줄은 자체 /etc/sysconfig/network-scripts/rule-brX파일에 있어야 합니다(빼기 기호 ip rule add).

ip rule add oif br0 lookup 3
ip rule add oif br1 lookup 4
ip rule add oif br2 lookup 5
ip rule add oif br3 lookup 6

인터페이스에 바인딩할 때 적절한 경로 테이블을 조회하여 각 경우에 올바른 게이트웨이를 제공합니다.


모든 커널 평가는 다음을 통해 확인할 수 있습니다.ip route get:

ip route get

단일 경로 가져오기

이 명령은 대상까지의 단일 경로를 사용하고 커널이 보는 것과 정확하게 그 내용을 인쇄합니다.

규칙을 첨부하기 전에

  • br0

    대칭을 위해 다음과 같은 라우팅 테이블도 있다고 가정합니다(그러나 그것은 중요하지 않습니다:기본라우팅 테이블이면 충분합니다 br0.):

    default via 10.3.0.1 dev br0 table 3 
    10.3.0.0/16 dev br0 table 3 scope link src 10.3.15.22 
    
    
    # ip route get from 10.3.15.22 to 8.8.8.8
    8.8.8.8 from 10.3.15.22 via 10.3.0.1 dev br0 table 3 uid 0 
        cache 
    # ip route get oif br0 to 8.8.8.8
    8.8.8.8 via 10.3.0.1 dev br0 src 10.3.15.22 uid 0 
        cache 
    

    두 번째 경우에는 원본 주소를 선택하지 않고 인터페이스에만 바인딩할 때 기본 테이블이 사용되지만 기본 테이블에도 기본 경로가 있으므로 이는 여전히 정확합니다 br0. 작동합니다.

  • br1

    # ip route get from 10.4.15.22 to 8.8.8.8
    8.8.8.8 from 10.4.15.22 via 10.4.0.1 dev br1 table 4 uid 0 
        cache 
    # ip route get oif br1 to 8.8.8.8
    8.8.8.8 dev br1 src 10.4.15.22 uid 0 
        cache 
    

    두 번째 경우에는 게이트웨이가 정의되어 있지 않으므로기본표에서는 해당 경로가 게이트웨이를 사용하지 않으며, 인터페이스가 필수이므로 8.8.8.8이 직접 연결된 것으로 가정합니다( tcpdump8.8.8.8에 대해 발행된 ARP 쿼리가 있을 경우 표시될 수 있음).

    이것은 작동하지 않습니다.

인터페이스 케이스에 대한 추가 규칙을 바인딩한 후

  • br0

    # ip route get oif br0 to 8.8.8.8
    8.8.8.8 via 10.3.0.1 dev br0 table 3 src 10.3.15.22 uid 0 
        cache 
    

    전체적인 결과는 동일하지만 작동하지만 이번에는 추가 테이블이 필요합니다.

  • br1

    # ip route get oif br1 to 8.8.8.8
    8.8.8.8 via 10.4.0.1 dev br1 table 4 src 10.4.15.22 uid 0 
        cache 
    

    이번에는 oif br1선택기가 올바른 게이트웨이로 올바른 기본 경로를 정의하는 경로 테이블 4를 선택합니다. 작동합니다.


참고: L3 인터페이스에도 유사한 설정을 사용하십시오(예: WireGuard 또는 OpenVPN과 같은 VPN 인터페이스).투엔모드)는 L3 인터페이스에 게이트웨이가 필요하지 않기 때문에 이를 필요로 하지 않습니다(정의된 경우에도 IP 아래에 확인할 L2 계층이 없기 때문에 사용되지 않음). 따라서 바인딩될 때 방출되는 트래픽에는 특정 게이트웨이가 필요하지 않습니다. 이 L3 인터페이스와 같은 경로 정의. 그럼에도 불구하고, 특히 라우팅 테이블에 경로 부정이 포함된 경우 이를 사용하는 것이 좋습니다.

관련 정보