|
오늘 아침 회사에 도착했을 때, 공식 웹사이트에 로그인하고 서버에 접속해 공식 웹사이트 접근 상태를 확인할 때 꽤 느린 느낌이 들었습니다: [root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn 172개 설립 59 연결 589 SYN_RECV 15 스트림 SYN이 실제로 매우 높으니, 해당 IP에서 보내는 SYN을 계속 추적해 보세요: [root@tweb ~]# 넷스타트 -안 | 그렙 신 | awk '{print $5}' | awk -F: '{print $1}' | 정렬 | Uniq -c | 정렬 -nr | 더 보기 570 X.X.X.X (IP는 작성된 것이 아니라 산둥 자오좡 유니콤의 IP입니다) 하지만 이 IP가 너무 많은 SYN 요청 연결을 보냈고, 우리 웹 서버의 동시성이 높지 않아 일반 사용자 요청이 불가능하고 페이지도 열리지 않습니다. 하드웨어 방화벽은 그룹 IT 부서에서 관리하기 때문에 권한이 없어서 로컬 서버에서 SYN 공격을 부분적으로 완화할 수 있는 조치만 취할 수 있습니다. 우선, SYN의 공격 원리에 대해 이야기해 봅시다: TCP/IP 프로토콜에서는 3자 핸드셰이크를 통해 연결을 구축함으로써 신뢰할 수 있는 연결 서비스를 제공합니다. 첫 번째 핸드셰이크: 연결을 설정할 때 클라이언트는 syn 패킷(syn=j)을 서버에 보내고 SYN_SEND 상태에 들어가 서버의 확인을 기다립니다. 두 번째 핸드셰이크: 서버가 SYN 패킷을 받으면 고객의 SYN (ack=j+1)를 확인하고, SYN 패킷(syn=k)도 보내야 하며, 이 경우 서버는 SYN_RECV 상태에 들어갑니다. 세 번째 핸드셰이크: 클라이언트는 서버로부터 SYN+ACK 패킷을 받고 확인 패킷 ACK (ack=k+1)를 서버에 전송합니다. 세 번의 핸드셰이크 후, 클라이언트와 서버가 데이터를 전송하기 시작합니다.
사용자가 두 번째 악수만 하고 서버에 응답하지 않는 경우, 서버는 사용자의 확인을 계속 기다립니다. 그래서 SYN 연결에서 직접 다음과 같은 변경을 합니다: 리눅스에서 기본 SYN 구성을 확인하세요: [root@web ~]# sysctl -a | 그렙 _syn net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syn_retries = 5 tcp_max_syn_backlog는 SYN 큐의 길이이며, SYN 큐 길이를 늘리면 연결을 기다리는 네트워크 연결을 더 많이 수용할 수 있습니다. tcp_syncookies SYN 쿠키 기능을 켜는 스위치로, 부분적인 SYN 공격을 방지할 수 있습니다. tcp_synack_retries와 tcp_syn_retries는 SYN의 재시도 연결 수를 정의하고, 기본 매개변수를 줄여 SYN 연결 수를 최대한 제어합니다. 다음은 제가 수정한 매개변수이며, 서버 상황에 따라 조정할 수 있습니다: [root@web ~]# 더 많은 /etc/rc.d/rc.local #!/빈/쉬 # 이 scrip{filter}t는 다른 모든 init scrip{filter}ts 이후에 실행됩니다. # 네가 안 하면 네 초기화 자료를 여기 넣어도 돼 # Sys V 스타일의 완전 이니트 스타일을 하고 싶어. 터치 /var/lock/subsys/local 유리미트 -HSn 65535 /usr/local/apache2/bin/apachectl start ##### sysctl -w net.ipv4.tcp_max_syn_backlog=2048 sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_synack_retries=3 sysctl -w net.ipv4.tcp_syn_retries=3 서버를 재시작하지 않고 즉시 설정이 적용되도록 하려면 다음을 수행할 수 있습니다 #sysctl -w net.ipv4.tcp_max_syn_backlog=2048 #sysctl -w net.ipv4.tcp_syncookies=1 #sysctl -w net.ipv4.tcp_synack_retries=3 #sysctl -w net.ipv4.tcp_syn_retries=3 일부 사람들은 SYN 공격을 막기 위해 접근 제어 목록을 사용하는데, 이는 SYN 공격을 어느 정도 느리게 만듭니다: 신 플러드 공격 #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --1/s 제한: 동시 동시성 횟수를 초당 1회로 제한합니다 안티포트 스캐닝 # iptables -A FORWARD -p tcp --tcp-tcp-flags SYN, ACK, FIN,RST RST -M LIMIT --LIMIT 1/s -j ACCEPT 죽음의 신호 # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT #>iptables-save >/etc/sysconfig/iptables 보기 위해, #iptables -L ACCEPT tcp -- 어디서나 TCP 플래그: FIN, SYN, RST, ACK/SYN 한도: 평균 1/초 버스트 5 ACCEPT TCP -- 어디서나 TCP 플래그: FIN, SYN, RST, ACK/RST 제한: 평균 1/초 버스트 5 ACCEPT icmp -- 어디서나 ICMP 에코 요청 한도: 평균 1/초 버스트 5 Syn 연결을 다시 확인해 보세요: [root@web ~]# 넷스타트 -안 | 그렙 신 | awk '{print $5}' | awk -F: '{print $1}' | 정렬 | Uniq -c | 정렬 -nr | 더 보기 20 10.92.10.220 1 125.43.36.199 분명히 SYN 연결 수가 줄어들었습니다.
|