여러분이 해외의 어느 사이트에 접속 할려고 한다던가 혹은 이미 접속된 사이트에서 동영상 같은 어떤 컨텐츠를 본다던가 할 때 가끔 당신의 국가에서는 해당 컨텐츠에 접근할 수 없습니다라는 식의 안내 문구를 만나게 되는 것을 경험한 적이 있을 것입니다.
이와 같은 경우 각 국가에 할당된 IP들에 대한 데이터베이스를 기반으로 차단할려는 국가에 해당하는 ClientIP에서 요청이 들어올 경우 그 IP와 DB를 매칭시켜서 일치할 경우에는 차단, 그렇지 않을 경우에는 통과 하는 방식으로 운영이 됩니다.
이번에는 패스틀리에서 어떤 방식으로 국가별 IP를 차단 할 수 있는지 살펴보도록 하겠습니다. 전 시간에 안내해 드렸던 fiddle site를 이용해서 구현해 보도록 하겠습니다.
1. 먼저 잴 상위에 INIT subroutine를 보시면 Key / Value로 이루어진 table geoip_block 이라고 이름 지어진 container를 보실 수 있습니다. 패스틀리에서는 Dictionaries라고 하며, 해당 기능을 이용해서 VCL코드 상에서 여러가지 방법으로 이용할 수 있습니다. Dictionaries안에 두개의 국가코드를 Key값으로 입력했으며, 한개는 blocked, 한개는 unblocked라는 value를 가집니다.
2. Recv subroutine를 보시면 유저로 부터 요청을 어떻게 처리해야 할지를 정의하는 코드들이 설정되어 있습니다.
if (fastly.ff.visits_this_service == 0 && req.restarts == 0) { // 해당 요청이 Fastly edge를 통해 들어온 최초의 요청임을 확인합니다. set req.http.client-geo-country = client.geo.country_code; // client-geo-country라는 request header를 만들고 거기에 client.geo.country_code를 할당합니다. set req.http.client-geo-blocked = table.lookup(geoip_block, req.http.client-geo-country); // client-geo-blocked라는 request header를 만들고 거기에 Dictionaries에 매칭하고 있는 key가 있는지를 찾아서 있을 경우 해당 key가 가지고 있는 value를 반환합니다. 예를들면 RU였을 경우에는 blocked가 반환됩니다. if (req.http.client-geo-blocked == "blocked") { error 611; // client-geo-blocked header가 blocked와 일치할 경우 Error subroutine으로 보내며 Error SUB에 설정되어 있는 611을 찾습니다. } } |
3. Error Subroutine를 보시면 해당 Sub로 넘어온 에러를 어떻게 처리할 것인가에 대해서 정의되어 있습니다.
if (obj.status == 611) { // Recv Sub에서 error 611과 관련된 부분으로 넘어온 status code가 611일 경우 하위의 내용을 처리하라 라는 부분입니다. set obj.status = 403; // Status code를 403으로 정의 합니다. set obj.http.Content-Type = "text/plain"; // Content-Type header를 정의합니다. synthetic {"<!DOCTYPE html> <html> <head> <title>Forbidden</title> </head> <body> Sorry. You can not access this site from your country! </body> </html>"}; // synthetic 이라는 기능으로 Error처리시에 유저측에 보여줄 page를 설정합니다. HTML문의 사용이 가능하며, Edge서버쪽에서 처리되기 때문에 Origin측에 부하가 가는 것을 막아 줍니다. return(deliver); // Deliver Subroutine로 Return하여 유저에게 Response하게 합니다. } |
4. 이제 테스트를 해보도록 하겠습니다. 아래 처럼 fiddle에는 Client IP를 Override하는 기능이 있습니다. 해당 리스트에서 차단하고 싶은 국가를 골라서 테스트 해볼수 있습니다. 국가코드에 대해서는 2자리를 사용하셔야 하며, Geo country code 같은 키워드로 검색하시면 쉽게 찾아 볼 수 있습니다.
5. Fiddle을 실행해 보면 아래와 같이 blocked로 처리된 국가에서 엑세스한 IP에 대해서는 403 status code와 함께 에러 관련 html page를 Response하는 것을 확인할 수 있습니다.
위와 같은 방법을 사용하면 간단하게 특정 국가별로 IP를 차단하거나 특정 국가만 허용하도록 설정을 할 수 있습니다. 아래에 직접 실행가능한 code가 Fiddle URL 및 관련 Document URL도 남기오니 참고해주시길 바랍니다. 긴글 끝까지 읽어주셔서 감사합니다.
- Fiddle URL: https://fiddle.fastlydemo.net/fiddle/d8ed7933
- Dictionaries: https://docs.fastly.com/en/guides/working-with-dictionaries-using-the-web-interface
Working with dictionaries using the web interface | Fastly Help Guides
Dictionaries are a type of container that allow you to store data as key-value pairs that can be used in a service without being attached to a single version. Dictionaries are made up of dictionary containers and dictionary items. You use dictionary items
docs.fastly.com
- Geolocation Variables: https://developer.fastly.com/reference/vcl/variables/geolocation/
Geolocation | Fastly Developer Hub
Everything you need to build on Fastly
developer.fastly.com
'Fastly_CDN > CDN_설정' 카테고리의 다른 글
패스틀리(Fastly), Edge Rate Limiting을 설정해 보자 (0) | 2022.07.07 |
---|---|
패스틀리(Fastly), UI에서 국가별 IP(GeoIP)차단 설정 (0) | 2022.05.24 |
패스틀리(Fastly), API로 Purge하기 (0) | 2022.02.25 |
패스틀리(Fastly), TLS 인증서 서비스를 이용해 보자 (0) | 2022.01.31 |
패스틀리(Fastly), Origin Load Balancing 설정 (0) | 2022.01.28 |