VXLAN에 방화벽 연결하여 인터넷 접속하기

앞의 포스트에서 두 대의 PC로 구성된 Proxmox 클러스터에 SDN 기능을 사용하여 VXLAN을 구성하였다.

앞의 포스트에서 L2 레이어로 구성된 VXLAN은 172.16.1.0/24 네트워크를 사용한다. 하지만 문제가 있다. 172.16.1.0/24 네트워크에 생성하는 가상 서버(VM)들은 인터넷에 접속하지 못할 뿐만 아니라 192.168.219.0/24의 Proxmox 호스트는 물론 홈 네트워크의 시놀로지 NAS 등에도 접속하지 못한다.

이유는 172.16.1.0/24 네트워크와 192.168.219.0/24의 두 네트워크 사이에서 패킷을 라우팅 해줄 게이트웨이(라디오:Router)가 없기 때문이다.

이 문제를 해결하기 위해서는 다음 그림에서 처럼 라우팅과 접근통제를 할 수 있도록 Firewall(방화벽) 가상머신을 설치하여 두 네트워크를 연결해주는 것이다.

방화벽을 통해 VXLAN을 인터넷에 연결하기

L3 라우터 역할과 접근통제를 수행할 방화벽을 생성하여 VXLAN을 홈 네트워크를 통해 인터넷에 연결하면 다음과 같은 구성이 완성된다.

현재 기존의 쿠버네티스를 테스트 하던 환경을 모두 삭제하고 VXLAN 네트워크에 다시 구성하기 위해 K8s 노드 3개를 설치할 가상머신 3대를 VXLAN 네트워크인 172.16.1.0/24 IP대역에 설치했다. 이 3개의 노드를 홈 네트워크인 192.168.219.0/24와 통신이 가능하도록 firewall을 설치했다.

firewall 은 두 개의 인터페이스를 갖는다. 하나는 홈 네트워크와 연결되는 192.168.219.254를 할당하고 하나는 SDN 네트워크(VXLAN)의 172.16.1.254를 할당하고 두 네트워크 간 패킷을 라우팅하도록 구성했다.

이렇게 하면 K8s 3개의 가상머신에서 192.168.219.0/24의 홈 네트워크에 있는 MySQL-CT와도 통신이 가능하고 apt update 명령을 통해 업데이트도 잘 된다. 당연히 홈 네트워크에 있는 PC에서 172.16.2.0/24에 있는 가상머신으로 SSH 접속도 가능하다. (단, PC의 라우팅 테이블에 라우팅 정보를 추가해줘야 하는 불편함은 있다. (홈 네트워크의 공유기(HGWD-1G)에 라우팅 테이블을 수정할 수 있는 기능이 있다면 좋았을텐데~)

방화벽 구성을 위한 인터페이스 추가

방화벽(firewall)은 리눅스 컨테이너(LXC)로 생성했다. 그리고 다음과 같이 두 인터페이스를 추가해주었다.

172.16.1.254/24 인터페이스는 172.16.1.254.0/24 대역의 IP를 갖도록 생성된 가상머신이 상위 네트워크인 192.168.219.0/24와 인터넷으로 나갈 때 통과하는 게이트웨이 역할을 한다.

그리고 반대로 192.168.219.254/24 인터페이스는 홈 네트워 IP 대역의 가상머신이나 장비가 SDN 네트워크인 172.16.1.0/24로 가고자할 때 게이트웨이 역할을 수행하게 된다.

firewall 리눅스 컨테이너에 접속해서 IP 정보를 확인하면 다음과 같이 보인다.

방화벽 정책 및 라우팅 정책

firewall은 Ubuntu 24.04 LTS 버전으로 구성했다. 라우팅과 접근통제를 위해 iptable이 아닌 nftable을 사용해 구성했다. iptable 보다 nftable이 정책 적용이 쉽다고 해서 선택했다.

그리고 /etc/nftables.conf 파일에 다음과 같이 정책을 추가했다.

root@firewall:/etc# cat nftables.conf
#!/usr/sbin/nft  -f 

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        ct state established,related accept

        iif "lo" accept

        iifname "eth0" tcp dport 22 ct state new accept
        icmp type echo-request accept
        icmp type echo-reply accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;

        ct state established,related accept
        iifname "eth1" oifname "eth0" accept
        iifname "eth0" oifname "eth1" tcp dport 22 ct state new accept

        ip protocol icmp accept
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100; policy accept;
    }

    chain postrouting {
        type nat hook postrouting priority 100; policy accept;

        oifname "eth0" ip saddr 172.16.1.0/24 masquerade
    }
}

#proxmox #vxlan

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다