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" | "" |