이수의 삽질 기록
article thumbnail

배경

Y 교수님의 연구실에서 최근 내가 이런 저런 목적으로 VM을 너무 많이 만들었다. (전체 건물이 /24 서브넷인데, 그 중 28개 정도를 내가 먹었으니...) 또, 지난주에 OVS를 가지고 테스트 하다가, 스위치에서 루프가 돌아서 정보 인프라팀에서 왔다. 정확히 누가 잘못인지는 모르겠지만, 조금 찔린다. 아무튼 그래서 연구실 내부의 서브넷을 만들었다.

근데 또 여기서 문제가 생긴다. 내가 조금 서버를 많이 사용하는게 아니다. 각 VM마다 IP 하나씩 DHCP 할당이니까, Kubernetes 만 돌린다고 쳐도 최소 3개, 즉 IP 3개를 외워야 하는데, 최근 멍청해지고 있어서 그정도 외우기도 힘들다. 그래서 생각한게 자체 DNS 서버를 만들자는것이다.

DNS는 뭐 다들 너무 잘 알테니까, 굳이 설명하려고 하지는 않겠다. 찾아보면 금방 나오니까. 그래서 Bind9를 사용해서 Private DNS 서버를 구축했다. 구축은 어렵지 않으나, 이게 OpenVPN과 물리기 시작하니까 조금 귀찮은 일들이 생긴다. DNS 설정을 수동으로 해줘야 하니까. 따라서 이 글은 "Bind9를 통해 DNS 서버를 구축하고, 해당 DNS 서버 IP를 OpenVPN의 DNS로 등록하는" 과정을 담아본다.

Bind9 설치 및 설정

설치 과정은 매우 쉽고, 심지어 나는 귀찮기에 Docker를 사용할것이다. 도커 설치 과정은 귀찮으니 생략하고, 그냥 Docker compose만 작성하겠다. (그렇다, 나는 설명하는데 재주가 없다. 그냥 내가 기억하기 위해서 쓰려고 한다...)

version: '3'

services:
  bind9:
    container_name: dns-demo
    image: ubuntu/bind9:latest
    environment:
      - BIND9_USER=root
      - TZ=ASIA/Seoul
    ports:
      - "53:53/tcp"
      - "53:53/udp"
    volumes:
      - ./config:/etc/bind
      - ./cache:/var/cache/bind
      - ./records:/var/lib/bind
    restart: unless-stopped

이걸 docker-compose.yml로 저장한다. 그리고 나서는 ./config./cache 그리고 ./records 디렉토리를 만들어줘야한다. 왜냐하면 그렇게 쓰기로 우리가 volume을 설정했으니까.

mkdir cache
mkdir config
mkdir records

이렇게 생성하고 나서, 이제 named.conf를 만들어주자.

acl internal {
        192.168.0.0/16;
        10.8.0.0/24;
        172.20.0.0/24;
        172.25.244.0/24;
};

options {
        recursion yes;
        allow-query { internal; };
        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
};

zone "isu.mosl" IN {
        type master;
        file "/etc/bind/isu-mosl.zone";
};

고려 사항은 다음과 같다:

  • 외부에서 IP 접근은 막을 것: Public DNS를 돌리려는 것도 아니고, 심지어 .mosl이라는 TLD는 존재하지 않기에 쓸모가 없다. 맨 위 acl internal 로 설정해준다.
  • forwarder는 Google Public DNS로 설정할 것: 우리 DNS 서버는 .mosl 이라는 TLD만 만들어서 쓸거기에, 이를 제외한 다른 DNS쿼리는 8.8.8.8 그리고 8.8.4.4 로 포워딩 해주자. 뭐 Cloudflare를 좋아하면 그쪽으로 설정해도 무방하시다.
  • Zone은 isu.mosl: 그냥 내가 쓰는 도메인이라고 알리기 위해서 isu.mosl을 사용할 것이다. (우리 연구실 이름이 MOSL이니까 TLD는 이렇게 할것이다!) 예를 들어, ProxMox의 경우 px1.isu.mosl을 사용할 수 있게 말이다. 아무튼 그렇게 설정을 하고, Zone 파일을 설정해준다. 그리고 지금 이 Zone은 다른 포워딩을 하지 말고, 우리 DNS 서버가 master임을 명시해주자.

이후 Zone 파일을 만들어준다. 앞서 언급한 isu.mosl Zone의 Zone파일은 isu-mosl.zone 이므로 이를 생성하자.

$TTL 2d
$ORIGIN isu.mosl.

@                               IN      SOA     isu.mosl. isu.mosl. (
                                                2023060200 ; serial
                                                12h        ; refresh
                                                15m        ; retry
                                                3w         ; expire
                                                2h         ;min ttl
                                                )
                                IN      NS      ns.isu.mosl.

ns                              IN      A       192.168.100.128


; -- add dns records

px1.isu.mosl.              IN      A       192.168.100.112
ex1.isu.mosl.              IN      A       192.168.100.107

고려 사항은 다음과 같다:

  • Origin은 isu.mosl.: 여기서부터 recursive 하게 갈것이다.
  • SOA는 그냥 설정하자: 난 잘 모른다. 그냥 serial 은 오늘 날짜를 적었다. 보통 컨벤션으로 그렇게 한다고 한다.
  • NS는 사실 그닥 필요 없다: 그냥 우리 DNS 서버로 저장하자.
  • A 레코드로 다음을 추가하자:
    • px1.isu.mosl: 이건 내 ProxMox 1번 IP를 보낼거다.
    • ex1.isu.mosl: 이건 내 ESXi 1번의 IP를 보낼거다.

이렇게 설정하면 Bind9 설정은 끝났다. 그냥 이제 docker compose up을 해주면 실행될 것이다. 사실 실행이 안될것이다. 왜냐면 DNS 서버가 53번 포트에서 자체적으로 하나 돌고 있을텐데, 이걸 동작을 멈춰줘야 한다.

echo "DNSStubListener=no" >> /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved.service

OpenVPN 설정

연구실에서 트래픽을 주고 받기 위해 OpenVPN을 사용한다. 윈도우 PC의 경우, tunnel 네트워크로 10.8.0.0/24 (CIDR은 다를 수 있다) tap 디바이스가 생긴다. 그리고 여기 tap 디바이스는 초기 OpenVPN 설정시 설정해둔 DNS를 받게 설정된다. 초기 OpenVPN 설정시 DNS 설정을 할 때 우리 연구실은 8.8.8.8, 8.8.4.4만 넣어줘서 지금 새로운 DNS 서버를 잡지 못한다. 

 

이렇게 말이다. 이거 수동으로 DNS 서버 설정해줘도, 리부팅 하고 나면 OpenVPN 서버에서 설정된 DNS로 덮어진다. 그니까 이걸로 30분 이상 삽질하지 마시고 그냥 다른 방법을 쓰는게 낫다. OpenVPN 서버에서 생성한 ovpn 파일에다가 다음의 내용을 추가해준다.

dhcp-option DNS 192.168.100.128

저기다가 DNS 서버를 추가한 후 리부팅 하면 알아서 DNS1로 올라간다. 그러면 이제 모든게 끝났다.

테스트

좋다, 잘 된다. 이제 브라우저 테스트 하면 다음과 같다.

Chrome 에서도 알아서 DNS 잘 받아온다. 이제 귀찮은 IP들을 외우지 않아도 된다.

물론 이래놓고 원래 IP 치는게 빨라서 그거 치고 들어간다 ㅎ... 

profile

이수의 삽질 기록

@IsuKim

두분의 주인님 밑에서 네트워크, 클라우드, 서버 삽질을 하는 학부생입니다