Suricata NAT Instance 기반 IPS/IDS 실습 랩 구축 (2편) : AWS NAT Instance 기본 설정 & Inline 트래픽 경로 준비

1. AWS CLI v2 설치 (권장 방식)

Terraform 이후에도 AWS CLI는 계속 필요하다.
Ubuntu 기준, 가장 안정적인 설치 방법은 AWS 공식 설치 파일(v2) 로 설치하는것이다.

필수 유틸리티 : 
# apt update
# apt install -y curl unzip

AWS CLI v2 다운로드 :
# cd /usr/local/src
# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip

압축 해제 :
# unzip awscliv2.zip

설치 :
# ./aws/install

확인 : 
# aws --version

aws-cli/2.x.x 형태로 버전이 나오면 정상이다.

apt install awscli 방식은 간편하지만 구버전이 설치될 가능성이 높다.
실습 환경에서는 v2 사용을 권장한다.


2. NAT Instance 필수 AWS 설정 확인

이 단계는 콘솔에서 반드시 직접 확인해야 한다.

2.1. Source / Destination Check 비활성화

NAT Instance는 패킷을 “중계”해야 하므로 이 옵션이 켜져 있으면 안 된다.

  • EC2 → NAT Instance 선택
  • Actions → Networking → Change source/destination check
  • Stop : 체크 활성화 확인

2-2. Private Subnet 라우팅 확인

Private Subnet의 라우트 테이블에서 다음이 보장되어야 한다.

  • 0.0.0.0/0NAT Instance ENI

이게 안 되어 있으면 이후 설정은 전부 의미 없다.


3. NAT Instance OS 초기 세팅

NAT Instance에 SSH 접속 후 기본 패키지를 설치한다.

# apt update
# apt install -y jq curl tcpdump ethtool iptables-persistent
  • tcpdump : 트래픽 흐름 확인용
  • iptables-persistent : rule 영구 저장용
    : Suricata 인라인 구성을 위해 필수

4. IP Forwarding 활성화 (필수)

이 설정이 없으면 NAT 자체가 동작하지 않는다.

즉시 반영

# sysctl -w net.ipv4.ip_forward=1

영구 반영

# echo 'net.ipv4.ip_forward=1' | tee /etc/sysctl.d/99-ipforward.conf
# sysctl --system

확인:

# sysctl net.ipv4.ip_forward

5. rp_filter 완화 (AWS 환경에서 중요)

AWS에서 NAT + 포워딩 구조를 쓰면
Reverse Path Filter(rp_filter) 때문에 정상 패킷이 드랍되는 경우가 있다.

실습 및 인라인 IPS 환경에서는 loose 모드가 안전하다.

rp_filter 관련 설정값 :

0 (No Validation)

  • 검사 안 함.
  • 들어오는 패킷의 소스 IP가 위조되었든 말든 신경 쓰지 않습니다. 보안상 좋지 않아 잘 쓰지 않습니다.

1 (Strict Mode) – 엄격 모드

  • “들어온 문으로 나갈 수 있어야 한다.”
  • 패킷이 eth0으로 들어왔다면, 그 IP로 응답을 보낼 때도 반드시 eth0을 통해 나가는 경로여야만 정상으로 간주.
  • 문제점: NAT이나 IPS 같은 복잡한 네트워크 환경에서는 패킷이 들어오는 경로와 나가는 경로가 다를 수 있음(비대칭 라우팅). 이때 Strict 모드(1)는 이 패킷을 “위조된 패킷(Spoofing)”으로 오해하고 패킷을 버림.(Drop).

2 (Loose Mode) – 느슨한 모드 (권장)

  • “어디로든 갈 수만 있으면 된다.”
  • 패킷이 eth0으로 들어왔는데, 응답을 보낼 때 eth1로 나가는 경로라도 상관없음.
    그냥 “우리 라우팅 테이블에 이 IP로 가는 길(Route)이 있기만 하면” 정상으로 통과시킴.
  • 왜 쓰나? AWS에서 NAT 인스턴스나 IPS를 구성하면 트래픽 흐름이 복잡해서 비대칭 경로가 자주 생김. 그래서 숫자 2를 설정해서 패킷 드랍을 막음.
# cat <<'EOF' | tee /etc/sysctl.d/99-rpfilter.conf
net.ipv4.conf.all.rp_filter=2
net.ipv4.conf.default.rp_filter=2
EOF

# sysctl --system

6. iptables: NAT + Inline(IDS/IPS) 트래픽 경로 준비

이 단계가 이번 편의 핵심이다.

목표

  1. NAT(MASQUERADE)로 Private Subnet 인터넷 통신 유지
  2. FORWARD 체인에 NFQUEUE 훅을 걸어 Suricata 인라인 처리 가능 상태로 만듦

6.1 변수 설정

Private Subnet CIDR (Terraform에서 생성한 값) :
# PRIVATE_CIDR="10.20.1.0/24"

외부 인터페이스 자동 감지 (보통 eth0) :
# EXT_IF="$(ip route get 1.1.1.1 | awk '{for(i=1;i<=NF;i++) if($i=="dev"){print $(i+1); exit}}')"
echo "PRIVATE_CIDR=$PRIVATE_CIDR"
echo "EXT_IF=$EXT_IF"

6.2 NAT + 기본 포워딩 룰

NAT rule 적용 : 
# iptables -t nat -A POSTROUTING -s "$PRIVATE_CIDR" -o "$EXT_IF" -j MASQUERADE

Forward 허용 :
# iptables -A FORWARD -s "$PRIVATE_CIDR" -j ACCEPT
# iptables -A FORWARD -d "$PRIVATE_CIDR" -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

여기까지만 진행해도 일반 NAT Instance로서는 정상 동작한다.


6.3 Suricata Inline용 NFQUEUE 훅 추가

아직 Suricata는 설치하지 않는다.
단, 패킷이 Suricata를 거칠 수 있는 경로는 미리 만들어 둔다.

중요 포인트:

  • 처음엔 IDS(탐지) 용도
  • Suricata 다운 시 장애 방지 → --queue-bypass 필수

Private → Internet :

# iptables -I FORWARD 1 -s "$PRIVATE_CIDR" -j NFQUEUE --queue-num 0 --queue-bypass

Internet → Private (응답 트래픽) :

# iptables -I FORWARD 2 -d "$PRIVATE_CIDR" -j NFQUEUE --queue-num 0 --queue-bypass

Internet HTTP -> Private HTTP (응답 트래픽) :

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.20.1.87:80    #private target web 서버 IP 적용

6.4 Rule 확인

# iptables -vnL FORWARD --line-numbers
# iptables -t nat -vnL POSTROUTING --line-numbers
# iptables -t nat -L PREROUTING -n -v

NFQUEUE 룰이 FORWARD 상단에 있는지 반드시 확인한다.


6.5 iptables 영구 저장

# netfilter-persistent save

재부팅 후에도 유지된다.


7. 여기까지의 상태 정리

현재 시점에서 NAT Instance는 다음 상태다.

  • Private Subnet → Internet 통신 정상
  • 모든 포워딩 트래픽이 NFQUEUE(0번) 를 거침
  • Suricata가 없어도 트래픽은 통과 (queue-bypass)
  • Inline IPS/IDS 투입 준비 완료

다음 편 예고 (3편)

다음 편부터 본격적으로 Suricata를 올린다.

  • Suricata Inline 모드(NFQUEUE) 설치 및 관련 설정

🛠 마지막 수정일: 2025.12.19

ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. 본문 및 이미지를 무단 복제·배포할 수 없습니다. 공유 시 반드시 원문 링크를 명시해 주세요.
ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. All rights reserved. Unauthorized copying or redistribution of the text and images is prohibited. When sharing, please include the original source link.

💡 도움이 필요하신가요?
Zabbix, Kubernetes, 그리고 다양한 오픈소스 인프라 환경에 대한 구축, 운영, 최적화, 장애 분석, 광고 및 협업 제안이 필요하다면 언제든 편하게 연락 주세요.

📧 Contact: jikimy75@gmail.com
💼 Service: 구축 대행 | 성능 튜닝 | 장애 분석 컨설팅

📖 E-BooK [PDF] 전자책 (Gumroad): Zabbix 엔터프라이즈 최적화 핸드북
블로그에서 다룬 Zabbix 관련 글들을 기반으로 실무 중심의 지침서로 재구성했습니다. 운영 환경에서 바로 적용할 수 있는 최적화·트러블슈팅 노하우까지 모두 포함되어 있습니다.


💡 Need Professional Support?
If you need deployment, optimization, or troubleshooting support for Zabbix, Kubernetes, or any other open-source infrastructure in your production environment, or if you are interested in sponsorships, ads, or technical collaboration, feel free to contact me anytime.

📧 Email: jikimy75@gmail.com
💼 Services: Deployment Support | Performance Tuning | Incident Analysis Consulting

📖 PDF eBook (Gumroad): Zabbix Enterprise Optimization Handbook
A single, production-ready PDF that compiles my in-depth Zabbix and Kubernetes monitoring guides.