NGINX: Cloudflare의 IP 위치 정보 및 "중첩"if 조건

8023 단어 todayilearnedtutorial


Cloudflare가 제공하는 다른 기능 중에서 방문자가 온 국가 값이 포함된 특수 헤더를 추가할 수 있습니다.

우크라이나인으로서 러시아에서 오는 모든 방문객을 금지하고 싶지만:
  • 러시아 IP의 모든 방문자를 다른 웹 도메인 — russki-voenny-korabl-idi-nahuy.com으로 리디렉션
  • 이 동안 요청을 필터링하고 러시아 Yandex 검색 시스템의 요청을 영향을 받지 않은 상태로 두어 러시아 청각에 대한 검색 결과에 내 RTFM 블로그를 계속해서 반환할 것입니다.

  • Cloudflare IP 지리적 위치 및 NGINX



    여기서 가장 간단한 부분은 Cloudflare의 헤더로 필터를 구성하는 것입니다.

    처음에는 CF-IPCountry 헤더를 활성화합니다.

    Cloudflare Dashboard > 네트워크로 이동하여 옵션을 활성화하세요. 기본 요금제에서도 무료입니다.



    그런 다음 NGINX용 가상 호스트 구성의 서버{} 블록에서 proxy_set_header 을 사용하여 `$http_cf_ipcountry:

    ...
    proxy_set_header CF-IPCountry $http_cf_ipcountry;
    ...

    NGINX 및 "중첩"인 경우

    And the second part is more interesting.

    So, we need to check two conditions:

    1. is a visitor from russia
    2. is it a common visitor, or a Yandex search bot?

    In NGINX we can not use really nested conditions with if 예:

    ...
    if ($country_allowed = no) {
    if ($http_user_agent !~* (YandexBot) ) {
    rewrite ^ [https://russki-voenny-korabl-idi-nahuy.com](https://russki-voenny-korabl-idi-nahuy.com) break;
    }
    }
    ...

    But what we can do here, is to use variables and dedicated if .

    점검 해보자.

    VPN을 활성화하고 예를 들어 https://www.iplocation.net 서비스를 사용하여 현재 어디에 있는지 확인합니다.



    GB — 영국.
    nginx.conf에서 access_log에 대한 확장 로그 형식을 활성화하여 자세한 정보를 확인하고 아래에서 추가할 $http_cf_ipcountry 및 새 변수$visitor의 값을 확인할 수 있습니다.

    ...
    log_format main_ext '$time_local client: $remote_addr fwd_for: $http_x_forwarded_for '
    'status: $status user_agent: "$http_user_agent" '
    'server: "$server_name" country: $http_cf_ipcountry visitor: $visitor';
    ...

    Next, create conditions and run tests. After tests will be successful, we will change conditions to region RU and “if not equal” Yandex (see Yandex robots in server logs).

    So:

    1. create a variable called $http_cf_ipcountry 헤더에서 CF-IPCountry;
    2. 첫 번째 ifcondition에서 $http_cf_ipcountry의 값을 확인합니다. 지금은 GB를 확인하고 지역이 == CA인 경우 값 rus를 유지할 변수$visitor를 만듭니다.
    3. 두 번째 if 조건에서 User-Agent 를 확인하고 == Firefox인 경우 $visitor 변수에 다른 값을 추가합니다. - "redirect;
    4. 세 번째if 조건의
    5. $visitor 변수의 값을 확인하고 rusredirect 문자열과 같으면 russki-voenny-korabl-idi-nahuy.com 도메인에 다시 씁니다.

    6. 또한 rewrite_log 매개변수를 on으로 설정하고 error_log를 통지 수준으로 설정하여 재작성이 예상대로 작동하는지 확인할 수 있습니다.

      이것은 테스트 중에 내 구성이 어떻게 보이는지입니다.
      `
      ...
      rewrite_log on;
      access_log /var/log/nginx/rtfm.co.ua-access-ext.log main_ext;
      error_log /var/log/nginx/rtfm.co.ua-error.log notice;
      ...
      proxy_set_header CF-IPCountry $http_cf_ipcountry;
      if ($http_cf_ipcountry = GB) {
          set $visitor rus;
      }
      
      if ($http_user_agent ~* (Firefox) ) {
          set $visitor "${visitor}redirect";
      }
      
      if ($visitor = "rusredirect") {
          rewrite ^ [https://russki-voenny-korabl-idi-nahuy.com](https://russki-voenny-korabl-idi-nahuy.com) break;
      }
      

      ...
      `

      Check the config file and reload nginx :

      root@rtfm-do-production-d10:~# nginx -t
      nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
      nginx: configuration file /etc/nginx/nginx.conf test is successful
      root@rtfm-do-production-d10:~# systemctl reload nginx

      Go to the blog with the Firefox browser:

      access_log:


      root@rtfm-do-production-d10:~# tail -f /var/log/nginx/rtfm.co.ua-access-ext.log | grep GB
      02/Apr/2022:06:22:29 +0000 client: 162.158.91.190 fwd_for: 146.70.46.20,146.70.46.20 status: 302 user_agent: “Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0” server: “rtfm.co.ua” country: GB visitor: rusredirect

      error_log:


      root@rtfm-do-production-d10:~# tail -f /var/log/nginx/rtfm.co.ua-error.log | grep ‘rewritten redirect’
      2022/04/02 06:22:29 [notice] 21018#21018: *33766595 rewritten redirect: “https://russki-voenny-korabl-idi-nahuy.com", client: 162.158.91.190, server: rtfm.co.ua, request: “GET / HTTP/1.1”, host: “rtfm.co.ua”

      Got a visitor from the country: GBuser_agent: "Firefox" , 그리고 redirect: "https://russki-voenny-korabl-idi-nahuy.com" - "작동합니다!"(씨).

      이제 User-Agent에 대해 RU 지역 및 Yandex가 포함된 최종 버전으로 조건을 변경합니다.

    7. 지역 설정: if ($http_cf_ipcountry = RU)
    8. 그리고 ~* (Firefox)를 같지 않은 것으로 변경합니다. 즉, !~* (Yandex) - if ($http_user_agent !~* (Yandex) )`:

    9. ...
          proxy_set_header CF-IPCountry $http_cf_ipcountry;
      
          if ($http_cf_ipcountry = RU) {
              set $visitor rus;
          }
      
          if ($http_user_agent !~* (Yandex) ) {
              set $visitor "${visitor}redirect";
          }
      
          if ($visitor = "rusredirect") {
              rewrite_log on;
              rewrite ^ [https://russki-voenny-korabl-idi-nahuy.com](https://russki-voenny-korabl-idi-nahuy.com) break;
          }
      ...
      


      완료.

      RTFM: Linux, DevOps, and system administration에 원래 게시되었습니다.

    좋은 웹페이지 즐겨찾기