~/network/concepts/loopback
L3

Loopback

Loopback Interface

물리 포트에 종속되지 않는 논리 인터페이스다. 소프트웨어로만 존재하기 때문에 케이블이 빠지거나 포트가 죽어도 인터페이스 상태는 항상 up으로 유지된다(admin down으로 직접 내리지 않는 한). 이 "절대 죽지 않는 인터페이스" 라는 성질 하나가 loopback의 모든 용도를 만든다.

호스트 OS의 루프백 대역(127.0.0.0/8, IPv6 ::1)과 이름은 같지만 다른 개념이다. 그쪽은 자기 자신에게 보내는 패킷용으로 예약된 주소 대역이고, 여기서 다루는 것은 라우터나 스위치에 만들어 실제 라우팅 도메인에 광고하는 인터페이스다.

주소 할당

  • prefix 길이 — /32(IPv6는 /128)로 준다. 호스트 하나짜리 네트워크라 주소 낭비가 없고, 라우팅 테이블에도 한 줄만 올라간다.
  • 전용 대역 — loopback 주소 전용으로 예약한 대역을 따로 잡고 장비별로 순차 할당한다. 대역이 모여 있으면 ACL, 라우팅 정책, 필터를 한 줄로 처리할 수 있다.
  • 유일성 — 라우팅 도메인 안에서 중복되면 안 된다. 중복 시 Router ID 충돌로 OSPF 인접 관계가 맺어지지 않는다.
  • IGP 광고 — loopback을 IGP에 광고하지 않으면 다른 장비에서 도달할 수 없다. iBGP 세션도, 관리 접속도 성립하지 않는다.

용도

Router ID

OSPF와 BGP는 프로세스를 식별하는 32비트 Router ID를 필요로 한다. 명시하지 않으면 장비는 활성 인터페이스 중 가장 높은 IP를 고르되, loopback이 있으면 loopback을 우선한다.

물리 인터페이스 IP가 Router ID가 되면 그 링크가 다운될 때 ID가 바뀌고, 인접 관계가 끊어졌다가 재수렴한다. loopback은 다운되지 않으므로 ID가 고정된다. Router ID는 명시적으로 지정하는 것이 원칙이고, 그 값으로 loopback 주소를 쓴다.

iBGP Peering

BGP 세션을 물리 인터페이스 IP로 맺으면 그 링크가 끊길 때 세션도 함께 끊긴다. loopback을 peer 주소로 쓰면, 두 장비 사이에 ECMP나 우회 경로가 있는 한 링크 하나가 죽어도 세션이 유지된다.

  • iBGP — loopback peering이 기본이다. update-source로 출발지 인터페이스를 loopback으로 고정해야 상대가 기대하는 소스 IP와 일치한다.
  • eBGP — 직접 연결된 인터페이스끼리 맺는 것이 기본(TTL 1)이므로, loopback으로 맺으려면 ebgp-multihop과 상대 loopback으로 가는 정적 경로가 필요하다.

오버레이 터널 종단

  • VXLAN — VTEP의 소스 IP로 loopback을 쓴다. 언더레이에 경로가 여러 개일 때 특정 uplink가 죽어도 터널 종단 주소는 변하지 않는다.
  • MPLS — LDP Router ID와 LSP 종단 주소로 loopback을 사용한다.

관리 접속

SSH, SNMP, Syslog, NTP, TACACS+ 같은 관리 트래픽의 출발지 인터페이스를 loopback으로 고정한다.

  • 어느 경로로 나가든 장비가 항상 같은 IP로 식별된다.
  • 서버 쪽 ACL에 장비의 물리 인터페이스 IP를 전부 나열할 필요 없이 loopback 하나만 허용하면 된다.

OOB 포트(예: mgmt0)는 서비스망이 완전히 죽었을 때도 콘솔 서버나 관리 전용 스위치를 통해 접속하기 위한 용도로, 데이터 경로와 물리적으로 분리된 별도 망이고, loopback은 인밴드로 들어오는 SSH, SNMP, Syslog의 고정 주소 역할을 한다. 평상시 관리 접속은 loopback으로 받고, 인밴드 망 장애 시 OOB로 들어가는 식으로 둘을 보완적으로 쓴다.

Config

Cisco IOS

interface Loopback0
 ip address 10.255.0.1 255.255.255.255
!
router ospf 1
 router-id 10.255.0.1
 network 10.255.0.1 0.0.0.0 area 0
!
router bgp 65001
 bgp router-id 10.255.0.1
 neighbor 10.255.0.2 remote-as 65001
 neighbor 10.255.0.2 update-source Loopback0
!
ip ssh source-interface Loopback0
logging source-interface Loopback0
snmp-server trap-source Loopback0

Juniper Junos

set interfaces lo0 unit 0 family inet address 10.255.0.1/32
set routing-options router-id 10.255.0.1
set protocols ospf area 0.0.0.0 interface lo0.0 passive
set protocols bgp group ibgp local-address 10.255.0.1
set system syslog host 10.0.0.10 source-address 10.255.0.1

Junos의 lo0.0은 Routing Engine으로 향하는 트래픽이 통과하는 인터페이스이기도 하다. 어느 물리 인터페이스로 들어왔든 장비 자신의 주소를 목적지로 하는 패킷은 lo0.0을 거쳐 RE로 올라가므로, lo0.0에 input 필터를 걸면 장비 자체를 향한 트래픽(control plane) 전체를 한곳에서 제어하는 protection 필터가 된다. 통과(transit) 트래픽에는 영향이 없다. 필터는 라우팅 프로토콜과 관리 트래픽만 허용하고 나머지는 버리는 방식으로 만든다. loopback 주소를 설정할 때 이 필터도 함께 설계해 두는 것이 좋다.

Cisco는 구조가 다르다. Loopback0에 ACL을 걸어도 Loopback0 주소를 목적지로 하는 패킷에만 적용되고, 물리 인터페이스 IP로 들어오는 트래픽은 걸러지지 않는다. 그래서 control plane 보호는 CoPP(Control Plane Policing)로 한다. CoPP는 control-plane에 정책을 적용해 CPU로 올라가는 트래픽을 목적지 주소와 상관없이 한곳에서 허용하거나 속도를 제한한다.

고려할 점

  • loopback 여러 개 — Loopback0은 Router ID와 관리용, 다른 번호는 서비스 용도(anycast, VTEP)로 분리해 쓸 수 있다. Router ID 선정이 의도치 않은 loopback을 고르지 않도록 값을 명시한다.
  • Anycast loopback — 여러 장비에 같은 loopback 주소를 부여해 가장 가까운 노드로 유도하는 구성(anycast RP, anycast VTEP)에서는 중복이 의도된 것이다. 이때는 Router ID용 loopback을 따로 둔다.
  • passive 설정 — loopback에서는 인접 관계가 맺어질 일이 없다. IGP에 광고는 하되 인터페이스는 passive로 두어 불필요한 hello 전송을 막는다.