본문 바로가기
WIKI 기술 지식 베이스

IPAllowList

원문 보기 위키 갱신

출처: Traefik HTTP Middlewares IPAllowList

본문

IPAllowList

ipAllowList는 클라이언트 IP를 기준으로 요청을 허용하거나 거부합니다.

구성 예시

구조화된 (YAML)

# 정의된 IP의 요청은 허용하고
# 그 외 요청은 403이 아닌 404로 거부
http:
  middlewares:
    test-ipallowlist:
      ipAllowList:
        sourceRange:
          - "127.0.0.1/32"
          - "192.168.1.7"
        rejectStatusCode: 404

구조화된 (TOML)

# 정의된 IP의 요청은 허용하고
# 그 외 요청은 403이 아닌 404로 거부
[http.middlewares]
  [http.middlewares.test-ipallowlist.ipAllowList]
    sourceRange = ["127.0.0.1/32", "192.168.1.7"]
    rejectStatusCode = 404

Labels

# 정의된 IP의 요청은 허용하고
# 그 외 요청은 403이 아닌 404로 거부
labels:
  - "traefik.http.middlewares.test-ipallowlist.ipallowlist.sourcerange=127.0.0.1/32, 192.168.1.7"
  - "traefik.http.middlewares.test-ipallowlist.ipallowlist.rejectstatuscode=404"

Tags

// 정의된 IP의 요청은 허용하고
// 그 외 요청은 403이 아닌 404로 거부
{
  "Tags" : [
    "traefik.http.middlewares.test-ipallowlist.ipallowlist.sourcerange=127.0.0.1/32, 192.168.1.7",
    "traefik.http.middlewares.test-ipallowlist.ipallowlist.rejectstatuscode=404"
  ]
}

Kubernetes

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-ipallowlist
spec:
  ipAllowList:
    sourceRange:
      - 127.0.0.1/32
      - 192.168.1.7
    rejectStatusCode: 404

구성 옵션

| Field | Description | Default | Required | | sourceRange | 허용되는 IP 목록(CIDR 표기를 사용한 범위도 가능). | | Yes | | ipStrategy.depth | X-Forwarded-For 헤더에서 선택할 IP의 깊이 위치(오른쪽부터 시작). 0이면 깊이 없음. X-Forwarded-For의 총 IP 수보다 크면 클라이언트 IP는 비어 있게 돼요. 0보다 크면 excludedIPs 옵션은 평가되지 않습니다. ipStrategy, depth에 대한 자세한 내용은 아래를 참고하세요. | 0 | No | | ipStrategy.excludedIPs | Traefik이 X-Forwarded-For 헤더를 훑어 목록에 없는 첫 IP를 선택하도록 허용해요. depth가 지정되면 excludedIPs는 무시됩니다. ipStrategy, excludedIPs에 대한 자세한 내용은 아래를 참고하세요. | | No | | ipStrategy.ipv6Subnet | ipv6Subnet이 제공되고 선택된 IP가 IPv6라면, 그 IP는 속한 서브넷의 첫 IP로 변환됩니다. ipStrategy.ipv6Subnet, excludedIPs에 대한 자세한 내용은 아래를 참고하세요. | | No | | rejectStatusCode | 거부된 요청에 사용할 HTTP 상태 코드를 정의해요. | 403 | No |

ipStrategy

ipStrategy 옵션은 Traefik이 클라이언트 IP를 어떻게 결정할지 구성하는 두 파라미터를 정의합니다: depth, excludedIPs.

전략이 설정되지 않으면, 기본 동작은 요청에서 찾은 원격 주소(Remote address)에 대해 sourceRange를 매칭하는 것입니다.

미들웨어로서 패스리스트(passlist) 검사는 실제 백엔드로의 프록시가 일어나기 전에 실행됩니다. 게다가 이전 네트워크 홉은 프록시의 마지막 단계, 즉 이미 패스리스트를 통과한 뒤에만 X-Forwarded-For에 추가돼요. 따라서 패스리스트 중에는 이전 네트워크 홉이 아직 X-Forwarded-For에 없으므로 sourceRange와 매칭할 수 없습니다.

ipStrategy.depth

depth 옵션은 Traefik에게 X-Forwarded-For 헤더를 사용해 depth 위치에 있는 IP를 취하도록 지시합니다(오른쪽부터 시작).

  • depth가 X-Forwarded-For의 총 IP 수보다 크면 클라이언트 IP는 비어 있게 됩니다.

  • depth 값이 0 이하이면 depth는 무시됩니다.

ipStrategy.ipv6Subnet이 제공되고 선택된 IP가 IPv6라면, 그 IP는 속한 서브넷의 첫 IP로 변환됩니다.

ipStrategy.ipv6Subnet

이 전략은 Depth와 RemoteAddr 전략에만 적용됩니다. ipv6Subnet이 제공되고 선택된 IP가 IPv6라면, 그 IP는 속한 서브넷의 첫 IP로 변환됩니다.

새 IPv6를 얻어 이 미들웨어를 우회하는 것을 막기 위해 IPv6 주소를 서브넷으로 그룹화할 때 유용해요.

  • ipv6Subnet이 0 이하이거나 128보다 크면 미들웨어 생성이 실패합니다. 유효한 범위: 1–128.

ipv6Subnet 예시

ipv6Subnet이 제공되면 IP는 다음과 같이 변환됩니다.

| IP | ipv6Subnet | clientIP | | "::abcd:1111:2222:3333" | 64 | "::0:0:0:0" | | "::abcd:1111:2222:3333" | 80 | "::abcd:0:0:0:0" | | "::abcd:1111:2222:3333" | 96 | "::abcd:1111:0:0:0" |

Depth & X-Forwarded-For 예시

depth가 2로 설정되고 요청의 X-Forwarded-For 헤더가 "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"이라면, "실제" 클라이언트 IP는 "10.0.0.1"(depth 4 지점)이지만 기준으로 사용되는 IP는 "12.0.0.1"(depth=2)입니다.

| X-Forwarded-For | depth | clientIP | | "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" | 1 | "13.0.0.1" | | "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" | 3 | "11.0.0.1" | | "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" | 5 | "" |

ExcludedIPs & X-Forwarded-For 예시

| X-Forwarded-For | excludedIPs | clientIP | | "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" | "12.0.0.1,13.0.0.1" | "11.0.0.1" | | "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" | "15.0.0.1,13.0.0.1" | "12.0.0.1" | | "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" | "10.0.0.1,13.0.0.1" | "12.0.0.1" | | "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" | "15.0.0.1,16.0.0.1" | "13.0.0.1" | | "10.0.0.1,11.0.0.1" | "10.0.0.1,11.0.0.1" | "" |

더 알아보기 (Learn more)