FreeBSD blackhole 기능

FreeBSD에서 DoS 공격을 근본적으로 막을 방법은 뾰족히 없지만 좀 느리게 만드는 방법입니다. PF(Packet Filter)로 잘 설정하고 싶지만 연결을 많이 유지하는 서버에서 PF가 성능저하가 있는거 같아서 일단 다른방법으로 대처했습니다.

man blackhole 하면 자세한 설명 볼수 있으며,

net.inet.tcp.blackhole와 net.inet.udp.blackhole을 세팅하면 됩니다.

# sysctl -w net.inet.tcp.blackhole=1
# sysctl -w net.inet.udp.blackhole=1

포트 스캔할때, 닫혀있는 포트에 대해서는 리셋(RST) 패킷이 날라가는데 이걸 아예 안보내게 합니다. tcp.blackhole의 경우 1이면 연결(SYN) 패킷에 대해서 RST를 안보내며, 2로 세팅하면 모든 패킷에 대해서 RST를 안보냅니다. UDP는 따로 연결 패킷이 없기 때문에 1로 세팅하면 닫혀있는 포트로 오는 패킷에 대해서 RST 응답을 안보내고 무시합니다.

포트스캔을 하면 없는 포트로 많은 패킷이 오기 때문에 RST 패킷이 많이 나가게 됩니다. 이럴 경우 시스템에 부하를 일으킬 소지가 있으므로, FreeBSD에서는 RST를 보낼때 1초에 200개의 RST 패킷만 보내도록 제한이 되어있습니다. 이를 넘을 경우 아래와 같은 경고 메시지가 dmesg 등에 나타납니다.

Limiting closed port RST response from 286 to 200 packets/sec
Limiting closed port RST response from 463 to 200 packets/sec

여기 IP 정보가 나오지 않기 때문에 정보를 보기 위해서는

# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1

하지만 이렇게 하면 로깅되는 정보가 너무 상당히 때문에 시스템에 더 큰 부하를 일으킬 가능성이있습니다. 공격을 당하는 서버에서는 잠깐동안 기능을 켰다가 끄도록 아래처럼 실행하세요.

# sysctl -w net.inet.tcp.log_in_vain=1; sleep 5; sysctl -w net.inet.tcp.log_in_vain=0

위에 처럼 서버(SERVER_IP)에서 돌리고, 원격 서버(SCANNER_IP)에서 nmap을 돌려봤습니다. 스캔 당하는 SERVER_IP에서는 blackhole 기능은 끈상태입니다.

Connection attempt to TCP SERVER_IP:25 from SCANNER_IP:38947 flags:0x02
Connection attempt to TCP SERVER_IP:1723 from SCANNER_IP:38947 flags:0x02
Connection attempt to TCP SERVER_IP:3389 from SCANNER_IP:38947 flags:0x02
… (생략)
Limiting closed port RST response from 233 to 200 packets/sec
… (생략)
Limiting closed port RST response from 262 to 200 packets/sec
… (생략)
Limiting closed port RST response from 279 to 200 packets/sec

blackhole=1로 설정한 상태에서는 Limiting closed port… 메시지가 나타나지 않고, nmap의 실행속도가 많이 느려집니다. 글쓰면서 실행해봤는데 몇분이 지나도 끝나지가 않는군요. 답답해서 nmap 실행창에서 엔터를 쳤더니 다음과 같은 메시지가 나오네요. ㅎㅎ 콘솔 프로그램인데 이런거까지 신경써주는군요. ^^

Stats: 0:06:49 elapsed; 1 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 72.17% done; ETC: 01:59 (0:02:37 remaining)

한가지 문제가 blackhole 기능을 켜두면 원격에서 서버 모니터링할때 서버가 죽어도 응답이 바로 오지않는 문제가 있는데, PF를 통해서 포트에 따라서 선택적으로 blackhole 기능처럼 RST 보내지 않도록 설정하는것이 더 좋을거 같네요.

One thought on “FreeBSD blackhole 기능

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>