IPv6 방화벽 구성: 필수 규칙
연결을 중단하지 않고 IPv6용 방화벽을 구성하세요. 필수 ICMPv6 규칙, Linux 예시 및 피해야 할 일반적인 실수입니다.
IPv4 방화벽은 큰 결과 없이 ICMP를 차단할 수 있습니다. IPv6는 그런 식으로 작동하지 않습니다. 잘못된 ICMPv6 메시지를 차단하면 경로 MTU 발견, 이웃 발견 및 기본 연결이 중단됩니다. 방화벽이 디버깅하는 데 몇 시간이 걸리는 연결 실패를 조용히 야기할 것입니다.
TL;DR - 빠른 요약
핵심 포인트:
- ICMPv6는 필수입니다: IPv4 ICMP와 달리 ICMPv6를 차단하면 기본 네트워크 작업이 중단됩니다
- 특정 유형을 허용하세요: 유형 1-3(오류), 128-129(ping), 133-136(NDP)이 필요합니다
- 유형 2를 절대 차단하지 마세요: Packet Too Big 메시지는 경로 MTU 발견에 중요합니다
- NDP에 홉 제한 255 사용: 이웃 발견의 오프 링크 스푸핑을 방지합니다
- 모든 프로토콜 패밀리에 적용: iptables와 ip6tables를 모두 구성하는 것을 잊지 마세요
바로가기: 필수 ICMPv6 유형 | Linux 예시 | 일반적인 실수
IPv6 방화벽이 다른 이유#
IPv4에서 ICMP는 ping 및 traceroute와 같은 진단을 처리합니다. 완전히 차단할 수 있으며 대부분의 것들이 여전히 작동합니다. ARP는 레이어 2에서 실행되고, DHCP는 UDP를 사용하며, 라우터는 전용 프로토콜을 사용합니다.
IPv6는 이러한 기능을 ICMPv6로 병합했습니다. 주소 확인, 라우터 발견 및 중복 주소 감지는 모두 특정 ICMPv6 유형에 따라 다릅니다. 차단하면 호스트가 기본 게이트웨이를 찾을 수 없고, 이웃이 동일한 링크에서 통신할 수 없으며, MTU 불일치가 발생할 때 연결이 중단됩니다.
프로토콜 설계자는 의도적으로 이 선택을 했습니다. ICMPv6는 진단 추가가 아닌 IPv6 사양의 일부입니다.
필수 ICMPv6 유형#
기본 기능을 위해 방화벽이 이러한 ICMPv6 유형을 허용해야 합니다:
| 유형 | 이름 | 목적 | 차단합니까? |
|---|---|---|---|
| 1 | Destination Unreachable | 포트/프로토콜이 닫힘 | 아니요 - TCP 중단 |
| 2 | Packet Too Big | 경로 MTU 발견 | 절대 - 연결 중단 |
| 3 | Time Exceeded | 홉 제한 도달 | 아니요 - traceroute 중단 |
| 128 | Echo Request | Ping 요청 | 선택 사항(하지만 왜?) |
| 129 | Echo Reply | Ping 응답 | 선택 사항(하지만 왜?) |
| 133 | Router Solicitation | 기본 게이트웨이 찾기 | 절대 - 연결 중단 |
| 134 | Router Advertisement | 게이트웨이 알림 | 절대 - 연결 중단 |
| 135 | Neighbor Solicitation | 주소 확인(ARP 동등) | 절대 - 모든 것 중단 |
| 136 | Neighbor Advertisement | 주소 확인 응답 | 절대 - 모든 것 중단 |
ICMPv6 유형 2, 133, 134, 135 또는 136을 차단하면 미묘하고 디버그하기 어려운 방식으로 IPv6 연결이 중단됩니다. 하지 마세요.
유형 2(Packet Too Big)는 특별한 주의가 필요합니다. IPv6에는 중간 라우터에서 단편화가 없습니다. 패킷이 경로 MTU를 초과하면 라우터가 삭제하고 Packet Too Big 메시지를 다시 보냅니다. 이것을 차단하면 초기 SYN/ACK 후 연결이 중단됩니다. HTTPS가 작동하지만 대규모 전송이 실패하는 이유를 디버깅하는 데 몇 시간을 소비할 것입니다.
절대 ICMPv6 유형 2(Packet Too Big)를 차단하지 마세요. 이것은 경로 MTU 발견을 중단하고 연결 중단을 야기합니다. 자세한 내용은 MTU 및 PMTUD 가이드를 참조하세요.
Linux ip6tables 예시#
최소 호스트 방화벽#
트래픽을 라우팅하지 않는 클라이언트 시스템 또는 서버의 경우:
# 기존 규칙 플러시
ip6tables -F
ip6tables -X
# 기본 정책
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
# 루프백 허용
ip6tables -A INPUT -i lo -j ACCEPT
# 설정된 연결 허용
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 필수 ICMPv6 허용
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 1 -j ACCEPT # Destination Unreachable
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 2 -j ACCEPT # Packet Too Big
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 3 -j ACCEPT # Time Exceeded
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j ACCEPT # Echo Request
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 129 -j ACCEPT # Echo Reply
# 이웃 발견 허용(링크 로컬이어야 하며 홉 제한 255)
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 133 -m hl --hl-eq 255 -j ACCEPT # Router Solicitation
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 134 -m hl --hl-eq 255 -j ACCEPT # Router Advertisement
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 135 -m hl --hl-eq 255 -j ACCEPT # Neighbor Solicitation
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 136 -m hl --hl-eq 255 -j ACCEPT # Neighbor Advertisement
# DHCPv6 허용(필요한 경우)
ip6tables -A INPUT -p udp --dport 546 -j ACCEPT
# 삭제된 패킷 로그(선택 사항)
ip6tables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables-dropped: "홉 제한 확인(--hl-eq 255)은 오프 링크 소스의 스푸핑된 이웃 발견 패킷을 방지합니다. 합법적인 이웃 발견은 항상 홉 제한 255를 사용합니다.
홉 제한 확인은 보안 기능입니다: 이웃 발견 메시지는 직접 연결된 장치에서만 와야 합니다. 홉 제한 255는 패킷이 라우터를 통해 전달될 수 없었음을 의미합니다.
서버 방화벽#
ICMPv6 규칙 후에 서비스를 추가합니다:
# SSH
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP/HTTPS
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS(DNS 서버 실행 중인 경우)
ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 53 -j ACCEPTSSH 규칙은 recent를 사용하여 기본 속도 제한을 구현합니다. 60초 내에 동일한 주소에서 4번의 연결 시도 후 추가 시도가 삭제됩니다.
라우터 전달 규칙#
트래픽을 전달하는 라우터 또는 시스템의 경우:
ip6tables -P FORWARD DROP
# 설정된 연결 허용
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# ICMPv6 전달 허용(PMTUD에 중요)
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 1 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 2 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 3 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 128 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 129 -j ACCEPT
# 내부 네트워크가 인터넷에 액세스하도록 허용
ip6tables -A FORWARD -i eth1 -o eth0 -j ACCEPT이웃 발견 메시지(133-136)를 전달하지 마세요. 이들은 링크 로컬 전용입니다.
Linux nftables 예시#
최신 배포는 iptables 대신 nftables를 사용합니다. 구문이 더 깔끔합니다:
# 테이블 생성
nft add table ip6 filter
# 체인 생성
nft add chain ip6 filter input { type filter hook input priority 0\; policy drop\; }
nft add chain ip6 filter forward { type filter hook forward priority 0\; policy drop\; }
nft add chain ip6 filter output { type filter hook output priority 0\; policy accept\; }
# 루프백
nft add rule ip6 filter input iif lo accept
# 설정된 연결
nft add rule ip6 filter input ct state established,related accept
# ICMPv6
nft add rule ip6 filter input icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply } accept
# 홉 제한 확인이 있는 이웃 발견
nft add rule ip6 filter input icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } ip6 hoplimit 255 accept
# 속도 제한이 있는 SSH
nft add rule ip6 filter input tcp dport 22 ct state new limit rate 4/minute accept
# HTTP/HTTPS
nft add rule ip6 filter input tcp dport { 80, 443 } accept세트 표기법({ 80, 443 })은 두 개 대신 하나의 규칙을 만들어 규칙 세트를 더 효율적으로 만듭니다.
Windows 방화벽#
Windows 방화벽은 기본적으로 대부분의 필수 유형에 대해 IPv6 ICMPv6를 활성화하지만 확인해야 합니다:
# 현재 ICMPv6 규칙 표시
Get-NetFirewallRule -DisplayName "*ICMPv6*" | Format-Table DisplayName, Enabled, Direction
# 모든 ICMPv6 인바운드 활성화(비활성화된 경우)
Enable-NetFirewallRule -DisplayName "Core Networking - Destination Unreachable (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Packet Too Big (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Neighbor Discovery Solicitation (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Neighbor Discovery Advertisement (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Router Advertisement (ICMPv6-In)"
# IPv6에서 SSH 서버 허용
New-NetFirewallRule -DisplayName "SSH (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Profile Any -RemoteAddress Any웹 서버의 경우 HTTP 및 HTTPS 트래픽을 허용하는 규칙을 추가합니다:
New-NetFirewallRule -DisplayName "HTTP (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "HTTPS (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow클라우드 보안 그룹#
AWS#
보안 그룹은 상태 저장이며 설정된 반환 트래픽을 자동으로 허용합니다. 다음에 대한 명시적 규칙을 추가합니다:
- ICMPv6: "All ICMPv6" 사용 또는 특정 유형 선택
- 서비스: TCP/UDP 포트 추가
Azure#
네트워크 보안 그룹(NSG)은 IPv6를 처리합니다. 기본 규칙은 아웃바운드 및 설정된 트래픽을 허용합니다. 서비스에 대한 인바운드 규칙을 추가합니다.
GCP#
방화벽 규칙은 IPv6를 지원합니다. IPv6에 대해 --source-ranges=::/0으로 별도의 규칙을 만듭니다. 기본 규칙에는 ICMPv6가 포함되지 않으므로 명시적으로 추가합니다.
세 공급자 모두 먼저 VPC/네트워크에서 IPv6를 활성화해야 합니다. IPv6는 기본적으로 활성화되지 않습니다.
일반적인 실수#
모든 ICMPv6 차단#
가장 일반적인 IPv6 방화벽 실수입니다. 관리자는 모든 ICMP를 차단하는 IPv4 규칙을 포팅하고 IPv6가 작동하지 않는 이유를 궁금해합니다. 이 문서에서 한 가지만 기억한다면: 절대 모든 ICMPv6를 차단하지 마세요.
IPv6 방화벽 규칙 없음#
일부 관리자는 iptables를 신중하게 구성하지만 ip6tables를 완전히 무시합니다. 그러면 IPv6가 완전히 열립니다. 두 프로토콜 패밀리 모두 방화벽 규칙이 필요합니다.
송신 필터링 잊음#
대부분의 예시는 수신 규칙만 표시합니다. 엄격한 송신 필터링을 구현하는 경우(해야 함) 아웃바운드 ICMPv6 유형 133, 135 및 128을 허용하세요. 아웃바운드 이웃 요청을 차단하면 호스트가 이웃을 확인할 수 없습니다.
이웃 발견의 잘못된 홉 제한#
홉 제한(255)을 확인하지 않고 이웃 발견 패킷을 수락하면 공격자가 인터넷 어디서나 스푸핑된 라우터 또는 이웃 알림을 보낼 수 있습니다. 항상 홉 제한을 확인하세요.
너무 많이 허용#
"모든 ICMPv6"를 활성화하는 것이 모두 차단하는 것보다 안전하지만 여전히 과도합니다. 예를 들어 인터넷에서 Multicast Listener Discovery 메시지를 허용할 필요가 없습니다. 특정 유형을 사용하세요.
모범 사례
모든 ICMPv6보다 특정 ICMPv6 유형을 허용하세요. 필수 유형은: 1-4(오류), 128-129(echo) 및 133-136(이웃 발견)입니다. 이것은 기능을 중단하지 않고 보안을 제공합니다.
방화벽 테스트#
규칙을 구성한 후 기본 연결을 확인합니다:
# ping 테스트(ICMPv6 유형 128/129 필요)
ping6 -c 3 2001:4860:4860::8888
# 경로 MTU 발견 테스트(ICMPv6 유형 2 필요)
# 대형 패킷 전송, 중단되지 않는지 확인
curl -6 -v https://ipv6.google.com/이 명령은 필수 ICMPv6 메시지가 허용되고 있는지 확인합니다. ping이 작동하지만 curl이 중단되면 유형 2(Packet Too Big)가 차단되지 않았는지 확인하세요.
이웃 발견 및 라우팅 확인:
# 이웃 발견 확인(유형 135/136 필요)
ip -6 neigh show
# 라우트 확인(유형 133/134 필요)
ip -6 route show다른 호스트에서 무단 포트가 실제로 차단되었는지 테스트합니다:
# 시간 초과 또는 "Connection refused" 반환해야 함
telnet -6 your:server::address 23
# 작동해야 함(SSH가 허용된 경우)
ssh -6 your:server::addressIPv6 Port Scanner(ipv6-tools.com) 또는 test-ipv6.com과 같은 온라인 스캐너를 사용하여 외부 네트워크에서 방화벽을 확인하세요.
IPv6 방화벽은 ICMPv6가 무엇을 하는지 이해해야 합니다. 프로토콜은 선택 사항이거나 진단용이 아닙니다. 필수 유형을 허용하고, 이웃 발견이 작동하는지 확인하고, 실제 트래픽으로 경로 MTU 발견을 테스트하세요. 이것을 올바르게 하면 IPv6 방화벽이 안전하고 기능적일 것입니다.
관련 기사#
- IPv6 보안 모범 사례 - IPv6 네트워크 보안에 대한 포괄적인 가이드
- IPv6를 활성화하는 방법 - 시스템 및 네트워크에서 IPv6 구성