네트워크

Alteon 알테온 로드밸런서 L7 기능 사용해서 URL 별 라우팅

백봉 2025. 9. 23. 13:32

 

https://mrbb.tistory.com/94

 

Alteon 5208 SSL 인증서 등록하기

Alteon 5208 SSL 인증서 등록 가이드개요Alteon 5208 로드밸런서에서 SSL 오프로딩을 구현하기 위한 필수 단계인 SSL 인증서 등록 과정을 상세히 안내합니다. 이 가이드는 웹 GUI를 통한 인증서 등록부터

mrbb.tistory.com

이전 포스트에서 Alteon 5208 장치로 SSL인증서를 등록했다. 

이렇게 하면 Alteon 장치까지는 SSL 로 작동하고 HW offload후에 서버로는 http로 가게 되어있었다. 

 

별도 L7 기능을 사용하지 않았으므로 모든 트래픽이 서버 클러스터로 향하여 관리상 불편함이 발생했다. 

 

문제점 인식.

문제1. rancher 클러스터에서는 end to end에 ssl 이 적용되어야 하는데 중간에 http로 빠지니 무한 루프가 발생하여 호스트파일 수정으로만 접근이 됐다. 

문제2. 클러스터 외부에 둬야하는 간단한 파일서버, 레지스트리 등도 접속하려면 호스트파일을 변경해서 접속해야만 했다. 

 

먼저 트래픽을 URL 에 따라 나눠주기위해 리버스 프록시를 클러스터 내부에 두려고 했다. 그러나 .SSL 인증서 관리 주체가 클러스터, 리버스 프록시 등으로 나뉘며 설정이 복잡해지고 자꾸 안됐다. 또한 로드밸런싱이 필요없는 트래픽도 로드밸런싱이 되어 커넥션이 자꾸 유실되는 문제가 있었다.

 

해결방안

이를 해결하기 위해선 클러스터 외부에서 L7 분배를 해야 했다. 그러나 또 문제는 한 서버를 집어서 트래픽을 분배하면 고가용성 적용이 되지 않는다. 클러스터 노드가 일부 죽은경우 그 노드를 제외하고 트래픽을 분해배줘야한다. 그래서 로드밸런서에서 L7을 처리하는것이 가장 적절하다고 판단했다. 라우터는 L7기능을 지원하기에 기능적으로 적합하지 않다. 

 

 

설정은 Alteon Web GUI 로 진행한다. 

분배할 리얼서버와, 리얼서버그룹은 준비되어있는것으로 가정

 

설정 개요

1. 로드밸런서-백엔드 간 통신에도 SSL 적용. 

2. 클러스터 외부로 따로 뺄 URL 지정. 

3. 분배 대상에서의 별도 처리

 

1. 백엔드 통신에 SSL 적용

가상서비스-SSL-SSL정책-백엔드SSL

 - 백엔드 SSL 암호: 활성화

 - 백엔드 SSL 암호: Main

 - Include SNI: Enable

 - 사용할 인증서 선택

 - 그 외 기본 설정 적용

1. 백엔드 통신에 SSL 적용 (SSL Re-encryption)

Alteon GUI에서 **가상서비스(Virtual Service)**에 대한 설정을 마친 후, 백엔드 서버로 SSL을 다시 암호화하여 통신하는 설정입니다. 이 기능을 통해 클라이언트와 Alteon, 그리고 Alteon과 백엔드 서버 간의 종단간(End-to-End) SSL을 구현할 수 있습니다.

  1. 메뉴 이동: Configuration -> Virtual Services -> SSL 탭으로 이동합니다.
  2. SSL 정책 선택: SSL Policy 드롭다운 메뉴에서 백엔드 통신에 적용할 SSL 정책을 선택하거나, 새로 생성합니다.
  3. 백엔드 SSL 설정 활성화:
    • Backend SSL 항목을 **Enable**로 설정합니다.
    • Backend SSL Cipher 항목에서 **Main**을 선택하여 기본 암호화 스위트를 사용하도록 지정합니다.
  4. SNI 포함 설정:
    • Include SNI를 **Enable**로 설정합니다. 이 설정을 통해 Alteon이 클라이언트로부터 받은 SNI(Server Name Indication) 정보를 백엔드 서버로 그대로 전달합니다. 백엔드 서버에서 하나의 IP로 여러 SSL 도메인을 호스팅할 때 필수적인 설정입니다.
  5. 인증서 선택:
    • Server Certificate에서 이 가상서비스에 사용할 SSL 인증서를 선택합니다.

 

2. URL 지정

가상서비스-콘텐츠 기반 규칙

 + 규칙 ID / 규칙 이름 설정

콘텐츠 클래스 +

 - 콘텐츠 클래스 ID 지정

 - url 호스트명 지정(여러개 지정 가능), 

 - url 경로 포함 기타 사항은 입력하지 않는다. (url경로를 /*으로 했을 때 정상작동하지 않음)

생성한 콘텐츠 클래스 지정

액션: 그룹

그룹 ID 설정(리얼서버 한개로 그룹을 만들어도 지정 가능함, 리얼서버에 서비스포트 지정)

=> 로드밸런싱이 필요없는경우 Nginx Proxy Manager로 편하게 관리하기위해 NPM 서버를 지정함

=> 고가용성을 위해 클러스터의 특정 노트 아이피를 지정하지 않고 로드밸런싱이 필요한경우 가상 서비스 내에서 컨텐츠 기반 규칙을 추가 설정(대상이 다르기 떄문) => 이마저도 기존 리얼서버그룹과 동일하다면 설정 필요 없음.

2. URL 기반 트래픽 분배 (Content Based Rules)

단일 **가상서비스(Virtual Service)**에서 URL의 호스트명(Host name)을 기준으로 트래픽을 분리하여 다른 백엔드 서버 그룹으로 전달하는 설정입니다.

  1. 메뉴 이동: Configuration -> Virtual Services -> Content Based Rules 탭으로 이동합니다.
  2. 새 규칙(Rule) 추가: Add New Rule을 클릭하여 새로운 규칙을 생성합니다.
  3. 규칙 설정:
    • Rule ID와 Rule Name을 지정합니다.
    • Action 항목에서 **Group**을 선택합니다.
    • Group ID 항목에서 트래픽을 보낼 **리얼 서버 그룹(Real Server Group)**을 선택합니다.
  4. 콘텐츠 클래스(Content Class) 생성 및 연결:
    • 콘텐츠 클래스는 트래픽을 분류하는 기준(URL, 호스트 등)을 정의하는 객체입니다.
    • Configuration -> Content -> Content Class 메뉴로 이동하여 새로운 클래스를 생성합니다.
    • Class ID와 Class Name을 지정합니다.
    • HTTP 탭에서 Host Name 항목에 분리하고자 하는 URL 호스트명을 입력합니다(예: sub.domain.com).
    • Content Based Rules 탭으로 다시 돌아와 생성한 콘텐츠 클래스를 규칙에 연결합니다.
    • 주의: 제공해주신 내용처럼 URL Path를 /*로 설정하는 경우 의도치 않은 문제가 발생할 수 있으므로, 호스트명 기반 분리가 더 안정적입니다.

 

3. NPM 설정

- 소스, 목적지:포트 ACCESS설정 후 완료

 

4. 클러스터 설정

- 기존 호스팅 파일 수정으로 잘 접속이 되는것을 가정, 별도 설정 필요 없음.

 

 

 

설정 후 발생한 문제

rancher.abc.com 으로 랜처에 접근하는데 클러스터 모든 노드를 통해 접근할 수 있도록 했는데 외부접속이 가능해졌다. 로드밸런서에서 컨텐츠 기반 규칙을 적용하며 동시에 소스 ip를 가지고 제한을 하는 방법을 찾아봤는데 이 두 개 필터가 각각 다른 메뉴에 있어 동시에 적용하는 방법을 찾지 못했다. 모든 노드를 통해서 접근하는것보다 외부접근을 제어하는것이 더 중요하다고 판단하여 외부 접근제어가 필요한 url은 NPM 서버로 배정한뒤 NPM 에서 접근제어 하도록 했다. 

 

 

---
config:
  layout: dagre
---
flowchart TD
 subgraph subGraph0["External Traffic"]
        KT["KT Traffic"]
        LG["LG Traffic"]
  end
 subgraph subGraph1["Virtual Servers (VIPs)"]
        box_traffic["VIP 10.10.10.90:9241"]
        fw_traffic["VIP 10.10.10.90:9219"]
        https_traffic["VIP 10.10.10.100:443<br>Content-based"]
  end
 subgraph subGraph2["Real Server Groups"]
        k8s_box_group["k8s-box Group"]
        k8s_fw_group["k8s-fw Group"]
        k8s_all_group["k8s-all Group"]
        db_server_group["db-alone Group"]
  end
 subgraph subGraph3["Load Balancer"]
        subGraph1
        subGraph2
  end
 subgraph subGraph4["Kubernetes Cluster Nodes"]
        k8s_nodes["10.10.10.202-205, 212, 214"]
  end
 subgraph subGraph5["DB server"]
        db_server["DB-server"]
  end
 subgraph subGraph6["real servers"]
        subGraph4
        subGraph5
  end
 subgraph subGraph7["Internal Network"]
        OPNsense[("OPNsense Firewall<br>10.10.10.1")]
        Alteon[("Alteon 5208<br>10.10.10.10")]
        subGraph3
        subGraph6
  end
    KT -- Port 9219, 9241, 443 --> Mikrotik[("Mikrotik RB5009")]
    LG -- Port 9219, 9241, 443 --> Mikrotik
    Mikrotik --> OPNsense
    OPNsense --> Alteon
    Alteon -- Port 9241 --> box_traffic
    Alteon -- Port 9219 --> fw_traffic
    Alteon -- Port 443 --> https_traffic
    box_traffic -- Redirect --> k8s_box_group
    fw_traffic -- Redirect --> k8s_fw_group
    https_traffic -- "Redirect<br>서비스 url<br>*.abc.co.kr" --> k8s_all_group
    https_traffic -- "접근제어<br>registry.abc.co.kr<br>fw.abc.co.kr<br>rancher.abc.co.kr" --> db_server_group
    k8s_box_group --> k8s_nodes
    k8s_fw_group --> k8s_nodes
    k8s_all_group --> k8s_nodes
    db_server_group --> db_server