이상한 문제가 발생했습니다. 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이 직접 연결된 것으로 가정합니다(
tcpdump
8.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 인터페이스와 같은 경로 정의. 그럼에도 불구하고, 특히 라우팅 테이블에 경로 부정이 포함된 경우 이를 사용하는 것이 좋습니다.