시스템보안

시스템 내부에서의 Ping 차단에 대하여

JustSangRok 2026. 6. 25. 16:04

시스템 내부에서 DoS 공격 막기 — Ping 차단하기

실습 환경

Rocky Linux 9.7

1. 왜 ping을 막아야 하는가

ping은 단순한 네트워크 진단 도구지만, 공격자 입장에서는 여러 종류의 위협이 된다.

위협 설명

ICMP Flood (DoS) 대량의 echo request로 서버 자원 소모.
Smurf Attack 브로드캐스트로 ICMP를 보내 증폭 공격
Ping of Death 비정상 크기의 ICMP 패킷으로 옛 시스템 크래시 (현재는 거의 무력화됨)
정찰(reconnaissance) nmap 호스트 발견 단계에서 공격자가 살아있는 호스트를 찾는 데 사용.

운영 서버에서 외부 ping에 응답할 필요가 없다면 막아두는 게 안전하다. 


2. 방화벽

가장 흔한 방법은 firewalld에서 ICMP를 막는 것이다.

firewall-config → ICMP Filter 탭 →
   ☑ echo-request
   ☑ echo-reply

또는 명령어로.

firewall-cmd --permanent --add-icmp-block=echo-request
firewall-cmd --reload

이걸로 외부에서 들어오는 ping은 막을 수 있다. 

 시스템 내부의 ping

firewalld는 인터페이스(zone) 단위로 동작한다. 그리고 루프백 인터페이스(lo)는 기본적으로 trusted 존에 들어가 있어서 모든 트래픽이 그냥 통과한다.

즉 같은 호스트 안에서 도는 ping은 방화벽 입장에서는 검사할 권한이 없는 트래픽인 것이다. 

시스템 안에서 동작하는 악성 프로세스가 자기 자신을 향해 ICMP flood를 일으킬 수 있음

컨테이너·VM 환경에서 같은 호스트 내부 트래픽이 방화벽을 우회

모의 침투 후 내부 정찰 단계에서 공격자가 침투한 호스트의 다른 NIC을 ping으로 매핑

진짜로 ping 응답 자체를 끄려면, 커널이 ICMP echo request를 받는 시점에서 무시하게 만들어야 한다. 


3. 커널 파라미터로 ping 차단

리눅스 커널에는 "모든 ICMP echo request를 무시할지 말지" 를 결정하는 값이 있다.

cd /proc/sys/net/ipv4
cat icmp_echo_ignore_all

기본값은 0이다.

 

여기서 헷갈리기 쉬운 부분이 있다. 초보자들은 보통 "1=켜짐=허용, 0=꺼짐=차단"으로 읽기 쉽다. 

하지만 문화 차인지는 모르겠는데 리눅스에서는 보통 설정파일을 보면 차단하는 것을 끄는것을 허용할거냐 이런 식으로 적어놓는다.

0 = ping 응답함 (허용)
1 = ping 응답 안 함 (차단)

 

icmp_echo_ignore_all = 1
                   ▲
                  "무시한다"가 참 → ping 무시 → 응답 안 함

icmp_echo_ignore_all = 0
                   ▲
                  "무시한다"가 거짓 → 정상 동작 → 응답함

 그래도 보통 변수 이름에 동작 의미가 그대로 박혀 있어서 헷갈릴 일이 없도록 만들어져 있다. 다른 sysctl 파라미터들도 대부분 이런 식이다.

vi로 편집

여기서 한 가지 더. /proc/sys/에 있는 파일들은 vi로 편집하려고 하면 이상하게 동작하거나 실패한다.

이유는 /proc/sys/가 진짜 디스크 파일이 아니기 때문이다. 이건 procfs라는 가상 파일 시스템으로, 커널 안에 있는 변수들을 "파일처럼 보여주는 인터페이스"일 뿐이다.

cat으로 읽으면 커널 변수 값이 나오고, echo > 파일로 쓰면 커널 변수에 직접 값이 들어간다. 하지만 vi는 임시 파일을 만들어 편집한 뒤 원본을 갈아끼우는 방식으로 동작하는데, procfs는 일반 파일이 아니라서 이 방식이 통하지 않는다.

그래서 procfs 파일을 바꾸는 방법은 명령어로 직접 값을 주입하는 것뿐이다.


4. ping 무시 설정하기 

방법 1) echo로 직접 쓰기

가장 단순한 방법이다. /proc/sys/의 파일에 직접 값을 써넣는다.

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

쓰자마자 즉시 적용된다. 다른 호스트에서 ping을 시도해보면 응답이 안 오는 걸 확인할 수 있다.

방법 2) sysctl 명령으로 설정

같은 일을 sysctl 명령어로도 할 수 있다.

sysctl -w net.ipv4.icmp_echo_ignore_all=1

sysctl은 /proc/sys/ 아래 파일들을 점(.) 표기법으로 다룰 수 있게 해주는 도구다.

/proc/sys/net/ipv4/icmp_echo_ignore_all
              │
              ▼
sysctl 키:  net.ipv4.icmp_echo_ignore_all

슬래시(/)가 점(.)으로 바뀌는 것 외엔 동일하다.

일회성 테스트라면 echo가 빠르고, 스크립트나 운영 자동화에는 sysctl이 표준이라 가독성이 좋다고 한다. 어느 쪽을 쓰든 결과는 같다.


5. 재부팅해도 유지되게 만들기

방금 두 방법 모두 재부팅하면 사라진다. 커널 메모리에 값을 직접 주입한 것뿐이라, 재부팅하면 커널이 기본값으로 돌아간다.

영구적으로 유지하려면 설정 파일에 적어둬야 한다.

방법 1) /etc/sysctl.conf 

vi /etc/sysctl.conf

파일 맨 아래에 추가한다.

# Ignore all ICMP echo requests (ping)
net.ipv4.icmp_echo_ignore_all = 1

저장한 뒤 재부팅 없이 즉시 적용하려면.

sysctl -p

-p(load) 옵션이 /etc/sysctl.conf를 다시 읽어서 모든 설정을 한 번에 적용해준다.

방법 2) /etc/sysctl.d/ 

요즘 Rocky, Ubuntu 등 현대 배포판에서는 /etc/sysctl.d/ 디렉터리에 별도 conf 파일을 만드는 것을 권장한다고 한다.

vi /etc/sysctl.d/99-disable-ping.conf

내용:

net.ipv4.icmp_echo_ignore_all = 1

전체 sysctl 설정을 다시 로드하려면.

sysctl --system

왜 /etc/sysctl.d/가 권장될까?

● 설정을 주제별로 파일을 나눠 관리할 수 있다. 예: 99-disable-ping.conf, 90-network-hardening.conf, 80-kernel-tuning.conf

● 패키지 업데이트 등으로 sysctl.conf가 갈아끼워질 위험이 없다

● 파일명 앞에 숫자가 붙어서 로드 순서(작은 숫자 먼저, 큰 숫자가 덮어씀) 를 명확히 할 수 있다


6. ICMP 관련 옵션들

icmp_echo_ignore_all 하나만 켜는 것보다, 관련 옵션을 같이 적용해서 ICMP 표면을 한 번에 정리하는 게 더 깔끔하다.

옵션 권장값 의미

net.ipv4.icmp_echo_ignore_all 1 모든 ICMP echo request 무시 
net.ipv4.icmp_echo_ignore_broadcasts 1 (기본) 브로드캐스트 ICMP 무시 → Smurf 공격 방어
net.ipv4.icmp_ignore_bogus_error_responses 1 잘못된 ICMP 에러 응답 무시 → 로그 노이즈 감소
net.ipv4.tcp_syncookies 1 (기본) SYN flood 방어

/etc/sysctl.d/99-network-hardening.conf 같은 파일에 한꺼번에 적어두면 편하다.

# ICMP echo request 차단
net.ipv4.icmp_echo_ignore_all = 1

# 브로드캐스트 ICMP 무시 (Smurf 방어)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 잘못된 ICMP 에러 응답 무시
net.ipv4.icmp_ignore_bogus_error_responses = 1

# SYN flood 방어
net.ipv4.tcp_syncookies = 1

7. 정리

ICMP 차단 방법은 여러 레이어에서 가능하다. 각각 적용 범위가 다르다.

레이어 도구 막을 수 있는 ping
네트워크 경계 라우터/L7 방화벽 외부 ↔ 네트워크
호스트 외부 firewalld / iptables 외부 ↔ 호스트 (loopback 제외)
호스트 커널 icmp_echo_ignore_all 모든 ICMP echo (loopback 포함)

커널 단에서 막는 게 가장 광범위하다. 자기 자신에 대한 ping까지 모두 무시한다. 그래서 진짜로 "이 서버는 ping에 응답하지 않는다"를 보장하려면 커널 파라미터까지 건드려야 한다.

주의 사항

모니터링 시스템이 ping으로 헬스 체크를 한다면 차단 전에 확인해야 된다. ping 헬스 체크가 동작 안 해서 서버가 죽었다고 잘못 판단할 수 있다.

로컬 디버깅 시 ping localhost도 안 된다. 일시적으로 다시 켜려면 sysctl -w net.ipv4.icmp_echo_ignore_all=0.

IPv6는 별도다. net.ipv4.*는 IPv4 전용이라, IPv6에서도 막으려면 ip6tables나 firewalld의 IPv6 ICMP 설정을 별도로 설정해야 한다.