Devin.KR

전환과 정상 복귀 시험

150분 안팎

학습 목표

실습 링크 장애를 주입하여 준비한 대체 경로로 전환하고 새 연결과 기존 연결을 구분합니다.

개념

전환 시험을 서비스 기준으로 끝냅니다

링크를 내리고 경로를 바꾼 뒤 명령이 오류 없이 끝났다고 복구 성공을 선언하기 쉽습니다. 실제 목표는 학생의 새 웹 연결이 성공하고 게스트의 내부 접근 제한이 유지되는 것입니다. 이번 레슨은 주 경로 정상, 링크 장애, 경보, 대체 경로, 정상 복귀 순서로 실행하며 각 단계의 요청과 경로를 파일로 남깁니다. 같은 소켓의 유지 여부는 별도 관측입니다. 경로 변경 명령의 성공과 애플리케이션 응답, 정책 회귀가 서로 다른 확인 대상임을 직접 시험합니다.

시작 코드의 실패가 의미하는 것

network-failover starter는 m08 solution의 주소·VLAN·서비스·정책 파일을 이어받습니다. 추가된 resilience.json의 backup_gateway_suffix가 1이면 대체 경로를 선택해도 기존 라우터로 향합니다. restore가 false이면 정상 복귀 계획이 빠져 있습니다. test_resilience.py는 이 두 결함을 알려주고 나머지 정책·경보 기준도 확인합니다. 문서 테스트의 통과는 실제 패킷 전환의 통과가 아닙니다. 순수 테스트를 먼저 끝낸 뒤 Linux에서 전체 check.sh를 실행하는 순서로 원인 범위를 줄입니다.

실행기가 앞 모듈을 보존합니다

check.sh는 경보와 계획 테스트를 수행한 뒤 m08-check.sh를 호출합니다. 앞 모듈의 정책 허용·차단과 진단 기록을 다시 생성하고 소유 네임스페이스를 정리합니다. 그 실행이 끝난 다음 resilience_run.py가 setup.sh로 기존 학교망을 다시 만들고 r2와 가상 WAN을 추가합니다. m08 서비스는 원래의 제한 시간이 지나 스스로 종료하므로 기다림이 생깁니다. 이 시간을 멈춤으로 오인해 프로세스에 신호를 보내지 않습니다. 실행 전 이름 충돌과 남은 소유 기록을 확인합니다.

정상 대조를 먼저 확보합니다

학생과 교직원의 내부 웹, 교직원 관리 모의 HTTP, 게스트 가상 외부 웹을 실제 요청으로 확인합니다. policy.csv의 forward 차단 행도 제한 시간 실패를 검사합니다. 같은 VLAN 학생 s2의 ping은 성공해야 하며 다른 VLAN 주소를 직접 on-link로 지정한 임시 /32 경로에서는 ARP 전달이 되지 않아 ping이 실패해야 합니다. 임시 경로는 검사 직후 제거합니다. 이 검사는 VLAN의 L2 분리를 좁게 확인하며 같은 VLAN 단말 사이의 보안 격리를 주장하지 않습니다.

장애는 지정한 인터페이스 한 곳입니다

실행기는 bcnet-r1의 v30을 down으로 바꿉니다. brschool과 나머지 VLAN 인터페이스는 유지합니다. 학생 웹의 DNS 답은 남아 있어도 서버 VLAN으로 나가는 TCP와 HTTP는 실패할 수 있습니다. 같은 출발지의 점검 세 행에서 웹 실패가 연속으로 나타나면 alarm.json에 경보 사건과 원자료를 저장합니다. ping과 TCP 실패 횟수를 하나의 사건 수로 더하지 않습니다. 주입 직전 v30 JSON을 저장하여 무엇을 내렸는지 다시 확인할 수 있게 합니다.

수동 전환은 양방향으로 수행합니다

switch 함수는 학생·교직원·게스트 단말의 default를 각 VLAN .2로 교체하고 학교 서버의 세 반환 경로도 10.20.30.2로 교체합니다. route replace는 기존 항목을 변경하거나 없으면 추가하는 명령입니다. 이미 더 구체적인 경로가 있다면 default 교체만으로 그 경로를 덮어쓰지 않으므로 경로 JSON을 함께 확인합니다. 이 실습은 주소표에 예약한 r2 .2를 사용하며 자동 탐지나 선출을 구현하지 않습니다. 사람이 절차를 실행하는 수동 전환 실험입니다.

대체 경로에서 정책을 다시 시험합니다

r2에 설치한 firewall.nft가 같아 보여도 잘못된 인터페이스나 주소 때문에 실제 결과가 다를 수 있습니다. regression은 CSV forward 허용·차단 행을 실제 신규 요청으로 검사합니다. 허용은 정해진 HTTP 본문까지 읽고 차단은 제한 시간 종료를 확인합니다. m08에서 확보한 대조와 함께 해석하며 단순 timeout만으로 새 정책 원인을 확정하지 않습니다. backup-regression.json과 backup-routes.json이 이번 단계의 결과입니다. 학생 웹이 되고 게스트 내부 웹도 된다면 복구 성공이 아니라 정책 회귀입니다.

기존 TCP 소켓을 따로 관찰합니다

persistent_client.py는 게스트에서 WAN HTTP 연결 하나를 열고 정상 본문을 받은 뒤 같은 소켓을 유지합니다. 전환 신호 파일을 읽으면 그 소켓으로 요청을 한 번 더 보냅니다. 새 소켓을 다시 만들지 않으며 success와 오류를 session-after.json에 적습니다. 실행기는 실패나 성공을 예측값으로 바꾸지 않습니다. NAT 상태 공유가 없고 SNAT 출발지가 달라지는 조건에서 새 연결 성공과 기존 연결 유지가 다를 수 있다는 이유를 관측과 연결합니다. 내부 상태 없는 요청도 별도로 보아야 합니다.

되돌아갈 길도 실제로 시험합니다

주 라우터 v30을 up으로 올린 뒤 대체 경로의 성공 표본을 남깁니다. 이는 주 경로 검증이 아니므로 곧바로 복귀 성공이라고 쓰지 않습니다. 양방향 경로를 .1로 시험 이동하고 웹 점검 세 번이 성공하는지 확인합니다. 하나라도 실패하면 .2로 되돌린 뒤 검사 오류를 반환합니다. 사전 시험 통과 후 restored 단계의 허용·차단·VLAN 분리를 다시 실행합니다. 복귀 기준에는 업무 요청과 정책 둘 다 있으며 링크 상태 하나만 정상이어서는 부족합니다.

정리에도 실패 상태가 있습니다

새 서버는 stop 파일이나 최대 수명을 보고 스스로 종료합니다. 실행기는 wait로 종료 상태를 받고 네임스페이스 pids가 비어 있는지 확인합니다. r2와 WAN만 삭제한 뒤 앞 모듈 cleanup.sh로 학교망 소유 기록을 정리합니다. 네임스페이스가 없는 오류나 pids가 남는 오류를 무시하지 않습니다. 호스트 주소·경로 snapshot이 전후 같아야 실습 범위 밖 설정을 바꾸지 않았다는 추가 근거가 됩니다. 다른 작업자의 이름과 파일을 정리 대상으로 삼지 않습니다.

오류를 단계별로 읽습니다

namespace collision은 기존 이름을 삭제하고 덮어쓰라는 뜻이 아닙니다. 이전 실행 소유 기록과 프로세스 종료 상태를 확인합니다. listener readiness timeout은 웹 서버 준비 단계가 실패한 것이므로 아직 링크 전환을 평가하지 않습니다. missing web alarm은 CSV의 TCP·HTTP 상태와 연속 초기화 로직을 읽습니다. expected bounded timeout은 차단 대상이 성공하거나 다른 이유로 실패한 경우입니다. primary preflight failed가 보이면 주 경로 복귀를 보류하고 대체 경로로 돌아간 기록을 확인합니다.

보고서의 결론을 좁힙니다

최종 제출은 monitor.csv, alarm.json, 세 단계의 regression과 routes, session-after.json, summary.json입니다. v30 장애에서 새 연결이 복구됐다는 결론과 r1 전체 장애를 보호하지 못한다는 한계를 함께 씁니다. DNS·DHCP 승계, 독립 전원·스위치, 자동 전환은 시험하지 않았습니다. external 대기이면 실제 성공 문장을 비워두고 실행할 명령과 검사 대상만 남깁니다. 더 읽기의 mtr은 장시간 경로 관측을 보충하며 이번 목표는 동일 조건의 전환·복귀 자료를 비교하여 설명하는 것입니다.

경로 명령 참고: ip-route 매뉴얼에서 replace와 get의 역할을 확인합니다.

따라하기

대체 설정을 완성합니다

network-failover starter의 resilience.json에서 backup_gateway_suffix를 2로, restore를 true로 고칩니다. 순수 검사에서 설정 결함을 먼저 찾습니다.

bash probe-check.sh
python3 test_resilience.py

Linux 격리망에서 주입과 복구를 실행합니다

sudo 권한으로 지정 폴더에서 실행합니다. check.sh가 m08 회귀 후 새 학교망을 구성하고 v30 장애·세 번 경보·양방향 전환·주 경로 사전 시험·복귀를 검사합니다. 서버는 스스로 종료하며 앞 모듈 제한 시간까지 기다릴 수 있습니다.

sudo bash check.sh

신규와 기존 연결의 근거를 비교합니다

evidence/resilience의 alarm·before/backup/restored-regression·routes·session-after·summary JSON을 읽습니다. monitor.csv 시각과 경로 변경 순서를 맞추고 공유 장애 영역, DNS 미승계, NAT 상태 미공유를 보고서에 적습니다. 실제 실행하지 않았다면 external 대기로 제출합니다.

확인 문제

실습

resilience.json의 대체 게이트웨이와 복귀 조건을 고칩니다. bash probe-check.sh와 python3 test_resilience.py를 통과시킨 뒤 Linux VM에서 sudo bash check.sh로 실제 전환을 실행합니다. README의 범위·검사 대상·종료 절차를 읽고 생성한 실제 증거를 제출합니다.

시작 코드·테스트 내려받기

실행 명령

sudo bash check.sh

기대 결과

순수 검사 후 Linux에서 m08 회귀, v30 장애 경보, 신규 연결·정책·VLAN 회귀, 정상 복귀와 기존 소켓 관측. 실제망 external 대기입니다.

모범 답안모범 답안 내려받기

더 읽기

면접 질문

  • 방화벽 정책을 검증하는 실습 방법을 설명합니다.
  • NAT 전후 패킷 주소의 차이를 설명합니다.