본문 바로가기

리눅스/centos

[centos] 소프트레벨 커널 튜닝

반응형
이미지 서버 구축시 하였던 소프트 레벨 커널 튜닝과 설명 리스트입니다.
내역 참고하시고 서버튜닝시 해당 서버의 용도에 맞게 튜닝하세요


=====================================
아래의 내역은 이미지서버구축시 최대한 많은 자원을 허용하기위해 적용한것입니다.
맞지 않는 부분이 있으나 참고만 하세요~
 
echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem
echo "4096 65536 16777216" > /proc/sys/net/ipv4/tcp_wmem
echo "8388608 8388608 8388608" > /proc/sys/net/ipv4/tcp_mem
echo 163840 > /proc/sys/net/nf_conntrack_max
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 2  > /proc/sys/net/ipv4/tcp_retries1
echo 9999999 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
echo 9999999 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 0 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 9999999 > /proc/sys/net/ipv4/route/max_size
echo 10 > /proc/sys/net/ipv4/route/secret_interval
echo 1 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/log_martians
echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
echo 1 >  /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 3 > /proc/sys/net/ipv4/tcp_syn_retries
echo 3 > /proc/sys/net/ipv4/tcp_synack_retries
echo 2 > /proc/sys/net/ipv4/tcp_retries1
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 3000 > /proc/sys/net/core/netdev_max_backlog
echo 3000 > /proc/sys/net/core/somaxconn
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 99999 > /proc/sys/net/core/netdev_max_backlog
echo 99999 > /proc/sys/net/core/somaxconn

========================================

기존값 확인(튜닝하기전 원복을위해 아래 내역으로 기존 값을 백업하자) 

cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/ipv4/tcp_wmem
cat /proc/sys/net/ipv4/tcp_mem
cat /proc/sys/net/nf_conntrack_max
cat /proc/sys/net/ipv4/tcp_syncookies
cat /proc/sys/net/ipv4/tcp_sack
cat /proc/sys/net/ipv4/tcp_timestamps
cat /proc/sys/net/ipv4/tcp_retries1
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
cat /proc/sys/net/ipv4/tcp_window_scaling
cat /proc/sys/net/ipv4/tcp_max_tw_buckets
cat /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/tcp_tw_recycle
cat /proc/sys/net/ipv4/tcp_keepalive_time
cat /proc/sys/net/ipv4/tcp_fin_timeout
cat /proc/sys/net/ipv4/route/max_size
cat /proc/sys/net/ipv4/route/secret_interval
cat /proc/sys/net/ipv4/conf/all/accept_redirects
cat /proc/sys/net/ipv4/conf/all/log_martians
cat /proc/sys/net/ipv4/ip_local_port_range
cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
cat /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
cat /proc/sys/net/ipv4/tcp_syn_retries
cat /proc/sys/net/ipv4/tcp_synack_retries
cat /proc/sys/net/ipv4/tcp_retries1
cat /proc/sys/net/ipv4/tcp_sack
cat /proc/sys/net/ipv4/tcp_tw_reuse
=========================================



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

syn flooding 공격에 대응하기 위해 syncookies 기능을 켠다. syn flooding 공격에 매우 효과적이며 커널에서 아래 기능이 활성화되어 있어야 한다.
## syncookies(신쿠키) 기능활성화
## 기존 0(비활성화) 으로 되어 있는 부분을 1(활성화) 로 변경
## TCP헤더의 특정한 부분을 뽑아내어 암호화 알고리즘을 이용하는 방식으로 Three-way Handshake가 성공적으로 이루어지지 않으며
## 더이상 소스 경로를 거슬러 올라가지 않게 함으로써 적절한 연결 요청에 대해서만 연결을 맺기 위해 리소스를 소비하게 된다.

echo 0 > /proc/sys/net/ipv4/tcp_sack

echo 0 > /proc/sys/net/ipv4/tcp_timestamps
timestamps 기능은 불필요하므로 사용하지 않는다.

echo 2  > /proc/sys/net/ipv4/tcp_retries1
문제가 있는 상태에서의 TCP연결 재시도 횟수를 줄여준다( 기존 3으로 되어 있는 부분을 2로 변경)

echo 9999999 > /proc/sys/net/ipv4/tcp_max_syn_backlog
역시 syn flooding 공격과 관련된 설정인데, backlog queue의 사이즈를 늘려 공격에 대응하도록 한다.
또한 공격과는 관계없이 처리량이 많은 서버라면 이 값을 늘려주는 것이 좋다.
참고 자료
http://www.frozentux.net/ipsysctl-tutorial/ipsysctl-tutorial.html

echo 0 > /proc/sys/net/ipv4/tcp_window_scaling


echo 2000000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
 
 

 TCP: time wait bucket table overflow

 

bucket table 은 timewait socket 을 저장하는 table 입니다. 
즉, time wait 이 너무 많아서 bucket table 이 full이 된것입니다. 
sysctl 에서 이 값을 늘려 주시든지 또는 timewait 의 시간을 줄여 주시면 됩니다.

 


 # cat /proc/sys/net/ipv4/tcp_max_tw_buckets 
2700000

 

 # echo 3500000 > /proc/sys/net/ipv4/tcp_max_tw_buckets

# cat /proc/sys/net/ipv4/tcp_max_tw_buckets 
3500000

 

OR

 

/etc/sysctl.conf

net.ipv4.tcp_max_tw_buckets = 3500000

 

sysctl -p



echo 0 > /proc/sys/net/ipv4/ip_forward
해당 시스템을 통해 다른 시스템으로 패킷이 포워딩 되지 않도록 한다.
만약 시스템이 LVS나 라우터 등 게이트웨이 용도로 사용할 것이 아니라면 OFF로 하는 것이 좋다



echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_time

echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout
## FIN_TIMEOUT 대기 시간을 줄여준다.
## 기존 60으로 되어 있는 부분을 30으로 변경

echo 9999999 > /proc/sys/net/ipv4/route/max_size 
echo 10 > /proc/sys/net/ipv4/route/secret_interval

/proc/sys/net/ipv4/route/max_size = 2097152 => 인식 가능한 라우팅 개수
/proc/sys/net/ipv4/route/secret_interval = 600 => 라우팅을 캐시하는 시간 (600초 10분)
2097152/600=3495   => 초당 신규 라우팅 캐시를 3495개까지 인식 가능
따라서, 위의 경우 초당 4000개 이상의 소스ip에서 접속이 들어오면 시스템이 멈추게 됩니다.
따라서, 공격에 대비하여 아래와같이 설정하는것을 권장합니다.

##대응방법
(1) net.ipv4.route.max_size의 값을 최대한 늘리고 (예:8000000)
(2) net.ipv4.route.secret_interval의 값을 줄인다 (예10)
(3) 또는 ip route flush cache로 캐쉬를 즉시 clear시킨다.


echo 1 > /proc/sys/net/ipv4/conf/all/accept_redirects
icmp redirects를 허용하지 않는다. 만약 icmp redirects를 허용할 경우에는 공격자가 임의의
라우팅 테이블을 변경할 수 있게 되어 자신이 의도하지 않는 경로, 즉 공격자가 의도한 경로로 트래픽이 전달될 수 있는 위험이 있다.

echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
스푸핑된 패킷이나 소스 라우팅, redirect 패킷에 대해 로그 파일에 정보를 남긴다. 굳이 정보를 남기지 않기를 원한다면 이 값을 0으로 변경하면 된다.

echo "1024 ~ 65535" > /proc/sys/net/ipv4/ip_local_port_range
시스템의 local port로 사용할 수 있는 포트의 범위를 지정한다. 매우 busy한 시스템이라면 이 값을 크게 늘려 줄 필요가 있다


echo 1 >  /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 
# Broadcast로부터 오는 핑을 차단함(Smurt 공격을 차단함).

echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# IP 나 TCP 헤더가 깨진 bad icmp packet을 무시한다.


echo 3 > /proc/sys/net/ipv4/tcp_syn_retries
# 일정한 시간과 IP별로 보내고 받는 SYN 재시도 횟수를 3회로 제한한다.
# 이 옵션은 스푸핑된(위조된) 주소로 오는 SYN 연결의 양을 줄여준다.
# 기본 값은 5(180 초에 대응)이며 255를 넘지 않아야 한다.

echo 3 > /proc/sys/net/ipv4/tcp_synack_retries
# passive TCP 접속시도가 재접속을 하기 위한 SYNACKs의 값을 정한다. 255 보다 높
# 게 지정할 수 없다. 기본값은 5이며, 180초에 대응이 된다.

echo 2 > /proc/sys/net/ipv4/tcp_retries1
# 무언가 문제가 있을 때 연결을 위해 재시도 할 횟수, 최소 값과 기본 값은 3이다.




echo 0 > /proc/sys/net/ipv4/tcp_sack 

# SYN 패킷을 전송한 후에 로스가 발생을 하여 ACK 를 일부 받지 못했을 경우, 선택
# 적으로 (selected) 받지못한 ACK 만 받도록 요청하는 것을 허락한다. 로스가 많은
# 네트워크에서는 상당히 중요한 역할을 한다.

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

TCP TIME_WAIT Socket 재사용 여부. (사용) 
사용하지 않으면, 시스템 과부하시 TIME_WAIT Socket 증가로 인한 local port 소진에 의해 신규 Connection을 생성 못할 수 있다. 
기본값은 0인데, 1로 할경우 TIME-WAIT 상태의 소켓을 재사용할 수 있게 해줍니다. TIME-WAIT 문제를 피하기 위한 가장 확실한 방법이다. setsocketopt()에 SO_REUSEADDR을 사용한 것과 같은 효과.

net.ipv4.tcp_orphan_retries = 2
# 서버 쪽에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수를 정한다. 기본 값은 7 로
# RTO 50 초에서 16 분 사이에 해당한다. 웹 서버가 운영 중 이라면 이 값을 줄여서
# 소켓 등이 귀한 리소스를 소비하지 않도록 할 수도 있다.



(Default: 0)
참고 URL
http://javazone.co.kr/bbs/board.php?bo_table=n10&wr_id=1313


반응형