Skip to content
isdnetworks
Go back

노드가 밖에서 안으로가 아니라 안에서 밖으로 붙었다

노드를 새 자리에 세우면서 붙는 방식을 정해야 했다. 방향을 잘못 잡으면 나중에 못 바꾼다.

Table of contents

Open Table of contents

선택지 — 두 방향

가능한 방향은 둘이었다.

안 → 밖   우리 서버가 노드에 붙는다
밖 → 안   노드가 우리 서버에 붙는다

처음에는 안 → 밖 으로 생각했고 우리가 물어보고 답을 받는 구조가 자연스러웠다.

그런데 노드가 있을 자리를 보니 밖에서 못 들어가는 망이었다. 아웃바운드만 되는 자리라서 안 → 밖 은 애초에 성립하지 않았다.

결과 — 방향이 정해지니 나머지가 따라왔다

노드가 밖으로 붙는 방식으로 정하니 여러 가지가 함께 달라졌다.

안 → 밖 이었으면
  노드 쪽에 포트를 열어야 한다
  우리 주소를 노드 쪽 방화벽에 등록
  노드가 서버 인증서를 가진다

밖 → 안 이 되니
  우리 쪽에 포트를 연다
  노드 주소를 우리 쪽에 등록
  우리가 서버 인증서를 가지고 노드가 클라이언트 인증서를 가진다

서버 인증서와 클라이언트 인증서를 누가 갖는지가 통째로 뒤집혔다.

방향을 정하고 나서 발급을 신청해야 순서가 맞는다. 이 선택을 나중에 뒤집으려면 인증서 체계부터 다시 만들어야 하고 이미 붙어 있는 노드가 여럿이면 그 작업이 사실상 불가능해진다.

판단 기준 — 노드를 알아보는 방법

노드가 붙어 오면 어느 노드인지 알아야 했다.

방법 1   주소로 구분한다
방법 2   붙을 때 식별자와 비밀값을 보낸다
방법 3   클라이언트 인증서로 구분한다

노드 IP 가 고정이 아니어서 방법 1 은 못 쓰고 방법 2 는 비밀값이 새면 흉내낼 수 있었다.

방법 3 으로 정하고 노드마다 인증서를 따로 발급했다.

CN=node-a.internal
CN=node-b.internal
ssl_client_certificate /etc/ssl/ca.crt;
ssl_verify_client on;
proxy_set_header X-Node-Id $ssl_client_s_dn_cn;

ssl_verify_client 를 켜고 CN 값을 X-Node-Id 로 넘겨 뒤쪽에서 누구인지 알게 했다.

ca.crt 로 검증되는 인증서가 없으면 붙지도 못한다. 값이 새는 것과 달리 인증서는 회수할 수 있다는 점이 두 방식을 가르는 실질적 차이였다.

조치 — 회수할 수 있게 만들었다

노드 하나를 못 쓰게 해야 할 때를 대비했다.

ssl_crl /etc/ssl/revoked.crl;

revoked.crl 에 들어간 인증서는 못 붙는다.

CRL 회수 절차도 함께 적었는데 급할 때 찾아보면 늦는다.

1. 인증서 일련번호를 확인한다
2. 회수 목록에 추가한다
3. 앞단을 다시 읽힌다
4. 실제로 못 붙는지 확인한다

마지막 확인 단계를 넣은 것은 revoked.crl 에 넣고도 nginx 가 다시 안 읽으면 계속 붙기 때문이다.

절차만 적어 두고 확인하지 않으면 정작 필요할 때 안 되는 경우가 있다. 회수가 언제부터 유효한지까지 적어 둬야 그 자리에서 판단이 된다.

검증 — 붙어 있는 것 보기

노드가 붙어 오는 구조라 지금 몇 개가 붙어 있는지 우리 쪽에서 알아야 했다.

$this->redis->setex("node:alive:{$nodeId}", 90, time());

노드가 30초마다 신호를 보내고 setex 로 90초 동안 살아 있는 것으로 본다.

$alive = $this->redis->keys('node:alive:*');

node:alive:* 를 등록된 목록과 비교해 빠진 것을 알렸다.

등록된 노드 6개, 살아 있는 노드 5개  ← node-c 없음

끊겼을 때 다시 붙는 것도 노드가 한다.

끊김 감지 → 5초 뒤 재시도 → 실패하면 10초 → 20초 → 최대 60초

우리 쪽에서는 아무것도 못 하고 node-c 처럼 안 붙는 것이 생기면 그 자리에 사람이 가야 한다.

그래서 노드 쪽 재시도를 튼튼하게 넣고 오래 못 붙으면 스스로 기록을 남기게 했다. 양쪽 다 되게 만들 수도 있었지만 인증 구조가 두 벌이 되고 어느 쪽으로 붙었는지에 따라 다르게 다뤄야 해서 한 방향으로만 두고 그 이유를 적어 뒀다.

정리


Share this post on:

Previous Post
전환 전에 확인할 셋
Next Post
채널마다 매핑이 다르다