본문 바로가기

해봐야 안다.OTL/Linux

[리눅스] iptables: ICMP

<ICMP 막기>

[root@jo:~]#iptables -I INPUT -p ICMP -j DROP

윈도우xp

--

[root@jo:~]#iptables -I INPUT -p ICMP --icmp-type echo-request -j ACCEPT

--

[root@jo:~]#iptables -I INPUT -p icmp -m limit --limit 5/minute -j REJECT

[root@jo:~]#iptables -I OUTPUT -p icmp -m limit --limit 5/minute -j REJECT

매칭을 시키는데 매칭 모듈을 limit 모듈을 사용하겠다는 의미

[root@jo:~]#iptables -L INPUT

Chain INPUT (policy ACCEPT)

target prot opt source destination

REJECT icmp -- anywhere anywhere limit: avg 5/min burst 5 reject-with icmp-port-unreachable

à limit : 평균 분당 5번 이상들어오면 host unreacherable 메시지를 보낸다.

ACCEPT udp -- anywhere anywhere udp dpt:domain

ACCEPT udp -- anywhere anywhere udp spt:domain

ACCEPT tcp -- anywhere anywhere tcp spt:https

ACCEPT tcp -- anywhere anywhere tcp spt:http

DROP tcp -- !192.168.10.26 anywhere tcp dpt:ssh

--

[root@jo:~]#tcpdump |grep ICMP

à tcpdump로 서버에서 "ICMP"메시지를 서버에서 보면

Request/reply 가 계속 가다가 request만 주르륵 갈 때가 있을 것이다.

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

19:59:17.699030 IP 192.168.10.26 > 192.168.10.181: ICMP echo request, id 1024, seq 36352, length 40

19:59:17.699243 IP 192.168.10.181 > 192.168.10.26: ICMP echo reply, id 1024, seq 36352, length 40

19:59:22.688573 IP 192.168.10.26 > 192.168.10.181: ICMP echo request, id 1024, seq 37888, length 40

19:59:22.688613 IP 192.168.10.181 > 192.168.10.26: ICMP echo reply, id 1024, seq 37888, length 40

19:59:24.682589 IP 192.168.10.26 > 192.168.10.181: ICMP echo request, id 1024, seq 38400, length

40

19:59:29.698823 IP 192.168.10.26 > 192.168.10.181: ICMP echo request, id 1024, seq 38656, length 40

19:59:30.700167 IP 192.168.10.26 > 192.168.10.181: ICMP echo request, id 1024, seq 39168, length 40

19:59:30.700672 IP 192.168.10.181 > 192.168.10.26: ICMP echo reply, id 1024, seq 39168, length 40

19:59:31.701368 IP 192.168.10.26 > 192.168.10.181: ICMP echo request, id 1024, seq 39424, length 40

19:59:31.701530 IP 192.168.10.181 > 192.168.10.26: ICMP echo reply, id 1024, seq 39424, length 40

à 이런 식으로 횟수 매칭에 제한을 건다.

--

[root@jo:~]#iptables -I INPUT -p tcp ! --syn -m state --state NEW -j DROP

à 커넥션을 새로 연결하는게 syn을 맺는데 새로운 커넥션이 아니면 syn이 아니기 때문에

새로운 패킷이 아니면 버린다는 의미

[root@jo:~]#iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

à ESTABLISH되어 있으면 서버에서도 접속한 클라이언트로 접속을 할 수 있는데

이 state 옵션이 왜 있냐면 역으로 들어오는 패킷을 막기 위함이다.

--

[root@jo:~]#iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT

[root@jo:~]#iptables -L OUTPUT

Chain OUTPUT (policy DROP)

target prot opt source destination

ACCEPT all -- anywhere anywhere state ESTABLISHED

à 만약 OUTPUT 전부 드롭 정책인데 위 명령이 되어 있다면

나랑 커넥션 맺은놈이면은 허용하겠다는 뜻이다.

즉 원래 드롭되어야 하는데 이미 새로운 세션으로 맺어져 ESTABLISHED 되면

허용하겠다라는 의미

But "ping"은 안된다. Ping은 ESTABLISHED 가 없고 그냥 주고 받고 하기 때문이다.

그래서 OUTPUT은 저렇게 적용하고 INPUT만 룰을 적용하여 사용한다.

[root@jo:~]#iptables -I INPUT -p tcp -m multiport --dports 80,443,110 -m state --state NEW -j ACCEPT

[root@jo:~]#iptables -I INPUT -p tcp -m multiport --dports 80,443,110 -m state --state NEW -j ACCEPT

à 하나의 룰에 여러 개의 포트를 적용할 수 있다.

[root@jo:~]#iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

ACCEPT tcp -- anywhere anywhere multiport dports http,https,pop3 state NEW

ACCEPT tcp -- anywhere anywhere multiport dports http,https,pop3

à 이렇게 적용된 것을 볼 수 있다.

--

[root@jo:~]#iptables -I INPUT -p icmp -j LOG --log-prefix "Input echo request"

à 로그에 남길 때 앞에다 이 걸 붙인다는 의미

à 윈도우에서 ping 192.168.10.181 외부에서 서버로 핑을 쏴본다.

[root@jo:~]#tail -f /var/log/messages

Oct 28 20:23:28 jo kkk: [1] PID=16030, PWD=/root, CMD= 998 iptables -P INPUT DROP

Oct 28 20:23:28 jo kernel: Input echo requestIN=eth0 OUT= MAC=00:0c:29:a9:92:8a:00:e0:4d:69:6c:90:08:00 SRC=192.168.10.26 DST=192.168.10.181 LEN=60 TOS=0x00 PREC=0x00 TTL=128 ID=46750 PROTO=ICMP TYPE=8 CODE=0 ID=1024 SEQ=9222

Oct 28 20:23:29 jo kernel: Input echo requestIN=eth0 OUT= MAC=00:0c:29:a9:92:8a:00:e0:4d:69:6c:90:08:00 SRC=192.168.10.26 DST=192.168.10.181 LEN=60 TOS=0x00 PREC=0x00 TTL=128 ID=46758 PROTO=ICMP TYPE=8 CODE=0 ID=1024 SEQ=9478

--

<수신 받은 놈이 그거에 대한 응답을 줄 거냐 말 거냐>

[root@jo:~]#iptables -I INPUT -p icmp -j REJECT

à REJECT 는 개무시 하는 것 하는 것이 낫다 . 때없이 낭비하기 때문에

 

[root@jo:~]#iptables -I INPUT -p icmp -j DROP

 

[root@jo:~]#iptables -I OUTPUT -p icmp -j ACCEPT

--