ICMP

리눅스의 ICMP 커널 프로토콜 모듈은 RFC792 에 정의되어 있는 Internet Control Message Protocol 의 구현이다. 이 모듈은 에러 상태의 진단을 목적으로 사용된다. 일반유저는 이 모듈을 직접 제어할 수 없다. 커널 ICMP 모듈은 ICMP 요청에 응답하는 일도 한다.

유저는 raw socket의 IPPROTO_ICMP프로토콜로 socket(:12)을 열어서 ICMP 패킷을 받을 수 있다. ICMP패킷은 ICMP_FILTER소켓 옵션을 이용해서 필터링 될 수 있다.

sysctl

sysctl 을 이용하면 ICMP의 설정을 변경할 수 있다. sysctl은 /proc/sys/net/ipv4/*에 있는 파일들을 읽고 쓰는 것으로 ICMP의 설정을 변경한다. 제어할 수 있는 값들은 다음과 같다. icmp_echo_ignore_all 만약 리턴값이 0 이라면, 리눅스는 모든 ICMP_ECHO요청을 무시한다. icmp_echo_ignore_broadcasts 만약 값이 0이 아니라면, 리눅스는 broadcast 주소로 보내어지는 모든 ICMP_ECHO 패킷을 무시한다.

ICMP PING 차단
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

ICMP PING 허용
# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

systel 명령을 이용할 수도 있다.

ICMP PING 차단
# sysctl net.ipv4.icmp_echo_ignore_all = 1

ICMP PING 허용
# sysctl net.ipv4.icmp_echo_ignore_all = 0

테스트

ICMP PING을 차단하고 ping 명령을 수행해보자.
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# ping 192.168.35.77
PING 192.168.35.77 (192.168.35.77) 56(84) bytes of data.
응답이 없을 것이다.

ICMP를 허용하고 ping 명령을 수행해보자.
# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# ping 192.168.35.77
PING 192.168.35.77 (192.168.35.77) 56(84) bytes of data.
64 bytes from 192.168.35.77: icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from 192.168.35.77: icmp_seq=2 ttl=64 time=0.013 ms
64 bytes from 192.168.35.77: icmp_seq=3 ttl=64 time=0.013 ms