본문으로 바로가기
728x90

1. 토폴로지

이번 글에서는 Cisco ASA 방화벽을 활용해 내부망 보호와 외부 서비스 제공 구조를 구성했습니다~

  • 내부 사용자 → 외부 통신 (PAT)
  • DMZ 서버 → 외부 공개 (Static NAT)
  • 외부 → DMZ 웹 서버 접근 제어 (ACL)
  • 내부망 보호 (외부 → 내부 차단)

 

네트워크 구성

  • ASA 인터페이스
    • Outside: 203.0.113.2/24
    • Inside: 192.168.10.1/24
    • DMZ: 192.168.20.1/24
  • 단말
    • Linux Client: 192.168.10.10 / GW 192.168.10.1
    • DMZ Server: 192.168.20.10 / GW 192.168.20.1
    • Outside Linux: 203.0.113.100 / GW 203.0.113.2

 

2. ASA 기본 설정

1) 인터페이스 설정

interface g0/0
 nameif outside              ! 외부 네트워크 인터페이스 이름 지정
 security-level 0            ! 가장 낮은 보안 레벨 (외부)
 ip address 203.0.113.2 255.255.255.0   ! 외부 IP 설정
 no shutdown                 ! 인터페이스 활성화

interface g0/1
 nameif inside               ! 내부 네트워크 인터페이스 이름 지정
 security-level 100          ! 가장 높은 보안 레벨 (내부)
 ip address 192.168.10.1 255.255.255.0  ! 내부 게이트웨이 IP
 no shutdown

interface g0/2
 nameif dmz                  ! DMZ 인터페이스 이름 지정
 security-level 50           ! 중간 보안 레벨
 ip address 192.168.20.1 255.255.255.0  ! DMZ 게이트웨이 IP
 no shutdown

각 인터페이스에 IP 주소와 nameif, security-level을 설정했습니다.

  • Inside (100) → Outside (0) : 허용 (내부 사용자의 인터넷 사용)
  • Outside (0) → Inside (100) : 차단 (외부 공격 차단)
  • DMZ (50) : 중간 영역 (제한적 접근 허용)

ASA는 보안 레벨을 기준으로 다음과 같이 동작합니다.

  • 높은 보안 레벨 → 낮은 보안 레벨 : 허용
  • 낮은 보안 레벨 → 높은 보안 레벨 : 차단

 

2) Default Route 설정

route outside 0.0.0.0 0.0.0.0 203.0.113.1  
! 모든 목적지(0.0.0.0/0)를 외부 게이트웨이(203.0.113.1)로 전달

Default Route는 외부 네트워크로 나가는 트래픽의 경로를 지정하는 설정입니다.

 

3. NAT 설정

1) 내부 → 외부 (PAT)

object network INSIDE-NET
 subnet 192.168.10.0 255.255.255.0    ! 내부 네트워크 정의

nat (inside,outside) dynamic interface
! inside → outside로 나갈 때 ASA의 외부 IP로 변환 (PAT)
! 여러 내부 사용자들이 하나의 공인 IP를 공유

내부 네트워크는 사설 IP를 사용하기 때문에 외부와 직접 통신할 수 없습니다. 이를 해결하기 위해 PAT를 사용하여 내부 IP를 외부 인터페이스 IP로 변환합니다~

 

 

2) DMZ 서버 → 외부 공개 (Static NAT)

object network DMZ-SERVER
 host 192.168.20.10        ! DMZ 서버 실제 IP 정의

nat (dmz,outside) static 203.0.113.10
! 외부에서 203.0.113.10으로 들어오면 192.168.20.10으로 전달
! 1:1 NAT (서버 공개용)

Static NAT는 내부 서버를 외부에 공개하기 위한 방식으로, 내부 IP와 외부 IP를 1:1로 매핑합니다. 이번 실습에서는 DMZ에 위치한 웹 서버(192.168.20.10)를 외부 IP인 203.0.113.10으로 매핑했습니다.

이 설정을 통해 외부 사용자는 내부 서버의 실제 IP를 알 필요 없이, 공인 IP로 접속하면 ASA가 자동으로 내부 서버로 트래픽을 전달하게 됩니다.

 

 

3) show nat

show nat 명령어를 통해 현재 NAT 정책을 확인할 수 있습니다.

  • Inside → Outside : dynamic PAT
  • DMZ → Outside : static NAT

또한 translate hit 수치를 통해 실제로 NAT이 얼마나 사용되었는지(실제 트래픽이 얼마나 발생했는지)도 확인할 수 있습니다.

 

 

4) show xlate

show xlate는 실제 NAT 변환 결과를 보여줍니다.

  • 어떤 내부 IP가 어떤 외부 IP로 변환되었는지 확인 가능
  • 트래픽이 발생해야 생성됨

 

4. ACL 설정

1) 외부 → DMZ 웹만 허용

access-list OUTSIDE-IN permit tcp any host 192.168.20.10 eq 80
! 외부(any)에서 DMZ 서버(192.168.20.10)의 80번 포트(HTTP) 허용

access-group OUTSIDE-IN in interface outside
! ACL을 outside 인터페이스의 inbound 방향에 적용
! (적용해야 실제 동작함)

외부에서 DMZ 웹 서버로의 HTTP(80번 포트) 트래픽만 허용했습니다.

 

 

2) ICMP 처리

inspect icmp 설정을 통해 ping 요청에 대해 정상 응답할 수 있도록 했습니다~

 

5. Linux 서버 설정

1) 내부 클라이언트

ip addr add 192.168.10.10/24 dev eth1
# 내부 IP 설정

ip route add default via 192.168.10.1
# ASA inside 인터페이스를 게이트웨이로 설정

내부 클라이언트는 ASA의 inside 인터페이스를 게이트웨이로 설정하여 외부 및 DMZ와 통신할 수 있도록 했습니다~

 

 

2) DMZ 웹 서버

ip addr add 192.168.20.10/24 dev eth1
# DMZ 서버 IP 설정

ip route add default via 192.168.20.1
# ASA dmz 인터페이스를 게이트웨이로 설정

DMZ 서버는 외부에 공개되는 서비스 역할을 합니다. IP와 게이트웨이를 설정한 후, 간단한 HTTP 서버를 실행하여 테스트용 웹 서비스를 구성했습니다~

 

echo "HELLO DMZ SERVER" > index.html
# 테스트용 웹 페이지 생성

python3 -m http.server 80
# 80번 포트로 간단한 HTTP 서버 실행

웹 서버 실행합니다~

 

3) 외부 클라이언트

 

6. 통신 테스트

1) ASA → 내부/외부/DMZ

ASA에서 각 네트워크로 ping 테스트하여 인터페이스와 라우팅이 정상적으로 구성되었는지 확인했습니다~

 

 

2) 내부 → DMZ 웹서버

내부 클라이언트에서 DMZ 서버로 HTTP 요청을 보낸 결과, 정상적으로 웹 페이지가 출력됐습니다~

 

 

3) 내부/DMZ → 외부

내부 및 DMZ에서 외부로 ping 테스트를 수행한 결과 정상적으로 통신되었고, 이는 PAT 설정이 정상적으로 동작하고 있음을 보여줍니다~

 

 

4) 외부 → DMZ 웹 서버

외부 클라이언트에서 공인 IP인 203.0.113.10으로 HTTP 요청을 보낸 결과, DMZ 웹 서버의 페이지가 정상적으로 출력됐습니다~

이는 Static NAT와 ACL이 함께 정상적으로 동작하고 있음을 의미합니다.

 

끝.

728x90
SMALL