사이트는 주소를 나눌까. 새 연결은 왜 첫 줄로 나가는가

여러 사이트는 콘솔 목록의 첫 줄로 이름을 모으고 호스트 이름으로 요청을 나눌 수 있습니다. 포트를 혼자 쓰거나 다른 출발지로 보여야 하는 서비스에는 그 줄을 따로 줍니다. 로컬 주소를 묶지 않은 새 연결은 첫 줄로 나갑니다.

들어오는 연결과 직접 여는 연결을 나누기

한 머신에 사이트를 여러 개 두는 일과 주소를 어떻게 나누는 일은 다릅니다. 이 노트는 두 가지만 다룹니다. 요청이 목록의 어느 줄에 도착하는가. 머신이 직접 연결을 열 때 어느 줄로 나가는가.

콘솔은 주소를 줄로 나눕니다. 첫 줄은 SSH 또는 RDP용입니다. 나머지 각 줄은 하나씩 산 IPv4이고, 서브넷의 빈칸이 아닙니다. 줄을 NIC에 넣고 재부팅 뒤에도 남기는 방법은 추가 IPv4를 NIC에 넣기를 따른 다음 사이트에 나눕니다.

들어오는 쪽은 DNS와 수신 주소입니다. 클라이언트는 A 레코드가 가리키는 줄로 접속합니다. 첫 줄만 듣는 프로그램은 다른 줄의 같은 포트에 답하지 않습니다.

나가는 쪽은 그 연결을 누가 열었는가입니다. 누군가 특정 줄로 접속한 뒤, 그 세션의 응답은 그 줄로 돌아갑니다. 머신이 직접 여는 연결, 예를 들어 업데이트, API 호출, 보내는 메일은 프로그램이 로컬 주소를 지정하지 않으면 기본 경로를 가진 첫 줄이 출발지입니다.

추가 주소에서 사이트가 열리는 것은 들어온 통신과 그 세션의 응답이 그 줄을 썼다는 뜻입니다. 업데이트나 보내는 메일까지 그 줄로 옮겼다는 뜻은 아닙니다.

여러 사이트가 첫 줄을 같이 쓰기

사이트가 모두 80과 443의 웹사이트이고 호스트 이름만으로 나눌 수 있으면 전부 첫 줄을 가리킵니다. 도메인이 늘 때마다 주소를 더 사지 않습니다.

이름마다 A 레코드 하나를 만들고 값은 모두 첫 줄입니다. 웹 서비스는 0.0.0.0의 443, 또는 첫 줄의 443만 듣습니다. 호스트 이름으로 사이트 디렉터리와 인증서를 고릅니다. 인증서는 이름을 따르고 주소 줄 수를 따르지 않습니다. 한 줄을 같이 쓰면 SNI가 같은 포트에서 인증서를 나눕니다.

server {
    listen 443 ssl;
    server_name a.example;
}
server {
    listen 443 ssl;
    server_name b.example;
}

두 블록 모두 주소를 고정하지 않았으므로 이 NIC의 모든 주소에서 듣고 server_name으로 나눕니다. listen 203.0.113.10:443 ssl로 바꾸면 첫 줄의 443만 들어옵니다. 추가 주소의 443은 이 블록에 들어오지 않습니다.

IIS는 호스트 헤더로 같은 나눔을 합니다. IP는 첫 줄 또는 할당되지 않은 모두로 두고, 호스트 이름에 각 도메인을 넣으며 포트는 443입니다. 사이트를 더하는 일은 바인딩과 A 레코드를 더하는 일이고, 주소 줄을 더하는 일이 아닙니다.

같은 줄의 같은 포트를 두 프로그램이 동시에 혼자 쓸 수는 없습니다. 두 번째 바인딩은 실패합니다. 그 포트를 혼자 써야 하면 다음 절처럼 하나를 다른 줄로 옮깁니다.

사이트 하나가 줄 하나를 쓰기

아래 경우에는 줄로 나눕니다. 기준은 포트와 출발지 주소이고, 사이트 개수 자체가 아닙니다.

두 프로세스가 같은 포트를 필요로 하고 호스트 이름으로 나눌 수 없을 때입니다. 둘 다 25번, 또는 같은 사용자 포트를 혼자 듣는 경우가 흔합니다. 한 줄의 그 포트에는 수신이 하나뿐입니다. 두 번째는 다음 줄에 둡니다.

어떤 서비스의 A 레코드가 다른 사이트와 다른 자기 주소여야 하면, 그 이름을 목록의 다른 줄로 향하게 합니다. 프로세스는 그 줄을 듣거나, 0.0.0.0을 들어 그 줄을 포함합니다.

보내는 메일, 콜백, API 호출이 첫 줄이 아니라 특정 줄로 보여야 하면, 그 줄은 이미 NIC에 있고 프로그램이 로컬 주소를 그 줄에 묶습니다. A 레코드만 바꿔도 프로그램이 직접 여는 연결의 출발지는 바뀌지 않습니다.

server {
    listen 203.0.113.10:443 ssl;
    server_name a.example;
}
server {
    listen 203.0.113.21:443 ssl;
    server_name b.example;
}

203.0.113.10과 203.0.113.21은 문서용입니다. 목록의 두 줄로 바꿉니다. 첫 블록은 첫 줄만, 둘째는 추가 줄만 받습니다. 두 줄 모두 NIC에서 /32여야 합니다. b.example의 A 레코드는 203.0.113.21이고 첫 줄로 두지 않습니다.

0.0.0.0을 듣는 프로그램은 나중에 넣은 줄에도 응답합니다. 사이트가 한 줄에만 보여야 하면 listen에 그 줄을 쓰고 0.0.0.0은 남기지 않습니다. 반대로 첫 줄만 듣는 프로그램은 나중에 넣은 줄에 응답하지 않습니다.

주소를 가상 머신에 넘길 때는 그 줄이 게스트 NIC에만 있습니다. 호스트 브리지나 물리 포트에 같은 줄을 다시 쓰지 않습니다. 사이트가 호스트에서 돌면, 첫 주소가 이미 있는 인터페이스에 줄을 둡니다.

이 표로 구매 개수를 정하기

포함된 첫 줄은 나눌 수 있는 주소 하나로 셉니다. 그 밖에 혼자 차지할 주소가 하나 늘 때마다 추가 IPv4를 하나 삽니다. 첫 줄을 같이 쓰는 이름은 개수를 늘리지 않습니다.

해야 하는 일주소를 두는 곳추가 구매
여러 웹사이트가 80/443이고 이름으로 나눔A 레코드는 모두 첫 줄0
웹사이트 4개가 각자 A 레코드와 각자 줄을 가짐첫 줄은 하나에게, 나머지는 한 줄씩3
웹사이트는 첫 줄을 같이 쓰고, 다른 서비스 2개가 독립 주소가 필요함웹사이트는 첫 줄, 서비스는 한 줄씩2
같은 포트의 프로세스 둘을 이름으로 나눌 수 없음각자 다른 줄에서 수신최소 1

같이 쓸 수 있는 웹사이트 4개면 추가는 0입니다. 각각 한 줄이 필요한 4개면 추가는 3입니다. 포함된 1개와 합쳐 목록은 4줄입니다. 사이트가 네 개니까 /29를 산다는 식으로 사지 않습니다. /29는 주소 8개 블록의 표기입니다. 여기서는 블록으로 팔지 않고, 설정할 네트워크 주소나 브로드캐스트도 없습니다.

추가 주소는 개당 월 $1.6, 추가는 최대 255개, 포함된 1개와 합쳐 256개까지입니다. 추가 5개는 월 $8.0입니다. 월 임대료에 넣은 뒤 기간의 개월 수를 곱합니다. 월은 1, 분기는 3, 반년은 6, 연은 12입니다. 어느 기간도 할인하지 않습니다.

128GB는 월 $454.8, 256GB는 월 $612.7입니다. 메모리는 DDR4-3200 ECC RDIMM이고 주문 뒤에 더할 수 없습니다. 프로세서는 AMD EPYC 7543P, 32코어 64스레드, 2.8에서 3.7 GHz입니다. 기본은 1TB NVMe 두 개, 각각 직결, 하드웨어 RAID는 없고 쓸 수 있는 용량은 합쳐서 약 2TB입니다. 대역은 250 Mbps부터이고 트래픽 한도가 없습니다. 1 Gbps는 월 $245.0, 2 Gbps는 월 $742.7입니다. 설치비는 없습니다. 머신은 일본 도쿄에 있습니다. Linux는 SSH, Windows는 RDP이며 둘 다 첫 줄만 적습니다.

구성 페이지에는 이 표의 개수를 넣습니다. 0은 같이 쓰는 사이트가 모두 포함된 줄을 쓴다는 뜻입니다. 사이트 디렉터리만 늘고 포트와 출발지 주소는 그대로면 추가 개수를 올리지 않습니다.

새 연결은 첫 줄로 나감

기본 경로는 설치 때 첫 줄과 함께 쓰입니다. 나중에 /32로 넣은 주소는 Linux에서 같은 인터페이스의 secondary입니다. 프로그램이 소켓을 만들고 로컬 주소를 고르지 않으면 커널은 기본 경로를 따라 출발지를 고릅니다. 그 출발지는 기본 주소, 곧 첫 줄입니다.

머신에서 경로를 물어봅니다. 상대에게 실제로 접속할 필요는 없습니다. 192.0.2.1은 바깥으로 가는 기본 경로와 그때의 출발지 줄을 시스템이 보여 주게 할 뿐입니다.

ip route get 192.0.2.1

출력의 src는 목록의 첫 줄이어야 합니다. via는 원래 게이트웨이입니다. src가 나중에 넣은 줄이 되었다면 기본 경로가 바뀌었거나, 첫 줄이 이 인터페이스의 기본 주소가 아닙니다. 기본 경로를 설치 때로 되돌리고 추가 주소는 /32로 인터페이스에 둡니다.

이미 열린 들어오는 세션은 이 규칙 밖입니다. 203.0.113.21로 접속한 클라이언트의 소켓은 로컬 주소가 203.0.113.21이고 응답의 출발지도 그것입니다. 브라우저로 추가 주소의 사이트를 열면 보이는 것은 그 줄입니다. 동시에 apt, 예약된 작업, 주소를 묶지 않은 HTTP 클라이언트의 src는 첫 줄입니다.

특정 프로그램의 새 연결을 추가 줄로 내보내려면 그 프로그램 안에서 로컬 주소를 묶습니다. 메일, 리버스 프록시, API 클라이언트에는 bind나 interface가 있는 경우가 많습니다. 목록의 줄을 거기에 적습니다. 다음 명령은 확인만 합니다. 출발지가 이미 추가 줄이라고 가정하고 기본 게이트웨이에 아직 닿는지 봅니다. 시스템 기본값을 바꾸지 않고, 프로그램 안의 바인딩을 대신하지도 않습니다.

ip route get 192.0.2.1 from 203.0.113.21

from 뒤를 확인할 줄로 바꿉니다. 이때 src는 그 줄입니다. from을 쓰지 않으면 src는 첫 줄입니다.

정책 라우팅이 다루는 것은 출발지가 이미 추가 줄인 패킷입니다. 프로그램이 그 줄을 묶지 않으면 규칙은 맞지 않고, 새 연결은 계속 첫 줄로 나갑니다. 묶은 뒤에 출구 게이트웨이가 다르면 그 출발지를 별도 테이블로 보냅니다. 게이트웨이와 장치는 ip route show default에서 베낍니다. 메인 테이블의 기본 경로는 그대로 둡니다.

ip rule add from 203.0.113.21 table 121
ip route add default via 203.0.113.1 dev eno1 src 203.0.113.21 table 121

table 121은 출발지가 이미 203.0.113.21인 패킷만 맞습니다. 다른 프로그램은 메인 테이블에 남아 첫 줄로 나갑니다. 이 두 줄도 부팅 설정에 적습니다. 적지 않으면 재부팅 뒤 규칙이 사라지고, 추가 줄을 묶은 프로그램은 그때의 출구를 잃습니다. 메인 기본 경로의 src를 추가 주소로 바꾸면 업데이트를 포함한 머신 전체의 새 연결 출발지가 바뀝니다. 그 변경은 하지 않습니다.

Windows에서도 호스트 하나 마스크로 넣고 SkipAsSource가 true인 추가 주소는 새 연결을 첫 줄로 내보냅니다. 어떤 프로그램이 그 줄에서 시작해야 하면 프로그램에서 로컬 주소를 지정하거나, 그 주소의 SkipAsSource를 false로 둔 뒤 src를 확인합니다. 어댑터에 두 번째 기본 게이트웨이는 넣지 않습니다.

메일, DNS, 인증서는 따로 확인

메일은 두 경로가 섞이기 쉽습니다. MX나 메일 이름의 A 레코드는 추가 줄을 가리킬 수 있고, 수신 프로세스도 거기서 들으면 들어오는 메일은 그 줄에 닿습니다. 머신이 직접 여는 새 발송은 메일 프로그램이 로컬 주소를 묶지 않았으면, 상대가 보는 출발지가 첫 줄입니다.

SPF에 적는 주소는 상대가 실제로 보는 출발지와 같아야 합니다. 수신은 추가 줄, 발신은 첫 줄이면 SPF에는 첫 줄을 적습니다. 발신이 이미 추가 줄에 묶여 있으면 SPF에는 그 줄을 적습니다. /29 전체를 공개하지 않습니다.

확인은 이 순서입니다.

  1. 01 줄 수는 1에 추가 구매 수를 더한 값입니다. 재부팅 뒤에도 각 줄이 NIC에 있습니다.
  2. 02 각 이름의 A 레코드는 도착해야 할 줄을 가리킵니다. 같이 쓰는 이름은 모두 첫 줄입니다.
  3. 03 수신 주소가 그 A 레코드를 덮습니다. 첫 줄만 듣는 프로그램은 다른 줄에 답하지 않습니다.
  4. 04 밖에서 그 이름의 서비스 포트를 열어 예상한 줄에 도착하는지 확인합니다.
  5. 05 머신에서 ip route get 192.0.2.1을 실행해, 묶지 않은 새 연결의 src가 첫 줄인지 확인합니다. 다른 출발지가 필요한 프로그램은 스스로 그 줄을 묶습니다.
  6. 06 SSH 또는 RDP는 첫 줄을 그대로 씁니다. 관리를 추가 주소만 듣게 바꾸면 콘솔의 접속 명령과 맞지 않습니다.

인증서는 호스트 이름을 따릅니다. 한 줄을 같이 쓰면 SNI가 한 포트에서 인증서를 고릅니다. 줄을 나누면 수신 주소는 다르지만 인증서는 방문 때 쓴 이름으로 고릅니다. 주소를 옮겨도 이름이 주소 자체인 인증서는 필요 없습니다.

방화벽이 여는 것은 포트입니다. 주소가 NIC에 있고 A 레코드가 거기를 가리켜도 포트가 닫혀 있으면 시간 초과됩니다. 여섯 단계를 끝낸 다음 방화벽을 봅니다. 여섯 단계가 맞으면 사이트는 이름으로 첫 줄을 같이 쓰거나 목록의 줄을 하나씩 쓰고, 묶지 않은 나가는 통신은 첫 줄로 나갑니다.

나누는 방식을 정한 뒤 개수를 사기

월 $454.8부터