[ISP][BGP] 서브넷 나눠서 사용하기

리서치 겸 취미로 ISP를 조그마하게 운영을 하고 있는데, IP주소 자원을 효율적으로 관리하기 위해 삽질하던 내용을 정리 해 보았다.

이 글을 참조하면, 자신의 ISP를 만들어 집에서 나만의 IP를 직접 사용 해 볼 수 있는 기회를 경험 해 볼 수있다.

현 상황은 다음과 같다.

Internet - V사 BGP Session - Wireguard(For iBGP, Edge Router) - Site router - VM

순으로 연결되는 방식을 사용하고있었다.


엣지 라우터와 사이트 라우터의 뜻을 정의 하면,

Edge Router : eBGP로 IP 리소스를 광고하는 라우터 (V사)
Site Router : iBGP로 서브넷을 나누어 실제로 사용할 사이트에 있는 라우터

로 정리할 수있다.

전 세계 네트워크에서는 최소한의 광고(Announce)할 수 있는 IP의 단위는
IPv4 : /24
IPv6 : /48
로 정해져있다.

현재 IPv4 /24, IPv6 /48를 보유하고 있고, 이것을 효율적으로 사용하고 싶어서 서브넷을 나눠서 사용하기로 생각 했다.

현재 VM Pool을 운영하고 있는 상황에서 VM에 공인 IP를 부여하고 싶다는 생각으로 시작 한 프로젝트이다.

IPv4 /24는 2개의 /25 서브넷으로 분리를 할 수 있다. (160.22.155.0/24)를 기준으로,

160.22.155.0/25
160.22.155.128/25

로 나눌수 있으며, IPv6도 /48를 전체 쓰기에는 너무 큰 사이즈이기에,

2a11:29c0:51:bada::/64

를 이번 글에서는 사용할 예정이다.


먼저, 전 세계 인터넷으로 광고(Announce)하고 있는 eBGP는 건들이지 않고, 서브넷을 iBGP를 통해 내부에서 /25로 나눠주는 작업을 해야한다.

iBGP -> internal BGP <- 같은 AS안에서 서로간의 라우팅을 공유하기 위한 방식
eBGP -> external BGP <- 실제 인터넷에 내가 이런 IP를 가지고있다고 광고하는 방식

Edge Router(iBGP)중 일부 발췌 (Bird2 2.16.1)

#####################################
###iBGP 160.22.155.128/25
#####################################
protocol bgp IBGP_site_router {
    # iBGP 설정
    local as 214189;              -> iBGP이기에, local AS는 자신의 ASN을 사용
    neighbor 172.16.0.2 as 214189;-> Wireguard로 Edge와 Site를 연결하였으므로, 사설 IP, Site Router의 주소와 iBGP이기에 자신의 ASN을 사용
    source address 172.16.0.1;    -> 현재 wireguard에 할당된 이 서버의 사설IP
    
    ipv4 {
        import all;
        export all;
        next hop self; -> iBGP에서는 중요함.
    };
    ipv6 {
        import all;
        export all;
        next hop self;
    };
}

위와 같이 설정이 완료 되었다면, birdc config로 reconfiguration을 진행해준다.

반대편인 Site Router에서도 거의 동일한 설정을 사용한다.

이렇게 되면, iBGP를 맺었기에, 같은 ASN (214189) 내에서의 라우팅을 만들 수 있다.

Bird config 안에 다음과 같은 내용을 추가하여, /25로 나눈 IP중 160.22.155.128/25와 2a11:29c0:51:bada::/64의 서브넷을 광고 하게 된다.

########################################
# Local Prefix Announce
########################################
protocol static INTERNAL_V4 {
    ipv4;
    route 160.22.155.128/25 via "ens19";
}

protocol static INTERNAL_V6 {
    ipv6;
    route 2a11:29c0:51:bada::/64 via "ens19";
}

즉, 160.22.155.128/25는 사이트 라우터 에서 광고를 하고, 160.22.155.0/25는 엣지 라우터에서 광고 하게 된다.

이렇게 되면, 160.22.155.0/24는 엣지 라우터에서 전세계로 광고 하고, 내부에서는 2개의 서브넷으로 나눠져, 안에서 라우팅이 되는 구조이다.

iBGP로 세션은 만들었으니, 160.22.155.128/25를 광고해야한다.

위와 같이 내가 어떤 서브넷을 광고 할지에 대한 부분이다.
via "ens19"부분은 추후에 DHCP로 VM pool내 VM에 할당 시 사용하는 인터페이스이기 때문이다.


이제 BGP와 엣지 라우터와 사이트 라우터간의 iBGP를 위한 설정은 완료되었다.
위와 같은 설정을 사용하게되면, 본인이 삽질 한 문제가 발생하기 시작한다.

바로, wireguard의 연결 끊김이다.

BIRD데몬은 라우팅 데몬인데, wireguard도 라우팅에 간섭을 하려고 하고, bird도 간섭을 하려고 하니 서로 라우팅이 꼬여, 엣지 라우터와의 라우팅이 자꾸 끊기는 현상이 나타나기 시작햇다.

순간적으로 핑이 나가다가, 바로 Timeout이 지속적으로 발생하며, wireguard 터널을 해제 하는 경우 잠시 핑이 나가다, 다시 Timeout으로 바뀌는 이슈가 있었다.

문제는 wireguard의 설정의 문제였다.

사이트 라우터에는 외부망으로 연결되는 ens18이 있고, 내부에서 DHCP로 IP를 뿌려주는 ens19라는 인터페이스가 각각 있다.

[Interface]
PrivateKey = Th13_13_PR1V473_K3Y_1F_Y0U_C4N_R34D_UR_4W3S0M3
Address = 172.16.0.2/24, fc00::2/64 
MTU = 1420 <- MTU값을 낮춰 연결 끊김을 해결하려고 했으나, 효과가 없음
Table = off <- 라우팅 테이블에 간섭하지 않기로 설정 하였으나, 효과가 없음
[Peer]
PublicKey = Th13_13_PU13L1C_K3Y_1F_Y0U_C4N_R34D_UR_1337
Endpoint = route.kr.seoul.myawesome.net:51820
AllowedIPs = 0.0.0.0/0,::/0
PersistentKeepalive = 25

위와 같이 설정 하였으나, 모든 부분이 실패 하였다.
Traceroute한 결과, route.kr.seoul.myawesome.net으로 연결이 끊기는 현상이 발견되었다.
(사실 172.16.0.1에 핑을 날리다가 끊기는 현상을 확인 하였다)

ens18로 나가야할 트래픽이 wireguard로 나가려고 하는 현상이 보였다.

이 현상으로 인해, 찾게 된 방법이, route.kr.seoul.myawesome.net으로 발생하는 connection은 무조건 ens18을 통해서 나가게 설정하는 방법을 생각해 냈다.

ubuntu 24.04에서는 netplan을 사용하는데, 각 인터페이스마다 이것 저것 설정을 할 수 있다.

network:
  version: 2
  ethernets:
    ens18: # WAN 인터페이스
      dhcp4: true
      dhcp6: true
      routes:
        - to: edge.router.addr.ess/32  #엣지 라우터의 "IP주소를 입력" 
          via: 10.0.0.1 #이 주소로 발생되는 트래픽은 무조건 10.0.0.1인 게이트웨이를 통해서 나가게

라는 방법을 사용하게 되면, edge.router.addr.ess로 나가는 모든 트래픽은 10.0.0.1, 즉 외부망을 타고 나가게 된다.

정리하면,
wireguard터널이 생기면서 0.0.0.0/0과 ::/0, 즉 모든 트래픽이 wireguard 터널을 이용하여 연결을 하려고 함. 이 모든 트래픽에는 엣지라우터와 연결하는 트래픽도 포함. 엣지 라우터와 연결하는 트래픽이 무한 루프에 빠지면서 wireguard의 인터페이스를 flip할때 잠깐 통신이 되는 현상이 발생.

DHCP설정은 추후에 다시 글을 쓰는걸로..

국내에서는 BGP세션을 간단하게 내려줄 수 있는곳은 v사밖에 없기에, v사에 엣지라우터를 두고 실제 집까지 가져오는 방법은 wireguard로 가져오고 내부에서 iBGP로 묶어서 라우터(bgp가 되는 os여야함. vyos, opnsense같은 os)와 연결하고 아래서 DHCP로 IP를 뿌리면 집에서도 나만의 공인 IP 를 사용할 수 있다.

물론, IPv4는 가격이 상당하니, IPv6를 고려하는것도 좋은 방법이다.

만약 이 글의 궁금한점이 있다면, [email protected]로 문의할 수 있다.

Read more

[VOIP] Korea-WAN-VoIP

일본인 친구들과 이야기 하다보니, VoIP로 WAN을 만들 수 있지 않을까 싶어서 프로젝트를 시작 해봤다. VoIP를 VPN을 묶어서 WAN으로 만들 수 있지 않을까? 생각 해보니, 이미 일본측에서는 해당 프로젝트를 진행하고 있었다. 한국쪽에서도 해당 프로젝트를 진행해보기 위해서, 디스코드 서버를 생성하였다. Korea-WAN-VoIP 먼저, 용어 정리를 해보고 시작하자. PBX : Private Branch Exchange 의 약자로,

By dobob

[Yubikey] Yubikey 5C 사용기

최근에 Steam Account가 2FA를 사용해도 해킹을 당하는 일이 있어, 보안에 관심이 생겨 Yubikey를 하나 구입했다. Amazon.com에서 구매를 하였고, 해당 Hardware 키가 도착하여 리뷰를 작성한다. Yubikey Manager 자신이 사용하고 있는 OS상에서 사용할 Yubikey Manager를 다운받고 실행한다. Yubikey 5C NFC를 구매하였으므로, 해당 제품의 정보가 나오는 것을 볼 수 있다. Application -&

By dobob