VRF에서 로컬 애플리케이션 바인딩

VRF에서 로컬 애플리케이션 바인딩

loLinux에는 기본적으로 IP 주소를 127.0.0.1/8로컬 애플리케이션에 바인딩할 수 있는 루프백 인터페이스가 있습니다 .

VRF 내부의 로컬 애플리케이션을 이 루프백 인터페이스에 바인딩할 수 없습니다. 예를 들면 다음과 같습니다.

ip link add vrf100 type vrf table 100
ip vrf exec vrf100 python3 -m http.server --bind 127.0.0.1
OSError: [Errno 99] 요청한 주소를 할당할 수 없습니다.

문제는 VRF에서 다른 IP 주소(예: 127.0.0.2)를 사용하여 루프백 인터페이스를 어떻게 생성할 수 있느냐는 것입니다. 여기서 로컬 애플리케이션을 다음과 같이 바인딩할 수 있습니다.

ip vrf exec vrf100 python3 -m http.server --bind 127.0.0.2 ???이 작업을 수행하는 방법

감사해요

답변1

솔직히 말해서 저는 VRF를 처음 접했지만 회원가입만 하면 될 것 같습니다. 참고:

Linux VRF에서 루프백 주소를 할당하는 방법은 무엇입니까?

하지만 내 생각은 이렇습니다.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

이 인터페이스는 루프백 인터페이스이며 전달 인터페이스가 아니며 자체 테이블이 있습니다.local

ip route show table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 
local 192.168.1.12 dev wlp114s0 proto kernel scope host src 192.168.1.12 
broadcast 192.168.1.255 dev wlp114s0 proto kernel scope link src 192.168.1.12 

여기에 내 두 가지 의견이 있습니다. 듣고 계시다면 실제로 127.0.0.1아무데도 가지 않기 때문에 VRF에 할당할 필요가 없습니다.

반면에 VRF는 ip ruleVRF 테이블을 조회하는 규칙을 만들지 않는 한 완전히 격리되어 있으므로 실제로 VRF에 인터페이스를 할당하고 주소를 할당할 수 있으며 해당 VRF로 라우팅하는 규칙이 없는 한 라우팅 테이블은 격리됩니다. VRF에 할당하는 모든 인터페이스에는 해당 경로가 해당 테이블로 이동하지만, 호스트/기본 gw 인터페이스를 VRF에 할당하면 해당 경로 도 해당 테이블에 있게 됩니다. 대안은 다음 사이에 라우팅 설정을 사용하는 것입니다.ip rule .

내 관점을 제시할 수 있다면:

sudo ip netns exec _netcrave ip route show table 130
192.0.0.4/30 dev vma130 proto kernel scope link src 192.0.0.5 
local 192.0.0.5 dev vma130 proto kernel scope host src 192.0.0.5 
broadcast 192.0.0.7 dev vma130 proto kernel scope link src 192.0.0.5 

sudo ip netns exec _netcrave ip route show
10.0.0.0/16 dev docker0 proto kernel scope link src 10.0.0.1 linkdown 
10.254.0.0/30 dev igwsl127 proto kernel scope link src 10.254.0.2 

ip route show
default via 192.168.1.1 dev wlp114s0 proto dhcp src 192.168.1.12 metric 600 
169.254.0.0/16 dev wlp114s0 scope link metric 1000 
192.168.1.0/24 dev wlp114s0 proto kernel scope link src 192.168.1.12 metric 600 

일반적으로 테이블 조회 규칙을 생성하는 방법은 다음과 같습니다.

ip netns exec _netcrave ip rule add to 192.0.0.4/30 table 130그러면 다음과 같은 결과를 얻게 됩니다:

sudo ip netns exec _netcrave ip rule show
0:      from all lookup local
999:    from all to 192.0.0.4/30 lookup 130
1000:   from all lookup [l3mdev-table]
32766:  from all lookup main
32767:  from all lookup default

일반적으로 ip vrf exec소스 주소로 바인딩하려는 경우, 예를 들어 ip vrf exec red130 ping 192.0.0.6192.0.0.5에 대한 인터페이스가 실제로 해당 VRF에 할당된 경우 192.0.0.5에서 ping을 실행하는지 확인하세요. 그렇지 않으면 vrf exec를 사용할 필요가 없으며 인터페이스가 표시됩니다. , 그러나 라우팅 테이블은 그렇지 않습니다. 그러나 NetNS를 사용하는 경우 반드시 인터페이스가 필요합니다 ip netns exec. 그렇지 않으면 인터페이스를 찾을 수 없습니다.

마음에 떠오른 또 다른 사항은 다음과 같습니다.

sudo ip netns exec _netcrave ip route show table local
local 10.0.0.1 dev docker0 proto kernel scope host src 10.0.0.1 
broadcast 10.0.255.255 dev docker0 proto kernel scope link src 10.0.0.1 linkdown 
local 10.254.0.2 dev igwsl127 proto kernel scope host src 10.254.0.2 
broadcast 10.254.0.3 dev igwsl127 proto kernel scope link src 10.254.0.2 
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 

또 다른 로컬 테이블이 있다는 것을 알 수 있을 것입니다.

local 192.168.1.12 dev wlp114s0 proto kernel scope host src 192.168.1.12 
    broadcast 192.168.1.255 dev wlp114s0 

이론적으로는 루프백 경로를 자체적으로 생성하여 이 테이블에 추가할 수 있습니다. 실제로 제가 틀렸을 수도 있지만 이것이 의도된 것 같습니다.

https://community.cisco.com/t5/switching/vrf-loopback-interface-into-global-table/td-p/3192007

답변2

따라서 초기 요구 사항은 VRF에서 실행되는 애플리케이션이 있고 관리 인터페이스가 있으며 이를 로컬 호스트에 바인딩하고 싶다는 것입니다.

ip vrf exec vrf100 myapp --adminif <localhost in vrf100> --userif <physical interface in vrf100>

다음과 같은 작동하는 솔루션을 찾았습니다.

ip link add vrf100 type vrf table 100 #create vrf with table 100
ip link add lo-vrf100 type dummy      #add dummy interface that will serve as our loopback
ip link set lo-vrf100 master vrf100   #enslave the interface to vrf100
ip addr add 127.0.0.2/8 dev lo-vrf100 #add ip to this interface
ip link set vrf100 up
ip link set lo-vrf100 up

이제 정책 라우팅 테이블을 보면 다음과 같습니다(규칙 0은 1000 이전에 처리되는 식입니다).

ip rule show
0:      from all lookup local
1000:   from all lookup [l3mdev-table]
32766:  from all lookup main
32767:  from all lookup default

로컬 라우팅 테이블을 살펴보면 다음과 같습니다.

ip route sh table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1

그런 다음 IP 범위가 여기에서 처리되지만 127.0.0.0/8vrf는 나중에 처리될 특수 테이블 [l3mdev-table]에서 처리되는 것을 볼 수 있습니다.

ip route sh table 100
127.0.0.0/8 dev lo-vrf100 proto kernel scope link src 127.0.0.2
local 127.0.0.2 dev lo-vrf100 proto kernel scope host src 127.0.0.2
broadcast 127.255.255.255 dev lo-vrf100 proto kernel scope link src 127.0.0.2

from all lookup local따라서 해결책은 정책 라우팅 항목 전에 IP 127.0.0.2를 처리하는 규칙을 만드는 것입니다.

ip rule add table local priority 100 #have an identical entry but with a higher prio
ip rule add from 127.0.0.2 table 100 prio 50
ip rule add to 127.0.0.2 table 100 prio 51
ip rule del priority 0 #delete the original local rule

최종 정책 라우팅 테이블은 다음과 같습니다.

ip rule sh
50:     from 127.0.0.2 lookup 100
51:     from all to 127.0.0.2 lookup 100
100:    from all lookup local
1000:   from all lookup [l3mdev-table]
32766:  from all lookup main
32767:  from all lookup default

내 첫 번째 게시물의 Python http 서버 예제는 잘 작동합니다.

ip vrf exec vrf100 python3 -m http.server --bind 127.0.0.2
Serving HTTP on 127.0.0.2 port 8000 (http://127.0.0.2:8000/) 
ip vrf exec vrf100 wget http://127.0.0.2:8000 #downloads file sucessully

관련 정보