728x90
반응형
728x90
반응형
반응형

기업에서 서버팜을 구축하게 되면 어플리케이션 서버 전에 여러 단계의 라우터나 스위치, 로드발랜서 등등이 구축되어 실제 요청한 사람의 ip를 알기 어려워지게 된다.

소스로 말하자면 아래 값이 로컬이 나오거나 내부 장비의 ip가 찍히는 상황이 생기게 된다.

HttpServletRequest request;
request.getRemoteAddr();

 

그리하여 실제로 요청한 사람/장비의 ip를 알기 어려워지는데.. 아래와 같이 설정하면 해결할 수 있다.

 

1. nginx 설정

1-1. nginx map 설정(생략가능)

map은 다음과 같이 $key라는 변수를 받아 $value라는 결과값을 매핑해준다.
아래 코드에서 $key 값이 a라면, $value 값은 1이다.

map $key $value {
  a 1;
  b 2;
  default 0;
}

map 규칙은 위처럼 쓸 수도 있지만, 다른 파일에 분리해 둔 뒤 받아올 수도 있다.
가령 위의 규칙을 map-rule이라는 파일에 아래와 같이 분리하면:

a 1;
b 2;

다음과 같이 파일의 상대 include할 수 있다:

map $key $value {
  include PATH/TO/map-rule; # map-rule 파일의 절대 경로
  default 0;
}

 

위 map을 사용하여 아래처럼 clientip 라는 변수에 값을 담는다.

    map $http_x_forwarded_for $clientip {
        "" $remote_addr;
        default $http_x_forwarded_for;
    }

 

1-2. server.location 세팅

clientip를 아래와 같이 세팅한다. 

  proxy_set_header   X-Forwarded-For  $clientip;

대략적인 큰 그림은 아래와 같다.

 server {
        listen       80;
        server_name  server.abc.com;
        server_tokens off;
        
        ...
        
        location / {
        	//여기부터
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $clientip;
            여기까지//
            proxy_set_header Connection "";
            proxy_http_version 1.1;
            proxy_pass http://localhost:8200;
        }
    }

 

1-3. nginx reload

nginx -s reload

 

2. 소스 변경

애플리케이션에서 X-Forwarded-For 헤더를 사용하도록 아래 두 가지 방법 중 하나를 적용해야 한다.
  1. HttpServletRequestWrapper 를 사용해서 getRemoteAddr 를 상속 -> 별도로 필터 개발 필요
  2. server.tomcat.remoteip.remote-ip-header 프로퍼티 설정

2번 방식이 더 쉽고 빠르다고 생각하여 적용해본다.

적용하기 전에, 버전 별로 키값이 달라지니 스프링 공식 문서는 꼭 확인해보자.

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.webserver.use-behind-a-proxy-server

 

“How-to” Guides

Spring Boot has no mandatory logging dependency, except for the Commons Logging API, which is typically provided by Spring Framework’s spring-jcl module. To use Logback, you need to include it and spring-jcl on the classpath. The recommended way to do th

docs.spring.io

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.server

 

Common Application Properties

 

docs.spring.io

지금 상황에서 연관있는 값은 아래 값인 것 같다. 기본 값은 없다.

# springboot2.2 버전 이상이면
server.tomcat.remoteip.remote-ip-header=X-FORWARDED-FOR

# 구버전
#server.tomcat.remote-ip-header=X-FORWARDED-FOR

경우에 따라서는 아래 값도 조정해야할 수 있다.

server.tomcat.remoteip.internal-proxies

이 값은 신뢰할 내부 프록시를 매칭하는 값이다. 정규식으로 작성해야하며 기본값은 아래와 같다. 일반적으로는 기본값으로도 사용가능하지만 프로덕션 환경에서 내부 프록시 ip들이 해당 범위를 넘어갈 수도 있으니 확인이 필요하다. 참고로 공백으로 설정하면 모든 프록시를 신뢰한다는 뜻으로 프로덕션 환경에서는 이렇게 설정하면 위험할 수 있으니 주의해야 한다.

  • 10/8
  • 192.168/16
  • 169.254/16
  • 127/8
  • 등등(공식 문서 확인 필요)

 

728x90
반응형

'서버 세팅 & tool > nginx' 카테고리의 다른 글

라이브환경 인증서 교체  (0) 2024.01.08
[이슈해결][apache] 304 NOT_MODIFIED  (0) 2023.10.12
[nginx] WAF  (0) 2022.03.30
[nginx] API gateway  (0) 2022.03.14
[nginx] 실전 cors 해결하기  (0) 2022.03.14
반응형
  1. 인증서를 발급받고 FMN에서 통합인증서와 KEY 파일을 다운로드 받는다.
  2. 리눅스 서버로 파일을 업로드한다.
  3. nginx의 conf 파일에 해당 인증서 파일 경로를 변경한다. 혹은 인증서파일 자체를 교체한다.
    1. 경로 변경 시, nginx -t 명령어로 문법에 오류가 있는지 확인한다.
    2. passphrase 없는 인증서를 만들어서 적용; 이 때 서버 권한 확인
    3. sudo openssl rsa -in /nginx/conf/key.pem -out /nginx/conf/key_nopass.pem -passin pass:'passphrase'
  4. nginx -s reload 명령어로 변경한 내용을 적용한다.
  5. 브라우저에서 인증서 정보가 변경되었는지 (발급일, 만료일) 확인한다.

 

reload 하기 전 까지는 파일 이동/변경해도 잡히지 않음

728x90
반응형
반응형

apache 설정 중 virtual-host의 프록시 부분을 수정하였는데 304 NOT_MODIFIED 라는 문구와 함께 화면이 나오지 않았다.

나의 경우는 스웨거 페이지를 열려고 프록시에 아래처럼 /swagger-ui 를 추가한건데 스웨거 페이지가 열리지 않는 것이 아닌가..

  ...  
    ProxyPass /api http://localhost:6003/api
    ProxyPassReverse /api http://localhost:6003/api
    ProxyPass /swagger-ui http://localhost:6003/swagger-ui
    ProxyPassReverse /swagger-ui http://localhost:6003/swagger-ui
...

 

알고보니 스웨거 resource(이미지 등)을 불러오기 위해서 다른 url 호출이 있는데(/v3/api-docs/ 등) 이를 아파치 프록시에 설정하지 않아서 생기는 오류였다.

 

해결: 모든 resource path를 알기 어려워서 /로 bypass하도록 열어두었다(개발용 내부망이라 보안에 위배되지는 않는다. 만약 디테일하게 걸어야하면 관련 path 분석하여 넣어야 함).

728x90
반응형

'서버 세팅 & tool > nginx' 카테고리의 다른 글

[nginx + springboot] x-forwarded-for.. 진짜 client ip를 찾아서  (0) 2024.04.16
라이브환경 인증서 교체  (0) 2024.01.08
[nginx] WAF  (0) 2022.03.30
[nginx] API gateway  (0) 2022.03.14
[nginx] 실전 cors 해결하기  (0) 2022.03.14
반응형

쿠버네티스에 nginx를 깔고 시작한다.

WAF = web application firewall = L7 방화벽(http 트래픽를 filter, monitor, block하는 web service)

nginx 방화벽은 코드레벨에 가까운 방화벽

MSA기반의 아키텍쳐에서는 개발자가 모든 코드를 다 알 수 없음(어디에 위험요소가 있는지 알 수 없음) 그렇기 때문에 더욱 코드 레발단의 방화벽이 필요함.

 

설정: yaml 파일

설정 명령어:

kubectl apply -f aaa.yaml

특징: 

  • 헤더/바디에 어떤 값이 오면 막는 기능 가능
  • data-guard: 데이터 마스킹이나 데이터 중 민감 데이터같은게 있으면 탐지하거나 할 수 있음
  • 로그 설정 가능
  • waf 설정파일에서 정책/로그정책 등 지정가능
  • 지정 시 파일 이름에는 ap- 로 시작하고 yaml 파일 안에서는 ap- 다음 부분부터 작성하면 되는 듯

 

강의에서는 도커에서 시연을 하는데 도커를 잘 몰라 바로 따라가기가 어려웠다.

728x90
반응형

'서버 세팅 & tool > nginx' 카테고리의 다른 글

라이브환경 인증서 교체  (0) 2024.01.08
[이슈해결][apache] 304 NOT_MODIFIED  (0) 2023.10.12
[nginx] API gateway  (0) 2022.03.14
[nginx] 실전 cors 해결하기  (0) 2022.03.14
[nginx] load balancing  (0) 2022.03.11
반응형

 

api gateway란

  • api management tool sits between client and backend
  • reverse proxy
An API gateway is set up in front of the microservices and becomes the entry point for every new request being executed by the app. It simplifies both the client implementations and the microservices app.

 

기능들

  1. TLS termination
    • ssl /tls 1.3 지원
  2. client authentication
    1. auth_jwt 로 키고/켜고 가능
    2. auth_jwt_key_file 로 저장된 키파일(.jwk)불러올 수 있음
    3.  키가 유효하면 프록시 됨
  3. fine-grained access control
    1. jwt_claim_uid -> 토큰 안 uri 값 가져올 수 있음, 가져와서 더 상세한 조건으로 제한 가능
  4. request routing
    • uri별로 어디로 프록시할지 정할 수 있음
    • proxy_pass 와 =,~ 등을 이용한 정규식 사용 가능
  5. rate limiting
    • limit_req_zone
    • 속도 제한 가능(ex. 5r/m = 5requests per a minute); 사실 횟수 제한에 가까움
    • 이를 초과하면 limit_req_status로 설정해둔 status code가 response로 내려감
  6. load balancing

 

 

728x90
반응형

'서버 세팅 & tool > nginx' 카테고리의 다른 글

[이슈해결][apache] 304 NOT_MODIFIED  (0) 2023.10.12
[nginx] WAF  (0) 2022.03.30
[nginx] 실전 cors 해결하기  (0) 2022.03.14
[nginx] load balancing  (0) 2022.03.11
[nginx] reverse proxy  (0) 2022.03.03
반응형

문제: nginx -> springboot2.6.2 swagger로 api요청 시 CORS 문제로 실행 안됨

 

1. spring 설정으로 addCorsMapping 해주어야 함

@Component
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**");
    }
}

 

2. nginx.conf 로 프락시 되는 주소를 localhost -> 해당 도매인으로 수정

#user  nobody;
worker_processes  1;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ';

    server {
        listen       80;
        server_name  alpha.example.com;
        access_log  /home1/test/logs/access_log.log  main;

        location / {
           #proxy_pass http://localhost:8600;
            proxy_pass http://alpha.example.com:8600;
        }
    }
}
728x90
반응형

'서버 세팅 & tool > nginx' 카테고리의 다른 글

[이슈해결][apache] 304 NOT_MODIFIED  (0) 2023.10.12
[nginx] WAF  (0) 2022.03.30
[nginx] API gateway  (0) 2022.03.14
[nginx] load balancing  (0) 2022.03.11
[nginx] reverse proxy  (0) 2022.03.03
반응형

 

로드밸런싱(load balancing)

  • 클라이언트와 백엔드 서비스 사이에 위치
  • 클라이언트로부터 요청을 받고 해당 요청을 수행할 수 있는 서비스나 인스턴스로 요청을 균등하게 전달하는 방법

 

서버의 로드밸런싱을 해주는 로드밸런서는 여러 장비/프로그램이 있을 수 있겠지만, 여기서는 nginx의 로드밸런싱에 대해 다루겠다.

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/

 

HTTP Load Balancing | NGINX Plus

HTTP Load Balancing Load balance HTTP traffic across web or application server groups, with several algorithms and advanced features like slow-start and session persistence. Overview Load balancing across multiple application instances is a commonly used t

docs.nginx.com

  • ip/port/domain 기반한 group/pool/service단위로 로드발랜싱 가능
  • proxy_pass 에 그룹으로 지정
  • http context 안에 든 upstream 에서 설정

 

로드밸런싱 룰

  • 사용자가 정한 방식에 의해 적절한 서버를 선택, 기본값은 라운드 로빈 알고리즘(균등)
  • weight를 따로줘서 가중치를 줄 수 있음. 서버가 받는 요청은 가중치에 비례함.
  • max_conns 최대 연결 서버 조정 가능, 나머지는 큐에
    • 관련하여 queue / timeout 설정 가능
  • 특정횟수만큼 실패하면 빠질 수 있음  max_fails/fail_timeouts

 

로드 밸런싱 알고리즘

주의) 로드밸런싱 알고리즘 중 세션을 보존할 수 있는게 있는데 새 서버를 추가하거나 제거하면 해시 키가 손실될 가능성이 높아서 세션 정보가 무효가 될 가능성이 있음

  1. round robin
  2. hash
    • hash $request_uri 
    • -> /example 이 요청 uri 일 경우 항상 동일한 서버로 
    • 가중치도 같이 줄 수 있음
  3. ip_hash
    • 고객의 ipv4/v6를 기반으로 해시 키 잡음. 동일한 서버로 라우팅함
  4. least_conn
    • 제일 놀고 있는 서버에게 감
  5. least_time
    • 가장 빠른 응답을 하는 서버에게, 헤더의 평균 응답시간 활
  6. 랜덤

 

세션 유지

(curl로하면 쿠키 저장이 안되서 바로 보기가 불가하고 브라우저 테스트 시 확인가능)

  • sticky cookie
    • 최초 요청 시 쿠키 생성하여 헤더에 세팅, 이후 요청에서는 헤더의 쿠키 값을 보고 해당 서버로 보냄
    • 쿠키 만료 시간, 도메인, path 설정 가능
  • sticky route 고정 경로
    • nginx가 서버의 route 변수(쿠키나 uri에서 가져옴)를 확인하여 프록시 할 서버를 식별
  • sticky learn
    • reqeust/response를 검사해서 어디로 프록시할지 결정

 

example .conf

728x90
반응형

'서버 세팅 & tool > nginx' 카테고리의 다른 글

[이슈해결][apache] 304 NOT_MODIFIED  (0) 2023.10.12
[nginx] WAF  (0) 2022.03.30
[nginx] API gateway  (0) 2022.03.14
[nginx] 실전 cors 해결하기  (0) 2022.03.14
[nginx] reverse proxy  (0) 2022.03.03
반응형

 

nginx 구성

#기본 경로
/etc/nginx
#메인 설정
/etc/nginx/nginx.conf
	    include /etc/nginx/conf.d/*.conf;

#설정 값 경로 -> alphabetical order로 설정파일 읽음
/etc/nginx/conf.d

#nginx -T 로 설정값 읽는 순서 파악 가능

 

reverse proxy로서의 역할

  • server side proxy; client와 백엔드 사이에서 연결 중재
  • server블락 안의 proxy_pass 지시문 
  • 연결이 끊어지기 전에 연결을 닫고, 백엔드에 대한 새 연결을 하는데, 도중에 original 정보 손실 가능성 있음
  • 클라이언트 정보(ip, request, etc) 캡처 후 연결 종료
  • 백엔드로 새 연결 시 기존 정보를 헤더(proxy_set_header)에 담아서 전달
  • 웹서버 역할도 하고 애플리케이션을 호스팅도 하면서 프록시역할도 함

 

location / {
    proxy_pass http://127.0.0.1:8080;
}

이것이 기본적인 구문이다. 즉, 현재 서버에 / 로 시작하는 path로 접근하면, http://127.0.0.1:8080 으로 return 한다는 의미이다. 그러면 실제 사용자는 8080 포트에 접근하지 않았지만 8080 포트에 접근한 것과 동일한 효과가 발생한다.

nginx는 클라이언트가 접근한 path를 보고, 가장 적합한 location의 블럭으로 요청을 보내서 처리하게 된다. 주소에 대한 규칙 및 우선순위는 다음과 같다.

  1. = : 정규식이 정확하게 일치
    • location = /admin { . . . }
  2. ^~ : 정규식 앞부분이 일치
    • location ^~ /admin { . . . }
  3. ~ : 정규식 대/소문자 일치
    • location ~ /admin/ { . . . }
  4. ~* : 대/소문자를 구분하지 않고 일치
    • location ~* .(jpg|png|gif)
  5. /  : 하위 일치(prefix match)
    • location /admin { . . . }

 

예시는 아래 링크로 첨부한다.

https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms

 

Understanding Nginx Server and Location Block Selection Algorithms | DigitalOcean

 

www.digitalocean.com


default.conf수정

새로운 로그파일에 해더 찍도록 설정

초기 default.conf

 

수정 default.conf

sudo nginx -s reload

conf파일을 수정한 경우 위 명령어로 반드시 리로드를 해줘야 한다.


참고: 원문 https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

 

NGINX Reverse Proxy | NGINX Plus

NGINX Reverse Proxy Configure NGINX as a reverse proxy for HTTP and other protocols, with support for modifying request headers and fine-tuned buffering of responses. This article describes the basic configuration of a proxy server. You will learn how to p

docs.nginx.com

 

728x90
반응형

'서버 세팅 & tool > nginx' 카테고리의 다른 글

[이슈해결][apache] 304 NOT_MODIFIED  (0) 2023.10.12
[nginx] WAF  (0) 2022.03.30
[nginx] API gateway  (0) 2022.03.14
[nginx] 실전 cors 해결하기  (0) 2022.03.14
[nginx] load balancing  (0) 2022.03.11

+ Recent posts