3P by GN⁺ | ★ favorite | 댓글 1개
  • 정전 뒤 ISP 쪽 IPv4 연결만 끊기고 IPv6는 살아 있는 상황에서, IPv4-only 사이트 접근을 되살리기 위해 IPv4/IPv6를 모두 가진 Hetzner VPS와 WireGuard 터널을 사용함
  • 장애는 CG-NAT 계층에서 IPv4 패킷이 제대로 변환되지 않아 드롭된 것으로 보였고, IPv6를 지원하는 Google·Meta 같은 서비스는 계속 접속 가능했음
  • VPS에 WireGuard 서버를 두고 클라이언트가 VPS의 IPv6 주소를 엔드포인트로 쓰면, IPv4 트래픽을 VPS 경유로 보내 일반 웹 브라우징을 복구할 수 있음
  • 업무용 VPN과 Docker는 별도 처리가 필요해, vopono 기반 네트워크 네임스페이스unshare·/sys bind mount 우회로 같은 네임스페이스 안에서 실행함
  • 일부 사이트만 로드되지 않는 증상은 WireGuard MTU가 너무 큰 탓이었고, IPv6 최소 MTU인 1280으로 낮추자 즉시 해결됨

정전 뒤 IPv4만 끊긴 장애

  • 정전 뒤 차단기를 복구했지만 GitHub와 여러 웹사이트에 접속할 수 없었고, Google과 Meta는 정상 동작했음
  • 로컬 머신과 라우터 진단 페이지에서 ping -6, traceroute를 확인한 결과 문제는 IPv4 서버 접속에만 있었음
  • ISP는 기사 방문이 필요할 수 있고 주말 이후 며칠이 걸릴 수 있다고 했으며, 업무 접근과 논문 작업 때문에 장애를 기다리기 어려웠음
  • 기존 Hetzner VPS에는 정적 IPv4와 IPv6 주소가 있었고, Hetzner 웹사이트가 IPv6를 지원해 콘솔에 접근해 설정을 진행할 수 있었음

NAT와 CG-NAT가 만든 IPv4 의존성

  • IPv4 주소는 32비트이며 예약 블록을 제외하면 공개 IPv4 주소가 약 37억 개뿐이라 모든 인터넷 연결 기기에 직접 주소를 줄 수 없음
  • NAT는 여러 기기가 하나의 공개 IP를 공유하도록 만듦
    • 홈 라우터는 내부 기기의 192.168.1.xxx 같은 로컬 IP를 자신의 공개 IPv4로 바꿈
    • Linux의 conntrack은 원래 출발지 IP와 포트, 변환된 포트를 매핑으로 저장함
    • 응답 패킷이 해당 포트로 오면 conntrack이 목적지를 원래 내부 IP와 포트로 되돌림
    • Linux에서는 conntrack-toolsconntrack -L로 저장된 매핑을 볼 수 있음
  • NAT는 암묵적 방화벽처럼 동작해, 라우터 뒤 로컬 기기의 서비스는 명시적 포트 포워딩 없이는 외부에서 접근하기 어려움
  • ISP는 IPv4 부족 때문에 내부에서도 NAT를 한 번 더 적용할 수 있고, 이를 Carrier Grade NAT(CG-NAT) 라고 부름
    • 홈 라우터가 여러 로컬 기기를 NAT하듯, ISP 라우터는 여러 홈 라우터를 NAT함
    • ISP가 가진 IPv4 주소 수와 할당 정책에 따라 지역 단위 등 여러 계층으로 반복될 수 있음
  • 이번 장애는 CG-NAT 계층 어딘가에서 IPv4 패킷이 올바르게 NAT되지 않아 드롭되면서 IPv4 트래픽이 완전히 끊긴 상황으로 보였음
  • NAT traversal 우회 방법은 Tailscale의 How NAT Traversal Works를 참고할 만함

IPv6가 계속 동작한 이유

  • IPv6 주소는 128비트이며 예약 블록을 감안해도 약 3.4E38개 주소를 제공함
  • 가정용 라우터가 /64 서브넷을 받는 경우가 흔하고, 이는 1.84E19개 주소를 의미함
  • IPv6에서는 홈 라우터에서 NAT를 쓰지 않아도 각 기기가 인터넷에서 직접 주소를 가질 수 있음
    • 포트 포워딩 문제는 줄어듦
    • 대신 라우터나 각 기기는 임의의 외부 신규 연결을 막는 적절한 방화벽 규칙이 필요함
  • IPv6에는 CG-NAT가 적용되지 않았기 때문에 이번 장애의 영향을 받지 않았음
  • GitHub처럼 여전히 IPv6로 접근할 수 없는 웹서버가 있어, IPv6 연결만으로는 전체 인터넷을 직접 사용할 수 없었음

WireGuard로 IPv6 위에 IPv4 터널 만들기

  • 해결책은 VPS에 WireGuard를 설치하고, 클라이언트가 VPS의 IPv6 주소를 엔드포인트로 사용해 터널을 구성하는 방식이었음
  • 터널이 성립되면 IPv4 트래픽은 VPS를 경유해 정상 동작함
    • VPS 경유로 지연은 늘어남
    • 동작 방식은 직접 구성한 Dual-Stack Lite에 가까움
  • 서버는 기존에 vps2arch로 Arch Linux를 설치해 둔 Hetzner VPS였고, Hetzner의 최신 Debian 이미지를 기반으로 사용했음
  • WireGuard 설정은 ArchWiki의 WireGuard 특정 VPN 서버 예시를 바탕으로 IPv6 트래픽을 추가한 형태였음
  • 서버 설정은 다음을 포함함
    • Address = 10.200.200.1/24, fd42:42:42::1/64, 2001:db8:abcd:1234::1/128
    • IPv4는 iptablesMASQUERADE로 포워딩
    • IPv6 ULA는 ip6tablesSNAT --to-source로 NAT
    • IPv4/IPv6 forwarding 활성화
    • peer는 직접 IPv6 Global Unicast Address를 쓰는 foo와 NAT된 IPv6 ULA를 쓰는 bar 예시로 나뉨
  • wg-quick.ini 스타일 설정과 달리 PostUpPostDown을 여러 번 지정할 수 있고, 각 명령을 순서대로 실행함

IPv6 NAT, SNAT, 클라이언트 설정

  • IPv6는 꼭 NAT할 필요가 없으며, Hetzner처럼 VPS에 /64 IPv6 블록이 있으면 peer에 직접 Global Unicast Address(GUA) 를 줄 수 있음
  • 직접 주소 방식을 쓰려면 peer와 인터페이스의 Unique Local Address(ULA)를 공개 IPv6 주소로 바꾸고 ip6tables MASQUERADE 규칙을 제거함
    • 각 peer는 할당된 IPv6 주소로 인터넷에서 직접 주소 지정 가능해짐
    • 여러 기기에서 자체 서비스를 포워딩하려면 이 방식이 적합함
    • VPS 방화벽이 들어오는 트래픽을 올바르게 처리해야 함
  • VPS의 IP 주소가 정적이고 바뀌지 않는다고 확신하면 MASQUERADE 대신 SNAT을 사용할 수 있음
    • MASQUERADE는 런타임에 인터페이스 IP를 조회함
    • SNAT은 주소를 직접 지정하므로 약간 더 효율적임
  • 클라이언트 설정에서는 서버의 IPv6 주소를 Endpoint = [2001:db8:abcd:1234::1]:51820처럼 대괄호로 감싸야 함
  • AllowedIPs = 0.0.0.0/0, ::/0로 전체 IPv4/IPv6 트래픽을 터널로 보냄
  • 양쪽에서 실행한 뒤 일반 브라우징은 정상화됐고, 터널 로컬 IPv4와 IPv6 주소로 서버에 직접 SSH 접속도 가능했음
  • Linux에서 아내의 머신에도 WireGuard 클라이언트를 간단히 설치할 수 있었음

업무 VPN은 네트워크 네임스페이스로 분리

  • WireGuard 연결 위에서 업무용 VPN을 바로 연결하면 충돌이 발생해 사용할 수 없었음
  • vopono를 사용해 업무 VPN과 필요한 애플리케이션을 네트워크 네임스페이스 안에서 실행함
  • 핵심은 MASQUERADE 규칙이 실제 네트워크 인터페이스가 아니라 실행 중인 WireGuard 인터페이스(foo 또는 bar)로 트래픽을 전달하도록 만드는 것임
  • 네임스페이스 내부 트래픽은 호스트의 WireGuard nftables 규칙을 직접 의식하지 않지만, 실제로는 WireGuard 터널을 통해 라우팅됨
  • wg-quick은 사용 가능할 때 iptables보다 nftables를 선호하지만, Docker의 표준 iptables 규칙과 충돌을 피함
  • vopono 실행 예시는 다음과 같음
$ vopono -v exec --create-netns-only --provider None --protocol None -i bar bash
$ sudo ip netns exec vo_none_none bash
$ (inside netns) ./vpn.sh
  • /etc/netns/vo_none_none/ip netns exec에 의해 /etc로 마운트되므로, 해당 네임스페이스 전용 resolv.conf를 둘 수 있음
  • IPv4 DNS 해석을 우선하고 싶다면 같은 방식으로 gai.conf도 조정 가능함
    • 이 설정은 IPv6 터널 트래픽 문제를 디버깅하던 동안 사용됨
    • 예시는 AskUbuntu 답변을 바탕으로 함
  • 업무 VPN 연결 후 내부 DNS 서버를 /etc/netns/vo_none_none/resolv.conf에 넣으면 이후 해당 네임스페이스에서 실행한 애플리케이션이 정상 동작함
  • 일반 사용자 권한으로 Chrome 같은 애플리케이션을 네임스페이스 안에서 실행할 수 있음
$ vopono -v exec -i bar --provider None --protocol None google-chrome-stable

Docker를 같은 네임스페이스에서 실행하기

  • Docker는 단순히 다른 애플리케이션처럼 네트워크 네임스페이스에서 실행해도 동작하지 않음
    • systemd로 활성화된 Docker socket이 네임스페이스 밖에서 생성됐기 때문임
    • 내부 연결성이 확보되지 않음
  • 외부 Docker를 멈추고 네임스페이스 안에서 dockerd와 socket을 새로 만들려고 해도 바로 해결되지 않음
    • ip netns exec가 mount namespace를 만들고 /sys를 다시 마운트함
    • 이 때문에 호스트의 /sys/fs/cgroup이 보이지 않음
  • 이 경우 다음 오류가 발생할 수 있음
Error: OCI runtime error: runc: runc create failed: no cgroup mount found in mountinfo
  • 우회는 unshare/sys를 bind mount로 만들고, ip netns exec가 만든 내부 /sys 마운트를 해제하는 방식임
    • 이 방법은 Unix StackExchange 글을 바탕으로 함
    • 이후 mount namespace 안의 /sys는 호스트 /sys의 bind mount가 됨
  • 예시 명령은 다음과 같음
$ sudo systemctl stop docker && sudo systemctl stop docker.socket
$ sudo -E unshare -m sh -c 'mount --bind /sys /sys; exec ip netns exec vo_none_none sudo --user youruser --preserve-env bash'
$ sudo umount /sys
$ sudo dockerd --host=unix:///var/run/docker-netns.sock --data-root=/var/lib/docker-netns
$ DOCKER_OPTS="--dns=YOURDNSHERE" DOCKER_HOST=unix:///var/run/docker-netns.sock sudo --user youruser --preserve-env docker ...
  • dockerd와 Docker 명령을 같은 세션 안에서 실행하면 동일한 네트워크 네임스페이스와 mount namespace를 공유함
  • Docker DNS 설정은 /etc/netns/vo_none_none/docker/daemon.json에도 둘 수 있음
  • 이 방식은 보조 컨테이너와 Docker 네트워크로 연결하는 컨테이너까지 필요한 작업에는 충분했지만, 브리지 등이 필요한 더 복잡한 Docker 구성에서는 그대로 동작하지 않을 수 있음

WireGuard MTU 문제 디버깅

  • 재부팅 뒤 WireGuard 연결은 살아 있는 것처럼 보였지만 일부 페이지만 로드되고 GitHub 같은 사이트는 열리지 않았음
  • ping, ping -6, wg show는 정상이라 원인을 찾기 어려웠음
  • 서로 다른 크기의 ping으로 확인한 결과 큰 패킷이 실패했음
$ ping6 -s 1400 fd42:42:42::1
$ ping6 -s 1200 fd42:42:42::1
$ ping6 -s 800 fd42:42:42::1
  • 1400 크기는 실패하고 1200, 800은 성공해 MTU 설정이 원인임을 확인함
  • 로컬 WireGuard 인터페이스의 MTU를 낮추면 커널 IP 스택이 이보다 큰 패킷을 만들지 않음
    • WireGuard의 캡슐화 오버헤드가 추가된 최종 UDP 패킷도 경로상의 작은 MTU 링크에서 드롭되지 않게 됨
  • 경로상의 각 라우터는 자체 MTU를 가지며, 가장 작은 MTU보다 큰 패킷은 드롭될 수 있음
  • 터널 트래픽은 WireGuard 캡슐화로 약 32바이트 오버헤드가 추가되어 MTU 문제가 더 커질 수 있음
  • Path MTU Discovery 메시지는 중간 라우터에서 ICMP로 전달될 수 있지만, 방화벽이 ICMP를 드롭하는 경우가 많아 자동 조정이 되지 않을 수 있음
  • IPv6 명세의 최소 MTU는 1280이므로, IPv6 위 WireGuard 터널에서는 이 값이 항상 동작해야 함

복구 뒤 남은 운영 선택지

  • 구성 결과는 다음을 포함함
    • IPv4와 IPv6를 모두 가진 VPS에 WireGuard VPN 서버 구성
    • 직접 IPv6와 NAT된 IPv6 트래픽 모두 지원
    • 네트워크 네임스페이스에서 업무 VPN 실행
    • unshare 우회로 Docker를 같은 네트워크 네임스페이스 안에서 실행
    • WireGuard MTU 문제 디버깅
  • 원격 근무에서는 인터넷 연결 문제가 항상 위험 요소이며, 이번 경우 Linux 도구들로 ISP 설정 복구를 기다리지 않고 우회할 수 있었음
  • Hetzner VPS는 WireGuard 터널과 합법적인 일반 사용을 지원하며, 포트 스캐닝·트래픽 스푸핑·암호화폐 채굴은 허용되지 않음
  • AirVPN, ProtonVPN, AzireVPN처럼 포트 포워딩을 지원하는 VPN도 홈서버 포트를 ISP에 의존하지 않고 포워딩하는 대안이 될 수 있음
  • OpenWRT 라우터를 쓰면 라우터 쪽 디버깅을 더 많이 할 수 있고, 이런 우회 구성을 각 기기에 따로 설정하지 않고 라우터에서 직접 WireGuard로 처리할 수 있음

댓글과 토론

Hacker News 의견들
  • 제목이 약간 오해를 부름. 정확히는 VPS를 통한 IPv6 터널로 IPv4 인터넷에 접속하는 것이고, 보통 4in6이라고도 부름
    그래도 흥미롭긴 함. ISP에서 보면 IPv4를 망가뜨렸을 때와 IPv6를 망가뜨렸을 때 지원 이슈의 성격이 꽤 다름. IPv4 장애는 대체로 명확한 “다운” 상태라 사용자들은 불만이 크지만 단순함. 반면 IPv6 장애는 부분 장애, 폴백 때문에 느린 시작, 게이트웨이가 IPv6가 있다고 믿는 상황 같은 이상한 형태로 드러남

    • 지난번 IPv4가 죽었을 때는 Github가 안 돼서 주로 알아챘음. 요즘은 대부분의 소비자용 웹사이트가 IPv6만으로도 동작
      다만 라우터에 IPv4 DNS 서버만 설정된 사람들은 완전 장애를 겪었음. Microsoft가 무능한 자산을 좀 치웠다면, 가장 큰 걱정은 라우터에 붙인 mDNS 호스트명을 기억해서 로그인하고 IPv4가 돌아왔는지 확인하는 정도였을 것 같음
    • IPv4의 긴 꼬리는 분명 있지만, 집에서 마지막으로 IPv4가 끊겼을 때 아내는 전혀 눈치채지 못했음. Google, Facebook, Apple/iCloud, 그리고 CloudFlare 호스팅 대부분이 IPv6로 계속 동작했기 때문임
    • 내 경험과도 같음. IPv6 문제는 분류하고 재현하기가 답답할 정도로 어렵고, “내 컴퓨터에서는 되는데” 같은 상황이 많음
    • 대부분의 ISP는 아직도 IPv6를 아예 막아버림. 소규모 사업자들이 IPv6를 한 번 시도한 뒤 AAAA 레코드 갱신 같은 걸 잊는 일이 많아서, 사용자는 좋아하는 틈새 서비스가 다른 네트워크에서는 되는데 돈 내는 ISP에서는 안 되는 것처럼 보이게 됨
      이상한 문제이고, IPv4가 언젠가 사라지길 바라는 것 말고 괜찮은 해법이 있는지 모르겠음. Happy Eyeballs가 이 문제를 해결할 예정이었지만, 문제는 종종 애플리케이션 계층 훨씬 위에서 나타나고, 애플리케이션은 무엇이든 할 수 있어서 새는 추상화 없이 일반 프로토콜로 해결하기 어렵다. 개인적으로는 네트워크에는 IPv6를 켜고 모든 브라우저에서는 IPv6 DNS를 끄는 식으로 타협 중인데 꽤 불만족스러움
  • IPv6를 써보고 싶은데 ISP가 제공하지 않는다면, Hurricane Electric이 수년째 터널 서비스를 제공하고 있음
    https://tunnelbroker.net
    https://ipv6.he.net
    시스템이나 라우터에 tun 장치를 올리고 트래픽을 라우팅하는 스크립트들도 있음: https://fedoraproject.org/wiki/IPv6_tunnel_via_Hurricane_Ele..., https://brandonrozek.com/blog/obtaining-ipv6-address-hurrica..., https://wiki.dd-wrt.com/wiki/index.php/IPv6_setup_Hurricane_..., https://forum.mikrotik.com/t/auto-update-script-for-hurrican..., https://docs.rockylinux.org/guides/network/hurricane_electri...

    • 이런 터널의 짜증 나는 주의점은 스트리밍 서비스에서 지역 제한 우회용 VPN처럼 차단하기 때문에, 필요하면 터널을 끄는 방법을 알아내야 한다는 것임
      그래도 잘 동작함. 라우터가 HE 터널을 지원하지 않아도 RA의 힘으로 네트워크 안의 모든 장치에 IPv6 주소를 붙일 수 있음. 아무 장치나 /64를 광고하면 IPv6 라우터가 됨. 물론 라우터가 보안상 RA를 필터링하지 않는다는 전제가 필요함. 포트 포워딩 규칙을 건드리지 않고도 홈 네트워크 안에서 서비스를 호스팅할 때 매우 유용함
    • Hurricane Electric은 훌륭하지만, ISP가 제공하는 IPv6를 쓰는 사람이 늘면서 “일반” 사용자는 터널을 떠나고, 네트워크 서비스들은 he.net 터널을 남용으로 표시하기 시작했음
      너무 많은 사이트가 장벽을 세우거나 아예 동작을 거부해서, 내 네트워크 대부분에서 IPv6 사용을 중단해야 했음
    • 알아둘 점은 HE 터널이 내가 알기로는 ISP가 공인 IPv4를 할당해줄 때만 동작한다는 것임. 통신사급 NAT 뒤에 있다면 안타깝지만 집에 IPv6를 들여오려면 다른 해법이 필요함
    • 만족하는 “고객”임. OpenBSD로 무료 6in4 터널을 약 5년간 써왔고, 언급할 만한 문제는 없었음
      /etc/hostname.gif0 같은 OpenBSD 네트워크 인터페이스 파일만으로 설정함: tunnel, inet6 128 alias, !route -n add -inet6 default. 이 연결은 공인 IPv4 주소 없이 의도적으로 구성한 AWS의 VPS 클러스터에 접속하는 데 씀. Jeff Bezos 같은 사람들이 IPv4 주소 공간을 적극적으로 수익화하는 탓에, 그렇지 않으면 월 비용의 큰 부분이 됐을 것임
  • 진짜 IPv6 전용 환경에서 빠르게 IPv4 연결이 필요하다면 공개 DNS64+NAT64 게이트웨이를 쓸 수 있음. 목록은 https://nat64.net/public-providers에 있음
    일반적인 사용에서는 DNS 서버만 바꾸면 됨. DNS64는 AAAA 레코드가 없는 대상에 대해 NAT64 박스로 향하는 AAAA DNS 레코드를 합성함: $ dig +short @2a00:1098:2c::1 AAAA github.com2a01:4f8:c2c:123f:64:5:141a:9cd7. NAT64는 DNS64 때문에 자기 쪽으로 온 트래픽을 프로토콜 변환하고 NAT 처리해줌: $ curl --resolve github.com:443:[2a01:4f8:c2c:123f:64:5:141a:9cd7] [https://github.com/](<https://github.com/>;)

    • 이 말을 하러 왔음. 유럽에서는 적어도 https://nat64.net/ 자체가 꽤 괜찮음. 좋은 경험만 있었음
    • Cloudflare WARP를 쓰면 훨씬 빠를 것임. WARP를 통해 IPv4 주소에도 직접 연결할 수 있음
  • 그 신화 속의 IPv6 전용 인터넷 사용자가 실제로 존재하긴 하는군 :) 훌륭한 네트워크 엔지니어링임
    예전에 더 흔한 반대 목적, 즉 IPv4 전용 연결에서 IPv6 관련 작업을 하려고 비슷한 게 필요했음. 서버를 완전히 제어할 수 있다면 더 제한적이지만 빠른 해법으로 ssh -D 1080 -N myserver를 써서 SOCKS5 프록시를 만들고 브라우저에 설정했음. 시스템 전체로도 설정할 수 있을 것 같지만, 그러다 원래의 ssh 연결이 깨져 전체가 무너질지 궁금함

  • 나도 같은 상황임. 2주째 “티켓이 열려 있고 기술자가 곧 확인할 것”이라는 말만 들어서 꽤 답답함
    IPv6가 동작하니 완전 장애로 보지 않아서 우선순위가 낮은 건지 모르겠음. 독일에는 이런 경우 소비자 보상을 보장하는 법이 있는데, 곧 이 경우도 해당되는지 확인해볼 예정임. 이 블로그 글의 해법은 여러 엔드포인트가 데이터센터 IP 대역을 통째로 막거나 여러 CAPTCHA를 요구한다는 문제가 있고, 일반 VPN 제공자도 마찬가지임. 집 전체 네트워크를 고치고 싶어서 라우터에서 처리해야 했는데, Ubiquiti EdgeRouter 같은 비표준 장치가 있어서 Wireguard 라우팅과 NAT 규칙 설정에 유리했음. FritzBox 같은 장비에서는 어떻게 했을지 모르겠음. 단점은 라우터 성능이 많은 연결을 처리하기엔 부족해서, 하드웨어 오프로딩을 지원하는 IPSec으로 바꿔야 한다는 것임

    • FritzBox도 사실 VPN 연결 설정용 GUI가 꽤 잘 되어 있음. FritzBox끼리의 연결을 의도한 기능이지만 호환되는 VPN이면 됨. 정적 IPv4/IPv6 라우트도 설정할 수 있음
      가장 큰 문제는 반대편에서 어떤 IPsec 암호화 구성을 기대하는지 파악하는 것일 가능성이 큼. Wireguard가 훨씬 쉬울 수 있지만 그때는 하드웨어 가속 문제가 생길 수 있음. 필요하면 FritzBox 설정 파일을 백업하고 덤프를 편집해 VPN 엔드포인트를 수동 설정한 뒤 체크섬을 다시 계산해서 가져올 수도 있음. AVM에는 사용자가 접근할 수 없는 설정이 많고 이렇게 조정 가능하지만, 라우터를 실수로 벽돌로 만들지 않도록 접근을 좀 어렵게 해둠
    • 독일 상황은 모르겠지만 네덜란드에서는 같은 ISP에서 유선과 모바일을 같이 쓰고 유선 연결 장애가 나면, 장애가 고쳐질 때까지 무료 모바일 데이터를 요청할 수 있음
      ISP에 물어볼 만한 선택지일 수도 있음
  • Apple의 App Store 규칙 중 마음에 드는 점은 모든 앱이 IPv6 전용 네트워크에서 동작해야 한다는 요구사항임. 수년 전부터 있던 규칙임
    개발자로서 처음 마주치면 조금 놀랍지만, 사용자로서는 있어서 다행임

    • 앱을 쓰면 Github도 IPv6로 접근 가능한가?
    • 그렇지만 서버가 IPv6 주소를 가져야 한다는 뜻은 아님
  • 같은 일을 겪는다면 ssh -D 8080 user@hostname으로 ssh 프록시를 아주 쉽게 만들 수 있음
    연결이 만들어지면 브라우저에서 localhost:8080을 SOCKS 프록시로 쓰도록 지정하면 됨

    • 같은 조언을 하려던 참이었음. 일시적인 문제에는 훨씬 단순한 해법이고, 프록시가 필요할 때는 영구적인 도구로도 쓸 수 있음
      이 기능을 쓰려면 sshd_config에서 AllowTcpForwarding이 활성화되어 있어야 함
    • 공용 와이파이를 쓸 때 항상 이렇게 함. VPN 비용을 내거나 VPN을 신뢰할 필요 없이, 모든 것을 내 infomaniak 서버로 SOCKS 포워딩
  • IPv4를 끄는 데 막히는 지점들이 있음: 대체 검색엔진 대부분이 IPv6 연결을 제공하지 않는 듯하고, Github는 마지막 확인 때 IPv6가 전혀 없었음
    Microsoft라 좋은 걸 기대하면 안 되고, 오히려 최악을 기대해야 함. 최근에는 issues에서 noscript/basic (x)html도 망가뜨렸음. noscript/basic (x)html 브라우저와 자체 호스팅 이메일, mailbox@[ipv6:...] 같은 IP(v6) 리터럴로 아직 계정을 만들 수 있는지도 모르겠음. Steam이나 게임도 최근 확인하진 않았지만 많은 CDN/게임 서버 또는 상당 부분이 아직 IPv4 전용일 것 같음. 이메일 서버도 다수가 자체 호스팅 메일 서버를 막고, Spamhaus 같은 스위스·안도라의 수상한 회사가 만든 서투르고 부적절한 차단 목록을 쓰는 경우가 많음. 또 많은 네트워크 애플리케이션이 IPv6의 장점을 활용하지 않음. 예를 들어 웹 같은 클라이언트-서버 애플리케이션은 ISP가 너무 작은 프리픽스를 주지 않는다면 세션마다 무작위 생성 IPv6 주소를 써야 함. 모바일 IPv6 ISP는 프리픽스 안에서 임의의 IPv6/128 주소를 주는 듯한데, 단말 애플리케이션이 중앙 온라인 이름 해석 없이 직접 음성/영상 통화를 위한 “고정” IPv6 주소를 고를 수 있도록 안정적인 프리픽스, 아마 96비트 정도를 제공해야 함. 사용자 애플리케이션 간 IPv6 주소 조정을 위한 새 사용자 수준 OS 서비스도 필요함. 다만 일부 벤더와 개발자가 사용자와 앱 개발자를 종속시키려고 강요할 어리석은 복잡성은 조심해야 함

    • 내 미니 홈랩에서 IPv6 전용은 잘 굴러가고 있었는데, 뭔가 때문에 GitHub가 필요해지면서 깨졌음. 그래서 NAT64+NAT64를 세웠음
      GitHub 하나 때문에 그렇게 해야 했다는 게 정말 아쉬웠음. 메일 서버 때문에 언젠가는 필요했겠지만, 이렇게 빨리 NAT64가 필요해진 이유로는 너무 별로였음. 사람들이 GitHub를 소프트웨어 배포 수단으로 쓰는 데 따르는 여러 단점 중 하나라고 봄
    • 몇 달 전에 Spamhaus와 씨름해야 했음. 어떤 이유인지 내 VPS의 IPv6 주소가 Spamhaus 차단 목록에 올라갔음
      왜 그랬는지 전혀 모르겠음. 그 머신은 이메일을 보낼 수 있는 기능을 아무것도 돌리지 않고, 내가 알기로 Digital Ocean은 SMTP도 막고 있어서 이 머신이 이메일을 보내는 건 문자 그대로 불가능했음. Spamhaus는 해결에 전혀 도움이 되지 않았고, DO도 마찬가지였음
    • 많은 CDN/게임 서버가 아직 IPv4 전용인 문제 때문에 DNS 프록시를 만들었음. 그런 도메인에 올바른 AAAA 레코드를 추가해줌
      https://gitlab.com/miyurusankalpa/IPv6-dns-server
    • Steam은 IPv4가 필요하다고 확인할 수 있음. 플레이하려면 인증이 필요한 일부 게임도 마찬가지임
    • VPS 서비스처럼 IPv6 전용으로 돌리면 할인이 붙는 경우가 아니라면, 아직 누구도 IPv4에서 벗어나는 걸 본격적으로 고려하지 않는 것 같음
      실제로는 어떤 형태로든 IPv4 연결을 계속 가지게 될 가능성이 높고, 다만 그 연결이 CGNAT을 통해 이뤄질 가능성은 점점 커질 것임. Github는 특히 화남. 몇 주간 테스트를 했고 모든 것이 잘 동작하는 듯했는데 다시 IPv4 전용으로 되돌렸음. 이메일 서버는 어차피 10~20년 전 세계에 살고 있음. 이메일 서버에서 SSL 3.0이나 TLS 1.0 지원을 끄는 것도 전달성 문제를 감수하지 않고는 하기 어렵다. Microsoft Outlook의 지원과 스팸 필터는 IPv6 가능한 메일 서버를 인식하지도 못하는 것 같음. 헤더를 보면 내부적으로는 오래전부터 IPv6를 써온 것 같은데도 그렇다. IPv6가 더 활용되면 좋겠지만, 소수 고객에게 약간 덜 잘 동작할 수 있다는 두려움이 기술을 실제로 쓰려는 모든 시도를 얼어붙게 만드는 듯함. 모바일 통신사에서 이상한 IP 동작을 보는 이유는 모바일 네트워크에서 IP가 동작하는 방식 때문일 가능성이 큼. 고속도로를 달리며 통화하거나 고속열차에 앉아 있으면 휴대폰은 계속 핸드오버를 하고, IP 주소에는 일정 수준의 안정성이 필요함. 국경을 넘어 외국 네트워크로 바뀌어도 전체 스택은 끊김 없는 연결을 유지해야 함. 셀룰러 네트워크 내부에는 특수한 라우팅 시스템이 있고, 그중 일부는 IPv6 기능을 훌륭히 활용하지만 휴대폰에 “일반적인” 정적 전역 유니캐스트 주소를 제공하기 어렵게 만듦. 최대한 일반적으로 보이게 만들지만, 유선 가정 인터넷처럼 그런 안정성을 달성하기는 쉽지 않음
  • 직장에서 내부 인프라 접근용으로 IPv6 전용 VPN 몇 개를 운영 중임
    지금까지 가장 큰 문제는 Windows와 macOS 클라이언트가 IPv6 DNS 서버를 필요로 한다는 것임. 그렇지 않으면 v6onlyhost.vpn.example.com을 해석하려고 시도조차 하지 않음. 클라이언트가 IPv6 가능 네트워크에 있을 수도 있고 아닐 수도 있어서 VPN 안에 DNS 서버를 운영하고 클라이언트에 밀어 넣어야 하는데, VPN이 끊긴 뒤 Wireguard 앱이 어떤 이유로 DNS를 원래대로 되돌리지 못하면 온갖 문제가 생길 수 있음

    • ISP의 IPv4 전용 네트워크를 쓰면서도 macOS는 그런 DNS 서버 없이 IPv6 전용 접속이 가능했음
      세부 사항은 이제 기억나지 않지만, 몇 년 전 파보니 macOS는 IPv6 주소만 있으면 그런 식으로도 잘 동작했음. 호스트에 ULA 주소를 붙이면 됨. 물론 사용자가 그 방법을 알아야 한다는 전제가 있음. VPN 애플리케이션에 따라 IPv6 전용 네트워크로 들어갈 때 ULA를 추가하는 스크립트를 넣을 수도 있음. 다만 가짜 ULA를 계속 남겨두면 사용자가 IPv6 가능한 네트워크로 이동했을 때 문제가 생길 수 있음
    • 이건 Windows 문제가 아님. 나도 무작위 핫스팟에서 비슷한 문제가 있었지만 전부는 아니었음. IPv6가 꺼져 있을 때 AAAA 레코드를 반환하지 않는 멍청한 핫스팟 때문이라고 봄
  • 이렇게 오래 지났는데도 내 모든 머신과 홈랩을 IPv6로 바꾸려고 며칠 동안 머리 쥐어뜯을 만한 설득력 있는 이유를 아직 모르겠음
    몇 주 동안 모든 걸 문제 해결하고 방화벽을 재구성하고 네트워크 주소를 다시 매기는 것보다는 포트 포워딩과 방화벽 규칙이 더 직관적임. 내가 뭘 놓치고 있는 걸까?

    • 놓친 건 생각보다 어렵지 않다는 점임. 아주 복잡한 홈 네트워크가 아니라면 IPv6 설정은 길어야 저녁 한 번이면 됨
      내 네트워크와 ISP인 Comcast 기준으로는 라우터에서 IPv6를 켜면 ISP에서 프리픽스를 받아 로컬에 광고하고, 외부에서 접근 가능하게 만들 대상에 방화벽 규칙을 하나 추가하면 끝임
    • 놓친 건 없음. 기업 환경에서는 IPv6 도입의 이점이 단점보다 크지 않음
      장치 약 3500대, 건물 7개, 10기가 WAN 2개와 4기가 WAN 1개를 관리하고, 공인 IPv4 주소 약 26개와 NAT를 사용 중임. 지금도 IPv6를 도입할 강한 이유가 없음. 이중 스택 구성은 별 이점 없이 불필요한 트래픽과 복잡도만 추가함. 지금도 정적 IPv6 주소 블록을 배정받기 어렵고, 두 번 신청했지만 거절당했음. 상승 여지가 적을 뿐 아니라 블록을 받는 것 자체도 아직 어렵다. https://www.arin.net/resources/guide/ipv6/first_request/의 자격 조건도 IPv4 할당 보유, 즉시 IPv6 멀티홈 예정, 1년 내 13개 엔드 사이트, 1년 내 IPv6 주소 2,000개 사용, 1년 내 /64 서브넷 200개 사용 같은 식임
    • 지금 당장은 크게 놓친 것이 없음. 언젠가 Google, Cloudflare 같은 대기업들이 점점 비싸지는 IPv4 주소 비용에 지쳐 IPv6에 인센티브를 줄 수도 있음. 예를 들어 IPv4를 제한하기 시작할 수 있음
      이미 초기 움직임은 있음. AWS는 예전에는 사용하지 않는 IPv4 탄력 IP 주소에만 요금을 부과했지만, 이제는 사용 여부와 상관없이 요금을 부과함. 솔직히 다음에 게이트웨이나 라우터를 업그레이드할 때 준비해두는 정도면 충분하고, 지금 당장 놓치는 건 없음. IPv4와 IPv6를 동시에 쓸 수도 있음. 라우터에서 켜도 IPv4 전용 장치는 그대로 잘 동작함. 한 가지 주의할 점은 IPv6 자동 발견이 한때 꽤 엉망이었다는 것임. SLAAC, IPv6 자동 주소 지정, DHCPv6가 모두 있었고, 원래 자동 주소 지정은 DNS 서버를 받는 것도 지원하지 않았음. 이제는 SLAAC 쪽으로 정리되는 중이지만, ISP들은 아주 오랫동안 DHCPv6를 쓸 것임