iptables 를 사용하여 리눅스에서 ICMP 트래픽 차단하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 리눅스의 강력한 명령줄 방화벽 유틸리티인 iptables를 사용하여 들어오는 ICMP 트래픽을 차단하는 방법을 배웁니다. 네트워크 연결을 테스트하는 데 흔히 사용되는 ping 명령의 기반인 ICMP 프로토콜 패킷을 폐기하도록 방화벽 규칙을 구성하게 됩니다. 이는 프로토콜 수준에서 네트워크 접근을 제어하여 리눅스 시스템의 보안을 강화하는 필수적인 기술입니다.

먼저 nmap을 이용한 사전 네트워크 스캔을 통해 시스템의 열린 포트를 점검하는 것으로 시작합니다. 그 다음, ping을 사용하여 초기 상태에서 ICMP 트래픽이 정상적으로 허용되는지 확인하여 기준점을 잡습니다. 실습의 핵심 단계에서는 들어오는 모든 ICMP 패킷을 폐기하는 특정 iptables 규칙을 생성하고 적용합니다. 마지막으로 규칙이 활성화되었는지 확인하고, 다시 한번 시스템에 ping 을 시도하여 요청이 성공적으로 차단되는지 테스트함으로써 효과를 검증합니다.

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 통계 데이터에 따르면 이 실습은 완료율 99%초급 수준이며, 학습자들로부터 98%의 긍정적인 평가를 받았습니다.

nmap 을 사용한 열린 TCP 및 UDP 포트 스캔

이 단계에서는 nmap 도구를 사용하여 자신의 시스템에서 열려 있는 네트워크 포트를 스캔하는 방법을 배웁니다. 네트워크 포트는 운영 체제 내 통신의 종착점입니다. 프로그램이 네트워크로부터 정보를 받으려 할 때 특정 포트에서 "리스닝 (listening)" 상태가 됩니다. 열린 포트를 스캔하는 것은 각 포트가 공격자의 잠재적인 침입 경로가 될 수 있으므로, 머신의 보안 상태를 평가하는 가장 기본적인 첫 단계입니다.

먼저 기본 환경에 포함되어 있지 않은 nmap을 설치해야 합니다. 새로운 소프트웨어를 설치하기 전에 패키지 목록을 업데이트하는 것이 좋습니다.

다음 명령을 실행하여 패키지 목록을 업데이트하십시오.

sudo apt-get update

이제 다음 명령으로 nmap을 설치합니다.

sudo apt-get install -y nmap

nmap과 관련 의존성 패키지들이 설치되는 과정이 출력됩니다.

다음으로 nmap이 스캔할 대상을 지정하기 위해 머신의 IP 주소를 확인해야 합니다. ip 명령을 사용하여 확인할 수 있습니다.

ip addr show

eth0 또는 ens33과 같은 항목을 찾으십시오. IP 주소는 inet 옆에 표시됩니다. 172.16.50.13/24와 같은 형식으로 나타납니다.

출력 결과에서 IP 주소를 식별하는 방법:

  1. state UP 상태인 인터페이스를 찾습니다 (보통 eth0).
  2. inet으로 시작하는 줄을 찾습니다 (inet6 제외).
  3. / 앞부분의 IP 주소만 가져옵니다 (예: inet 172.16.50.13/24라면 IP 주소는 172.16.50.13입니다).
  4. IP 가 127.0.0.1인 루프백 인터페이스 (lo) 는 무시합니다.

이 실습의 나머지 과정에서는 실제 IP 주소 대신 <your_IP_address>라는 자리 표시자를 사용합니다.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:04:c3:1d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.13/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159940sec preferred_lft 1892159940sec
    inet6 fe80::216:3eff:fe04:c31d/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:1d:45:49:f8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

이제 첫 번째 스캔을 수행할 준비가 되었습니다. 먼저 열려 있는 TCP(Transmission Control Protocol) 포트를 스캔해 보겠습니다. TCP 는 SSH(22 번 포트) 나 HTTP(80 번 포트) 와 같은 많은 일반적인 서비스에서 사용하는 연결 지향형 프로토콜입니다. nmap-sT 옵션은 TCP 연결 스캔을 수행합니다.

중요: <your_IP_address> 부분을 이전 단계에서 확인한 실제 IP 로 바꾸십시오. 예를 들어 IP 가 172.16.50.13이라면 명령은 nmap -sT 172.16.50.13이 됩니다.

확인한 IP 를 넣어 명령을 실행하십시오.

nmap -sT <your_IP_address>

출력 결과에 "open" 상태인 포트 목록이 표시됩니다. 시스템에는 기본적으로 SSH 포트 (22) 가 열려 있을 것이며, 다른 포트에서 추가 서비스가 실행 중일 수도 있습니다.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:08 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.00013s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
3000/tcp open  ppp
3001/tcp open  nessus

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

다음으로 UDP(User Datagram Protocol) 포트를 스캔해 보겠습니다. UDP 는 DNS(53 번 포트) 나 DHCP(67/68 번 포트) 와 같은 서비스에 사용되는 비연결형 프로토콜입니다. UDP 스캔은 TCP 스캔보다 느리고 신뢰성이 떨어질 수 있습니다. sudo를 사용하면 UDP 스캔에서 더 정확한 결과를 얻을 수 있습니다. -sU 옵션은 UDP 스캔을 수행하도록 지정합니다.

주의: <your_IP_address>를 실제 IP 주소로 바꾸는 것을 잊지 마십시오.

IP 를 입력하고 명령을 실행합니다.

sudo nmap -sU <your_IP_address>

출력 결과에 포트 상태가 open|filtered로 표시될 수 있습니다. 이는 nmap이 해당 포트가 열려 있는지, 아니면 방화벽이 스캔을 차단하고 있는지 명확히 판단할 수 없음을 의미합니다. 이는 UDP 스캔에서 흔히 나타나는 결과입니다.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:09 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.0000060s latency).
Not shown: 998 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
5353/udp open|filtered zeroconf

Nmap done: 1 IP address (1 host up) scanned in 1.29 seconds

이 스캔들을 완료함으로써 머신에서 네트워크 연결을 기다리고 있는 서비스들을 성공적으로 식별했습니다.

ping 을 사용한 초기 네트워크 연결 확인

이 단계에서는 방화벽 규칙을 적용하기 전에 시스템이 네트워크 요청에 응답하는지 ping 명령으로 확인합니다. ping 명령은 대상 호스트에 ICMP(Internet Control Message Protocol) "에코 요청 (echo request)" 패킷을 보냅니다. 호스트에 도달할 수 있고 응답하도록 설정되어 있다면 "에코 응답 (echo reply)" 패킷을 다시 보냅니다. 이는 기본적인 네트워크 연결성을 테스트하는 가장 기초적인 방법입니다.

이러한 유형의 트래픽을 차단하는 방화벽 규칙을 만들기 전에, 현재 트래픽이 허용되고 있는지 먼저 확인해야 합니다. 그래야 나중에 규칙을 테스트할 때 차단 원인이 다른 네트워크 문제가 아니라 우리가 만든 규칙 때문임을 확신할 수 있습니다.

"루프백 (loopback)" 주소인 127.0.0.1로 ping 을 보낼 것입니다. 이 특수 IP 주소는 항상 자기 자신을 가리키므로, 외부 연결이나 할당된 IP 주소를 몰라도 로컬 네트워크 스택을 테스트할 수 있습니다.

패킷을 4 개만 보내고 중지하려면 -c 4 옵션을 사용합니다. 이 옵션이 없으면 pingCtrl+C로 직접 중지할 때까지 계속 실행됩니다.

터미널을 열고 다음 명령을 실행하십시오.

ping -c 4 127.0.0.1

4 개의 패킷이 전송되고 4 개가 수신되었다는 출력이 표시되어야 하며, 이는 시스템이 ICMP 요청에 올바르게 응답하고 있음을 나타냅니다.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.053 ms

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3070ms
rtt min/avg/max/mdev = 0.045/0.051/0.055/0.003 ms

0% packet loss 줄은 연결이 완벽하게 작동함을 확인해 줍니다. 이제 기준이 확인되었으므로, 이 통신을 차단하는 방화벽 규칙을 구성할 준비가 되었습니다.

ICMP 패킷을 폐기하는 iptables 규칙 생성

이 단계에서는 리눅스 커널의 네트워크 패킷 필터링 규칙을 관리하는 표준 명령줄 유틸리티인 iptables를 사용하여 간단한 방화벽 규칙을 구성합니다. 앞서 ping 명령으로 테스트했던 ICMP 트래픽을 차단하는 규칙을 만들 것입니다.

iptables는 테이블 (tables), 체인 (chains), 규칙 (rules) 시스템으로 작동합니다.

  • 테이블 (Tables): 특정 목적을 위한 체인들의 집합입니다. 가장 많이 사용되는 테이블은 기본값인 filter이며, 패킷 필터링에 사용됩니다.
  • 체인 (Chains): 순서대로 확인되는 규칙들의 목록입니다. 들어오는 트래픽의 경우 INPUT 체인이 사용됩니다.
  • 규칙 (Rules): 패킷의 조건 (프로토콜, 소스 주소 등) 과 타겟 (패킷 처리 방식, 예: ACCEPT 또는 DROP) 을 지정합니다.

먼저 현재 규칙 세트를 살펴보겠습니다. iptables는 커널 설정을 수정하므로 반드시 sudo를 사용해야 합니다. -L 옵션은 기본 filter 테이블의 규칙을 나열합니다.

sudo iptables -L

INPUT, FORWARD, OUTPUT이라는 세 가지 기본 체인이 표시됩니다. 이 환경에서는 Docker 가 이미 FORWARD 체인에 일부 규칙을 생성하고 컨테이너 네트워킹을 위한 사용자 정의 체인을 추가한 것을 볼 수 있습니다. INPUTOUTPUT 체인은 여전히 일반 트래픽에 대해 기본 ACCEPT 정책을 사용하고 있습니다.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

이제 들어오는 ICMP 패킷을 차단하는 규칙을 추가해 보겠습니다. INPUT 체인에 새로운 규칙을 추가 (-A) 할 것입니다.

명령어의 구성은 다음과 같습니다:

  • sudo iptables: 방화벽 관리 명령입니다.
  • -A INPUT: INPUT 체인에 규칙을 추가 (Append) 합니다.
  • -p icmp: icmp 프로토콜을 사용하는 패킷에 이 규칙을 적용합니다.
  • -j DROP: 패킷이 일치하면 DROP 타겟으로 점프합니다. 이는 응답을 보내지 않고 패킷을 조용히 버립니다.

다음 명령을 실행하여 규칙을 생성하십시오.

sudo iptables -A INPUT -p icmp -j DROP

성공적으로 실행되면 아무런 출력도 나오지 않습니다. 이제 커널 방화벽에 모든 소스로부터 들어오는 ICMP 패킷을 폐기하도록 지시했습니다.

방화벽 규칙 확인 및 차단 테스트

마지막 단계에서는 새로운 방화벽 규칙이 성공적으로 추가되었는지 확인하고, 시스템에 다시 ping을 시도하여 효과를 테스트합니다. 이러한 검증 과정은 보안 정책이 올바르게 구현되었는지 확인하기 위해 네트워크 관리에서 매우 중요합니다.

먼저 규칙 목록을 다시 조회하여 새로 추가된 규칙을 확인합니다. 이전과 동일한 명령을 실행하여 방화벽의 현재 상태를 볼 수 있습니다.

sudo iptables -L

이제 INPUT 체인 아래에 새로운 규칙이 나열된 것을 볼 수 있습니다. 출력 결과는 icmp 프로토콜과 일치하는 패킷이 DROP 타겟으로 보내질 것임을 명확히 보여줍니다.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

규칙이 적용된 것을 확인했으므로 이제 테스트해 보겠습니다. 2 단계에서 사용했던 것과 동일한 ping 명령을 실행합니다.

ping -c 4 127.0.0.1

이번에는 아무런 응답이 없을 것입니다. 명령이 몇 초 동안 멈춘 것처럼 보이다가 종료됩니다. 출력 결과에는 100% packet loss가 표시됩니다. 이는 커널 방화벽이 지시한 대로 들어오는 ICMP 패킷을 조용히 폐기하고 있기 때문에 발생하는 정상적인 결과입니다.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3055ms

성공적으로 ICMP 트래픽을 차단했습니다! iptables로 생성한 규칙은 영구적이지 않으며 시스템을 재부팅하면 삭제됩니다. 하지만 규칙을 수동으로 제거하는 방법을 알아두는 것이 좋습니다. 추가할 때와 동일한 규칙을 지정하고 -D (delete) 플래그를 사용하여 제거할 수 있습니다.

연결을 복구하기 위해 규칙을 제거해 보겠습니다.

sudo iptables -D INPUT -p icmp -j DROP

규칙이 사라지고 연결이 복구되었는지 확인하기 위해 마지막으로 ping을 한 번 더 실행합니다.

ping -c 2 127.0.0.1

이제 ping 이 성공해야 하며, 이는 방화벽 규칙이 성공적으로 제거되었음을 확인해 줍니다.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.058 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1024ms
rtt min/avg/max/mdev = 0.048/0.053/0.058/0.005 ms

요약

이 실습에서는 리눅스 시스템에서 초기 네트워크 정찰을 수행하는 방법을 배웠습니다. 머신의 IP 주소를 식별한 후 nmap 도구를 설치하여 열린 TCP 및 UDP 포트를 스캔하는 것으로 시작했습니다. 이어서 ping 명령을 사용하여 시스템이 ICMP 트래픽을 성공적으로 수신하고 응답하는지 확인하여 네트워크 연결의 기준점을 설정했습니다.

실습의 핵심은 iptables 방화벽 유틸리티를 사용하여 네트워크 트래픽을 제어하는 것이었습니다. INPUT 체인에 모든 들어오는 ICMP 패킷을 DROP하는 특정 규칙을 구성하고 적용하여 ping과 같은 도구를 효과적으로 차단했습니다. 마지막으로 현재 iptables 규칙 세트를 나열하여 새 규칙이 활성화되었는지 확인하고, 머신에 다시 ping을 시도하여 요청이 예상대로 타임아웃되는지 테스트함으로써 차단 효과를 검증했습니다.