OpenVPN 서버 nopool: 명시적인 풀 범위를 선언하기
서브넷은 그대로 두고 할당을 직접 맡으십시오. 자동 풀을 억제하고 양 끝을 포함하는 범위를 선언한 뒤 새 클라이언트가 실제로 무엇을 받는지 확인하십시오.
서버 헬퍼는 서브넷을 구성한 다음 자기가 고른 동적 풀로 그것을 채웁니다. 이 기본값은 고정 할당을 위해 예약하든 나중에 쓸 세그먼트를 위해 남겨 두든, 일부 주소를 할당에서 빼야 할 때까지 편리합니다. 자동 풀을 억제하고 범위를 직접 선언하려면 두 줄과, 어떤 주소가 할당 대상이 아닌지에 대한 한 번의 의도적인 결정이 필요합니다. 나머지는 목록화, 적용, 검증, 되돌리기라는 운영 규율입니다.
이것은 가동 중인 서비스에 대한 변경이므로 운영 작업으로 다루어, 먼저 목록화하고 정상적인 수명 주기로 적용하고 새 클라이언트로 검증하고 되돌릴 준비를 해 두십시오.
이미 가진 서브넷에서 시작하십시오
현재 서버 구성과 클라이언트가 실제로 보유한 주소를 읽으십시오. 풀 변경은 그 기준선에 대해서만 의미가 있으며, 관리형 제품이나 구성 생성기가 읽고 있는 파일의 소유자일 수 있으므로 기준선이 항상 파일이 암시하는 것과 같지는 않습니다.
grep -nE '^(topology|server|ifconfig-pool|max-clients|client-config-dir)' /etc/openvpn/server/lab.conf
ip -4 addr show tun0유효한 토폴로지를 확인하십시오. 서브넷 토폴로지에서는 각 클라이언트가 풀에서 주소 하나를 가져가고, 오래된 net30 배치는 클라이언트마다 작은 블록을 할당하므로 계산이 전혀 다릅니다. 서버가 아직 net30이라면 이 페이지는 잘못된 마이그레이션 안내이며 풀 번호는 기대한 의미를 갖지 않습니다. 다른 곳에서 주소 계산을 복사하기 전에 그 줄을 확인하십시오.
서버 자체의 주소, 클라이언트 구성 디렉터리의 모든 고정 할당, 그리고 경로나 접근 규칙이 의존하는 모든 주소를 적어 두십시오. 동적 범위 밖에 남아야 하는 것이 바로 이 주소들입니다. 이것을 먼저 적는 것이 범위를 추측이 아니라 결정으로 만듭니다. 되돌리기에 복원할 구체적인 대상도 제공합니다.
nopool을 추가하고 범위를 선언하십시오
헬퍼 키워드 nopool은 OpenVPN 2.6 설명서가 설명하는 대로 서브넷 구성을 유지하면서 자동 동적 풀을 억제합니다. 이어서 명시적인 ifconfig-pool 줄이 의도한 양 끝 포함 범위를 제공하고, 그 넷마스크는 서브넷과 일치합니다. 서브넷이 없는 풀은 의미가 없으므로 두 줄은 같은 서버 블록에 속합니다. 둘 사이의 순서는 서비스가 시작될 때 헬퍼가 이 쌍을 펼치기 때문에 가독성을 위해서만 중요합니다.
topology subnet
server 10.70.0.0 255.255.255.0 nopool
ifconfig-pool 10.70.0.50 10.70.0.120 255.255.255.0양 끝을 포함하므로 예시는 일흔한 개의 주소를 제공합니다. 서버 주소와 모든 고정 할당을 그 범위 밖에 두어야 하며, 동적 범위 안에 들어간 고정 할당은 연결 순서에 따라 달라지는 충돌을 만들므로 디버깅하기에 가장 나쁜 종류입니다. 고정 할당이 늘어날 가능성이 있다면 예약 집합과 범위 사이에 여유를 두십시오.
범위 크기와 동시성은 별개의 한계입니다. max-clients이 다르게 말한다면 주소 백 개가 동시 클라이언트 백 개를 뜻하지 않으며, 동시성 한계보다 큰 풀은 낭비가 아니라 정상입니다. 중요한 것은 두 한계가 기본값을 물려받는 대신 의도적으로 선택되는 것입니다.
고정 할당을 동적 범위 밖에 두기
클라이언트별 ifconfig-push은 풀 할당과 다른 메커니즘이며 활성 토폴로지에 맞는 매개변수를 사용해야 합니다. 서브넷 모드에서는 주소 하나와 넷마스크이며, 오래된 예시에 나왔다는 이유로 net30 쌍을 그대로 가져오는 것은 흔한 실수입니다.
할당 이력은 단서이지 권위가 아닙니다. persist 파일은 어느 클라이언트가 어느 주소를 가졌는지 기억하므로 다시 연결하는 클라이언트는 보통 같은 주소를 받지만, 그것은 주소를 예약하지도, 해제하지도, 고정 할당을 대체하지도 않습니다. 특정 장치가 항상 특정 주소를 가져야 한다면 persist 파일에 의존하지 말고 고정 할당을 사용하십시오.
다음으로 주소에 의존하는 경로를 확인하십시오. 클라이언트로 밀어 넣는 경로, 서브넷을 허용하는 방화벽 규칙, 특정 호스트를 기대하는 모니터링 검사는 모두 옛 범위를 전제로 할 수 있습니다. 그것들을 읽지 않고 풀을 바꾸면 장애가 무관해 보이는 곳으로 옮겨 갑니다.
수명 주기로 적용한 뒤 검증하기
변경은 직접 파일을 고치고 재시작하든 파일을 다시 생성하는 관리 계층을 쓰든, 서비스가 평소 구성을 받는 방식으로 적용하십시오. 생성된 파일에 대한 수동 편집은 다음 생성까지만 유지됩니다. 다음 운영자가 같은 변경을 어디에 해야 하는지 알 수 있도록 어느 메커니즘이 파일을 소유하는지 기록하십시오. 그런 다음 한 번 재시작하고 클라이언트를 부르기 전에 로그를 읽으십시오.
systemctl restart openvpn-server@lab
journalctl -u openvpn-server@lab -n 30 --no-pager
# on a fresh client
ip -4 addr show tun0이전에 연결한 적이 없는 클라이언트를 연결하고 주소가 선언된 범위 안이면서 예약 집합 밖에 있는지 확인하십시오. 그런 다음 클라이언트가 정책이 허용하는 것에 도달하고 그 이상은 가지 않는지 되돌아오는 경로를 확인하십시오. 계획과 맞지만 동작하는 경로가 없는 주소는 성공한 변경이 아닙니다.
옛 범위의 주소를 보유했던 클라이언트를 다시 연결하십시오. 새 범위의 주소를 받아야 하고, 옛 주소에 묶인 세션 수준 상태는 사라져야 합니다. 옛 주소를 그대로 유지한다면 다른 무언가가 할당하고 있으며, 풀은 당신이 생각하는 소유자가 아닙니다.
범위 변경 되돌리기
변경 기록에 이전 파일만이 아니라 이전 세 줄을 남기십시오. 그것을 복원하고 재시작하면 할당이 옛 동작으로 돌아가고, 그 뒤에 다시 연결하는 클라이언트는 그곳에서 주소를 받습니다.
기록에 두 가지 주의가 들어가야 합니다. 되돌릴 때 이미 연결된 클라이언트는 다시 연결할 때까지 현재 주소를 유지하므로 되돌리기가 전체 함대에서 즉시 이루어지지는 않습니다. 그리고 옛 범위가 고정 할당과 겹쳤다면 복원은 충돌도 함께 복원하며, 그 겹침이 변경의 이유였으므로 되돌리기와는 다른 수정이 필요합니다.
풀 변경은 새 클라이언트가 범위 안의 주소를 받고, 예약된 주소가 결코 나가지 않으며, 그 주소를 소비하는 경로와 규칙이 의도대로 동작할 때 끝납니다. 그보다 못하면 다음 사람이 세 가지 중 무엇이 사실이 아닌지 알아내야 합니다.