콘텐츠로 이동

nftables Gateway Egress 자동 로드 가이드

Gateway 서버의 nftables egress 정책을
시스템 부팅 시 자동으로 로드하는 방법을 정의함.

본 서버는 firewalldnftables역할 분리 방식으로 병행 운용함.

  • firewalld → 인바운드 정책 관리
  • nftables → 내부망 egress 정책 관리

따라서 nftables.service 로 전체 ruleset 을 일괄 관리하지 않고,
Gateway 전용 egress rule 파일만 systemd 서비스로 명시적으로 로드하는 방식을 사용함.


1. 목적

서버 재부팅 이후에도
/etc/nftables/gateway-egress.nft 정책이 자동 적용되도록 함.

즉 다음을 보장함.

  • 부팅 후 수동으로 nft -f 를 다시 실행하지 않아도 됨
  • firewalld 와 역할이 충돌하지 않음
  • Gateway 전용 egress 정책만 독립적으로 로드 가능함
  • 재적용, 점검, 롤백이 명확함

2. 전제 조건

다음이 이미 완료된 상태를 전제로 함.

  • firewalld 설치 및 활성화 완료
  • /etc/nftables/gateway-egress.nft 작성 완료
  • sudo nft -c -f /etc/nftables/gateway-egress.nft 문법 검증 완료
  • sudo nft -f /etc/nftables/gateway-egress.nft 수동 적용 및 테스트 완료

관련 문서:


3. 운영 원칙

Gateway 서버에서는 다음 원칙을 사용함.

  • firewalld.service 는 활성화 유지
  • nftables.service 는 사용하지 않음
  • Gateway 전용 nftables rule 은 별도 파일로 관리함
  • systemd oneshot service 로 해당 rule 파일만 로드함
  • rule 수정 후에는 반드시 문법 검증 후 재시작함
  • allowlist 는 활성 Nginx proxy_pass 대상 기준으로만 유지함

본 방식은 firewalld 와 nftables 전체 서비스 간 충돌 가능성을 줄이고,
Gateway egress 정책만 독립적으로 관리하기 위한 운영 방식임. 운영 난이도가 높은 고급(Advanced) 패턴이므로
표준 환경에서는 firewalld 단독 또는 nftables 단독 운용이 일반적으로 더 단순함.


4. rule 파일 위치

자동 로드 대상 파일:

/etc/nftables/gateway-egress.nft

파일 존재 확인:

ls -l /etc/nftables/gateway-egress.nft

문법 검증:

sudo nft -c -f /etc/nftables/gateway-egress.nft

정상일 경우 오류 메시지 없이 종료됨.


5. systemd 서비스 파일 생성

서비스 파일 생성:

sudo vi /etc/systemd/system/nftables-gateway-egress.service

내용:

[Unit]
Description=Load nftables Gateway Egress Rules
After=network-online.target firewalld.service
Wants=network-online.target
Requires=firewalld.service

[Service]
Type=oneshot
ExecStartPre=/usr/sbin/nft -c -f /etc/nftables/gateway-egress.nft
ExecStartPre=-/usr/sbin/nft delete table inet gateway_egress
ExecStart=/usr/sbin/nft -f /etc/nftables/gateway-egress.nft
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

6. 서비스 파일 설명

[Unit]

  • After=network-online.target firewalld.service
    • 네트워크 활성화 및 firewalld 시작 이후 실행되도록 함
  • Wants=network-online.target
    • 네트워크 온라인 상태를 함께 요청함
  • Requires=firewalld.service
    • firewalld 서비스가 동작 중인 상태를 전제로 함

[Service]

  • Type=oneshot
    • 한 번 실행 후 종료되는 서비스임
  • ExecStartPre=/usr/sbin/nft -c -f /etc/nftables/gateway-egress.nft
    • 적용 전 문법 검증을 먼저 수행함
  • ExecStartPre=-/usr/sbin/nft delete table inet gateway_egress
    • 기존 table 이 있으면 삭제하고, 없어도 오류로 처리하지 않음
  • ExecStart=/usr/sbin/nft -f /etc/nftables/gateway-egress.nft
    • Gateway egress rule 파일을 로드함
  • RemainAfterExit=yes
    • 실행 후에도 서비스가 active 상태로 표시되도록 함

[Install]

  • WantedBy=multi-user.target
    • 일반 운영 모드 부팅 시 자동 실행됨

7. systemd 반영

서비스 파일 작성 후 systemd 설정 반영:

sudo systemctl daemon-reload

8. 서비스 활성화

부팅 시 자동 실행되도록 등록:

sudo systemctl enable nftables-gateway-egress.service

9. 즉시 실행

재부팅 없이 현재 세션에서 바로 실행:

sudo systemctl start nftables-gateway-egress.service

10. 서비스 상태 확인

sudo systemctl status nftables-gateway-egress.service

정상 상태 예시:

active (exited)

이는 oneshot 서비스가 정상 실행된 상태를 의미함.


11. 규칙 적용 확인

Gateway egress table 이 정상 로드되었는지 확인:

sudo nft list table inet gateway_egress

전체 ruleset 확인:

sudo nft list ruleset

특히 다음 항목 존재 여부를 확인함.

  • table inet firewalld
  • table inet gateway_egress

12. 재부팅 후 확인

자동 로드 검증을 위해 재부팅 후 다시 확인함.

재부팅:

sudo reboot

부팅 후 확인:

sudo systemctl status nftables-gateway-egress.service
sudo nft list table inet gateway_egress

정상일 경우:

  • 서비스 상태: active (exited)
  • gateway_egress table 존재

13. firewalld reload 이후 표준 절차

firewalld reload 는 커스텀 nftables table 에 영향을 줄 수 있으므로
reload 직후 아래 절차를 표준으로 사용함.

sudo firewall-cmd --reload
sudo systemctl restart nftables-gateway-egress.service
sudo nft list table inet gateway_egress

운영 기준:

  • firewall-cmd --reload 실행 후에는 반드시 커스텀 서비스 재시작
  • 재시작 후 gateway_egress table 존재 여부 확인

14. 규칙 수정 후 재적용 절차

/etc/nftables/gateway-egress.nft 수정 후에는 아래 순서로 반영함.

1. Nginx proxy_pass 기준 대조

sudo nginx -T 2>/dev/null | grep -n proxy_pass

위 결과와 /etc/nftables/gateway-egress.nftallowed_backend_tcp
일치하는지 먼저 확인함.

이 절차가 필요한 이유는 다음과 같음.

  • Nginx에만 추가되고 nftables 에 누락된 backend 는 실제 서비스 장애로 이어질 수 있음
  • nftables 에만 남아 있는 오래된 backend 항목은 불필요한 내부 접근 허용이 됨
  • 자동 로드가 설정되어 있어도 allowlist 자체가 잘못되면 부팅 후 동일한 오설정이 반복 적용됨

2. 문법 검증

sudo nft -c -f /etc/nftables/gateway-egress.nft

3. 서비스 재시작

sudo systemctl restart nftables-gateway-egress.service

4. 적용 확인

sudo nft list table inet gateway_egress

15. 수동 적용과 systemd 적용 차이

다음 두 방식은 목적이 다름.

수동 적용

sudo nft -f /etc/nftables/gateway-egress.nft
  • 현재 세션에 즉시 적용
  • 재부팅 후 유지 보장 안 됨
  • 테스트 및 임시 반영 용도

systemd 적용

sudo systemctl start nftables-gateway-egress.service
  • 현재 즉시 적용 가능
  • 부팅 시 자동 실행됨
  • 운영 표준 방식

운영 서버에서는 systemd 서비스 방식을 기준으로 사용함.


16. 비활성화 및 롤백

1. 자동 로드 비활성화

sudo systemctl disable nftables-gateway-egress.service

2. 현재 규칙 제거

sudo nft delete table inet gateway_egress

3. 서비스 중지

sudo systemctl stop nftables-gateway-egress.service

4. 필요 시 서비스 파일 삭제

sudo rm -f /etc/systemd/system/nftables-gateway-egress.service
sudo systemctl daemon-reload

17. 운영 시 주의사항

  • nftables.service 와 본 커스텀 oneshot 서비스를 동시에 정책 관리 용도로 사용하지 않음
  • rule 수정 후에는 반드시 nft -c -f 로 문법 검증 후 반영함
  • firewalld reload 직후에는 nftables-gateway-egress.service 를 재시작하고 table 존재를 확인함
  • backend 추가/삭제 시 Nginx proxy_pass 와 nftables allowlist 를 함께 반영함
  • 운영 초기에는 13-nftables Gateway Egress 통제 가이드 기준으로 log 모드 검증 후 drop 모드로 전환함

18. 점검 명령

sudo systemctl status nftables-gateway-egress.service
sudo systemctl is-enabled nftables-gateway-egress.service
sudo nft list table inet gateway_egress
sudo nft list ruleset

목적

  • 서비스 활성화 여부 확인
  • 서비스 상태 확인
  • gateway egress table 존재 여부 확인
  • 전체 nftables 규칙 확인

19. 운영 정책 요약

Gateway 서버에서는 다음 방식으로 운영함.

  • firewalld → 인바운드 방화벽
  • nftables → 내부망 egress allowlist
  • /etc/nftables/gateway-egress.nft → 정책 파일
  • nftables-gateway-egress.service → 부팅 시 자동 로드 담당

즉, 운영 표준은 다음과 같음.

  1. gateway-egress.nft 수정
  2. 문법 검증
  3. systemd 서비스 재시작
  4. 규칙 적용 확인

20. 참고 사항

oneshot 서비스는 정상 실행 후에도 프로세스가 계속 남아있지 않으므로
active (exited) 상태가 정상임.

즉 아래 상태는 오류가 아님.

Active: active (exited)

21. 참고 문서