공용 IPv6를 더 안전하게 사용하는 몇 가지 방법

일부 사용자는 공용 IPv6를 이용해 외부에서 가정 네트워크에 직접 연결하는 수요가 있다. Tailscale/ZeroTier 등 VPN이 내부 네트워크 터널링을 통해 직접 연결을 구축하는 것과 달리, IPv6는 직접 연결을 제공한다. 스마트폰 셀룰러 네트워크는 대개 IPv6를 지원하므로, 가정 네트워크에 직접 연결하는 것이 매우 편리하다.

이전에 나는 가정용 광대역에서 일반적인 DDNS 서브도메인을 사용하면 China Telecom 광대역 서비스가 저하될 수 있다는 글을 공유했는데, 여기서는 IPv6 사용 시 통신사업자가 만든 함정에 대해 설명했다. 간단히 말하면 도메인이 스캔될 수 있다는 점이다. 자신의 도메인을 노출하는 것은 곧 IPv6를 노출하는 것과 같으며, 이로 인해 스캔을 받고 서비스가 탐지되면 많은 인바운드 연결이 발생해 광대역 서비스가 저하될 수 있다.

그 글에서는 도메인 스캔만 언급했고, ‘네트워크 공간 스캔’은 언급하지 않았다. 네트워크 공간 스캔은 어떤 정보를 노출하는지와 관계없이 직접 IP 풀을 순회하며 스캔하는 방식으로, 이런 경우는 방어하기가 비교적 어렵다.

‘네트워크 공간 스캔’은 일반적으로 다음 몇 가지 측면을 포함한다:

  • IP 활성 탐지: ARP, ICMP, TCP 등 프로토콜을 이용해 온라인 호스트를 식별한다.
  • 포트/서비스 탐지: 포트 스캔을 통해 온라인 호스트의 개방 포트를 선별하고, 목표 호스트의 서비스 정보, 버전 정보, 운영체제 정보를 획득한다.
  • 운영체제 탐지: 응답 데이터 패킷을 분석해 목표 호스트의 운영체제 유형과 버전을 추론한다.
  • 트래픽 수집: 네트워크 트래픽을 모니터링해 비정상적인 행동이나 공격 패턴을 발견한다.
  • 별명 해석: 여러 IP 주소를 가진 라우터에 대해 IP 주소와 라우터 사이의 매핑 관계를 구축한다.
  • DNS 탐지: IP 주소 역방향 해석을 통해 IP 주소와 도메인 사이의 대응 관계를 구축한다.

여기서는 네트워크 공간 스캔에 걸리지 않기 위한 몇 가지 방법을 공유한다:

  1. 내부 네트워크 DNS 서버가 AAAA 레코드를 반환하지 않도록 한다.
  2. 내부 네트워크 서비스를 도메인을 통해서만 접근 가능하게 하고, IP 직접 접근은 금지한다.
  3. 사설 DNS 서비스 AdGuardPrivate를 사용한다.

내부 네트워크 DNS 서버가 AAAA 레코드를 반환하지 않기

인터넷에 접속해 다양한 웹사이트를 방문할 때, 이런 자연스러운 방문은 소스 IPv6를 노출시킬 수 있다. 상대방 서버는 소스 IPv6를 획득할 수 있고, 사용자 측에서 방화벽을 켜지 않았다면 이 IPv6는 네트워크 공간 스캔의 우선 순회 풀에 넣을 수 있다.

또한 /56 접두사의 IPv6 주소를 스캔 풀에 넣고 낮은 16비트만 순회해 스캔 범위를 크게 축소할 수 있다.

나는 오랫동안 IPv6를 사용해온 경험상, 일상적인 인터넷 사용에서 IPv6는 IPv4와 명확한 차이가 없다고 느꼈다. 따라서 우리는 외부 방문에서 IPv6를 희생하고, 직접 가정에 돌아가는 용도로만 사용할 수 있다.

IPv6 해석을 반환하지 않도록 설정하는 방법

내부 네트워크 DNS 서버에서 AAAA 레코드 반환을 금지하도록 설정한다.

내부 네트워크 DNS 서비스는 일반적으로 AdGuardHome을 사용하는데, 설정 예시는 다음과 같다:

IPv6 비활성화 설정

설정 후 내부 네트워크 장치가 외부 네트워크에 접속할 때 IPv4만 사용하고 IPv6는 더 이상 사용하지 않는다.

내부 네트워크 서비스를 도메인을 통해서만 접근 가능하게 하기

가정에서 노출된 서비스가 포트 기반으로 접근 가능할 수 있는데, 이렇게 되면 스캔에 매우 쉽게 걸릴 수 있다.

서비스를 생성할 때 0.0.0.0::와 같은 공용 IP를 리스닝하는 설정은 하지 않는 것이 좋다. 경험 많은 사람들은 거의 모든 서비스 시작 가이드가 기본적으로 127.0.0.1::1만 리스닝하도록 설정하는 이유를 알고 있다. 바로 공용 IP를 리스닝하는 것이 위험하기 때문이다.

리버스 프록시에서 도메인만 허용하도록 설정하는 방법

nginx 예시

핵심은 server_name을 도메인으로 설정하고, _IP로 설정하지 않는 것이다.

server {
    listen 80;
    server_name yourdomain.com; # yourdomain.com을 실제 도메인으로 교체

    # IP 주소로 접근하려는 사용자에게 403 Forbidden을 반환
    if ($host != 'yourdomain.com') {
        return 403;
    }

    location / {
        # 여기에 웹사이트 루트 디렉토리와 기타 설정이 들어갑니다
        root /path/to/your/web/root;
        index index.html index.htm;
    }

    # 기타 설정...
}

IIS 예시

핵심은 host name을 도메인으로 설정하고, 공백으로 두지 않는 것이다.

IIS 예시

사설 DNS 서비스 사용하기

자신만 사용하는 DNS 서비스에서 커스텀 해석을 추가해 가상 도메인을 내부 네트워크 서비스로 해석하도록 한다.

DNS 재작성 기능

이 방법을 사용하면 몇 가지 명백한 장점이 있다.

  1. 먼저 도메인은 임의로 구성할 수 있으므로 도메인을 구매할 필요가 없고, 도메인 비용을 절감할 수 있다. 이런 가상 도메인이 스캔에 걸리더라도 공격자는 DNS 서비스에 요청해야만 정확한 해석 결과를 얻을 수 있다.
  2. 자신의 사설 DNS 서비스 주소와 가상 도메인을 동시에 노출해야 하며, 스캔자는 도메인 해석 로직을 수정해 노출된 사설 DNS 서버에 도메인 해석을 요청하고, 가상 도메인을 요청 Headers에 삽입해야 스캔을 시작할 수 있다.
sequenceDiagram
  participant Scanner as 네트워크 스캔자
  participant DNS as 사설 DNS 서버
  participant Service as 내부 네트워크 서비스

  Scanner->>DNS: 1. 사설 DNS 서버 주소를 발견
  Scanner->>DNS: 2. 가상 도메인 해석 요청
  DNS-->>Scanner: 3. 내부 네트워크 서비스 IP 반환
  Scanner->>Service: 4. 가상 도메인으로 Headers 구성
  Note right of Service: Headers에 올바른 가상 도메인이 없으면<br/>접근을 거부
  alt Headers가 올바름
    Service-->>Scanner: 5a. 서비스 응답 반환
  else Headers가 잘못됨
    Service-->>Scanner: 5b. 403 에러 반환
  end

위 모든 단계를 스캔자가 완료해야 내부 네트워크 서비스를 스캔할 수 있으므로, 이는 스캔 난이도를 크게 증가시킨다.

AdGuardPrivate에서는 사설 DNS 서비스를 생성할 수 있고, 커스텀 해석 기능을 사용해 가상 도메인을 추가할 수 있다. 물론 dnspod.cn도 사용할 수 있다.

이两家 서비스는 차이가 크다. AdGuardPrivate는 기본 AdGuardHome에서 개조한 것으로, 기능 면에서 dnspod보다 훨씬 많다. 각자 평가해보기 바란다.

요약

  1. 내부 네트워크 DNS 서버가 AAAA 레코드를 반환하지 않도록 한다.
    • 전제 조건
      • 공용 IPv6가 있어야 한다.
      • 내부 네트워크 DNS 서버가 있어야 한다.
    • 설정
      • AAAA 레코드 반환을 금지한다.
  2. 내부 네트워크 서비스를 도메인을 통해서만 접근 가능하게 하고, IP 직접 접근은 금지한다.
    • 전제 조건
      • 자신의 도메인이 있어야 한다.
      • 도메인 제공업체가 DDNS를 제공해야 한다.
      • 내부 네트워크에 리버스 프록시 서비스가 있어야 한다.
    • 설정
      • DDNS 작업을 설정한다.
      • 도메인을 통한 접근만 허용한다.
  3. 사설 DNS 서비스를 사용한다.
    • 전제 조건
      • 사설 DNS 서비스가 있어야 한다.
      • 사설 DNS 서비스가 커스텀 해석을 제공해야 한다.
      • 사설 DNS 서비스가 DDNS를 제공해야 한다.
    • 설정
      • DDNS 작업을 설정한다.
      • 커스텀 해석을 추가해 가상 도메인을 내부 네트워크 서비스로 해석한다.

마지막으로,

  • 직접 가정에 돌아가는 가장 간단하고 안전한 방법은 내부 네트워크 터널링이 성공한 tailscale/zerotier이지만, 때때로 다양한 네트워크 이유로 인해 터널링이 성공하지 못할 수 있다.
  • 낯선 WiFi에 함부로 연결하지 마라. 한 번에 모든 정보가 유출될 수 있다. 대용량 데이터 SIM 카드를 구해보는 것이 좋다. 신뢰를 일단 통신사업자에게 맡긴다. 저렴하고 대용량 데이터 SIM 카드가 필요하면 연락해라(아님). 나도 필요하니까.