## Linux 용 커널 sysctl 구성 파일## 버전 1.14 - 2019-04-05# Michiel Klaver - IT Professional# http://klaver.it/linux/ for the latest version - http://klaver.it/bsd/ for a BSD variant## 이 파일은 /etc/sysctl.conf 에 저장되어야 하며 명령을 사용하여 활성화할 수 있음 :# sysctl -e -p /etc/sysctl.conf## 이진 값의 경우 0은 비활성화되고 1은 활성화됨. 자세한 내용은 sysctl(8) 및 sysctl.conf(5)를 참조할 것!## 테스트 환경 : Ubuntu 14.04 LTS 커널 버전 3.13# Debian 7 커널 버전 3.2# CentOS 7 커널 버전 3.10### RAM 및 사용가능한 대역폭의 부하가 예상되는 고속 네트워크에 맞게 설정함# 최적화 된 높은 연결 속도와 고성능 Web/FTP/Mail/DNS 서버에 맞게 설정함# 단, 큰 네트워크라든지 xDSL/Cable 연결에는 적용하지 마세요!!! (Packet Loss 될 수 있음)# ----------## 크레딧 :# http://www.enigma.id.au/linux_tuning.txt# http://www.securityfocus.com/infocus/1729# http://fasterdata.es.net/TCP-tuning/linux.html# http://fedorahosted.org/ktune/browser/sysctl.ktune# http://www.cymru.com/Documents/ip-stack-tuning.html# http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt# http://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/index.html# http://knol.google.com/k/linux-performance-tuning-and-measurement# http://www.cyberciti.biz/faq/linux-kernel-tuning-virtual-memory-subsystem/# http://www.redbooks.ibm.com/abstracts/REDP4285.html# http://www.speedguide.net/read_articles.php?id=121# http://lartc.org/howto/lartc.kernel.obscure.html# http://en.wikipedia.org/wiki/Sysctl# https://blog.cloudflare.com/http-2-prioritization-with-nginx/####### 일반 시스템 보안 옵션 ####### 커널의 시스템 요구 디버깅 기능을 제어함# 시스템에서 매직키 비활성화# 여기서 매직키란 시스템을 Lock 하지 않은 상태에서 시스템이 어떤 작업을 하는 중이라도 커널이 반응하는 키임# 물리적 보안을 위해서 비활성화시킴kernel.sysrq=0# 코어 덤프가 코어 파일 이름에 PID 를 추가할지 여부를 제어함# 멀티스레드 어플리케이션 디버깅에 유용함kernel.core_uses_pid=1# PID 의 최대값 설정kernel.pid_max=65535# /proc/<pid>/maps, smaps 의 내용을 단지 관리자만 볼수 있으며 ptrace() 과정을 허용함kernel.maps_protect=1# kernel.exec-shield 설정은 NX(Not eXecutable) 기법과 관련된 설정임# kernel.exec-shield = 0 ---> ExecShield 보호 비활성화# kernel.exec-shield = 1 ---> ExecShield 보호 활성화kernel.exec-shield=1# kernel.randomize_va_space 설정은 ASLR 기법과 관련된 설정임# ASLR(Address Space Layout Randomization) 이란 메모리상의 공격을 어렵게 하기 위해 스택이나 힙, 라이브러리 등의 주소를 랜덤으로 프로세스 주소 공간에 배치함으로써 실행할 때 마다 데이터의 주소가 바뀌게 하는 기법# kernel.randomize_va_space = 0 ---> ASLR 해제# kernel.randomize_va_space = 1 ---> 랜덤 스택 & 라이브러리 활성화# kernel.randomize_va_space = 2 ---> 랜덤 스택 & 라이브러리 & 힙 활성화kernel.randomize_va_space=2# 메시지의 최대 크기 (바이트 단위)kernel.msgmnb=65535# 하나의 프로세스에서 다른 프로세스로 보내질 수 있는 메시지 큐의 최대 크기 (바이트 단위)kernel.msgmax=65535# 코어 덤프 제한fs.suid_dumpable=0# 커널 포인트 숨기기# non-root 유저가 kallsyms 등을 통해서 커널영역 포인터값을 보지 못하게 하는 설정임kernel.kptr_restrict=1###### 시스템 메모리 관리 개선 ####### 파일 핸들과 inode 캐시의 크기를 늘림fs.file-max=262144# 덜 바꾸기# vm.swappiness - swapping 비율로 적게 설정# vm.dirty_ratio - 전체 시스템 메모리에서 Dirty Page 비율로 Process가 Dirty Page 를 쓰기 시작하는 기준값임# vm.dirty_background_ratio - 전체 시스템 메모리에서 dirty page 비율로 pdflush 데몬이 dirty page 를 쓰기 시작하는 기준값임# 참고 사이트 : http://small-dbtalk.blogspot.kr/2014/03/linux-kernel-parameters-and-mysql_2226.htmlvm.swappiness=30vm.dirty_ratio=30vm.dirty_background_ratio=5# 프로세스가 mmap 이 허용되는 가상 주소를 최소로 지정# mmap 이란 프소세스 간 데이터 공유 메커니즘임vm.mmap_min_addr=4096# 사용 가능한 메모리의 50 % 초과 사용# vm.overcommit_ratio - overcommit_memory 가 2 로 설정되어 있는 경우 고려해야 할 물리적 RAM의 백분율을 지정함 (기본값은 50)# vm.overcommit_memory - 대량 메모리 요청을 수락 또는 거부할 지에 대해 결정하는 조건 설정# vm.overcommit_memory = 0 ---> 기본 설정임. 커널은 사용 가능한 메모리 양을 추정하고 잘못된 요청을 실패시켜 휴리스틱 메모리 오버커밋 처리를 수행함. 불행히도 메모리는 정확한 알고리즘이 아닌 휴리스틱 알고리즘을 사용하여 할당되므로 이러한 설정은 시스템에서 사용가능한 메모리가 오버로드되게 할 수 있음.# vm.overcommit_memory = 1 ---> 커널은 메모리 오버커밋 처리를 수행하지 않음. 이러한 설정에서 메모리 오버로드 가능성은 증가하므로 메모리 집약적 작업을 위한 성능임.# vm.overcommit_memory = 2 ---> 커널은 총 사용 가능한 스왑의 합계와 overcommit_ratio에 지정된 물리적 RAM의 백분율 보다 메모리가 크거나 동일한 경우 요청을 거부함. 메모리 오버커밋의 위험을 줄이고자 할 경우 이 설정이 가장 적합함.# 참고 사이트 : https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-captun.html## redis에서 vm.overcommit_memory=1을 요구함vm.overcommit_ratio=50vm.overcommit_memory=1# shm 에 할당된 최대 메모리 양을 256 MB 로 설정함# shmmax - 공유 메모리 세그먼트 최대 크기를 설정함# shmall - 특정 시점에서 시스템에서 사용 가능한 공유 메모리의 최대 크기를 설정함# 참고 사이트 : http://iblog.or.kr/hungi/it/os/linux/1666kernel.shmmax=268435456kernel.shmall=268435456# 최소 64 MB 의 사용 가능한 RAM 공간을 확보함# 시스템 전체에 걸쳐 빈 공간으로 두는 최소 크기 설정값임 (단위 KB)# 사용 가능한 RAM 공간을 64MB 이상을 유지함# 이 값은 각각의 낮은 메모리 영역에서 워터마크 값을 계산하는데 사용되며 그 후 그 크기에 비례하여 저장된 빈 페이지 수를 할당함# 참고 사이트 : https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-captun.htmlvm.min_free_kbytes=65535# global memoryvm.vfs_cache_pressure=10000# elasticsearchvm.max_map_count=262144###### 일반 네트워크 보안 옵션 ####### SYN 공격을 막고 SYNcookies 를 활성화함 (max_syn_backlog 에 도달하면 시작할 것임)net.ipv4.tcp_syncookies=1net.ipv4.tcp_syn_retries=2net.ipv4.tcp_synack_retries=2net.ipv4.tcp_max_syn_backlog=4096# 패킷 포워딩 활성화net.ipv4.ip_forward=1net.ipv4.conf.all.forwarding=1net.ipv4.conf.default.forwarding=1net.ipv6.conf.all.forwarding=1net.ipv6.conf.default.forwarding=1# IP 소스 라우팅 활성화net.ipv4.conf.all.send_redirects=1net.ipv4.conf.default.send_redirects=1net.ipv4.conf.all.accept_source_route=1net.ipv4.conf.default.accept_source_route=1net.ipv6.conf.all.accept_source_route=1net.ipv6.conf.default.accept_source_route=1# IP 스푸핑 방지 활성화시키고 소스 경로 확인 켜기net.ipv4.conf.all.rp_filter=1net.ipv4.conf.default.rp_filter=1# ICMP 리다이렉션 허용 활성화net.ipv4.conf.all.accept_redirects=1net.ipv4.conf.default.accept_redirects=1net.ipv4.conf.all.secure_redirects=1net.ipv4.conf.default.secure_redirects=1net.ipv6.conf.all.accept_redirects=1net.ipv6.conf.default.accept_redirects=1# 스푸핑 패킷, 소스 라우팅 패킷, 리다이렉션 패킷의 로그 활성화net.ipv4.conf.all.log_martians=1net.ipv4.conf.default.log_martians=1# tcp_fin_timeout 연결의 시간 기본값을 줄임# Decrease the time default value for tcp_fin_timeout connectionnet.ipv4.tcp_fin_timeout=7# 연결을 유지하는 데 걸리는 시간을 줄임# net.ipv4.tcp_keepalive_time - TCP/IP가 대기 연결이 계속 원래 상태를 유지하는지 확인을 시도하는 빈도값 (성능향상을 위해서 감소)# net.ipv4.tcp_keepalive_probes - TCP/IP가 기존 연결에 대한 수신확인되지 않은 활성화 상태 지속 메시지를 재전송하는 횟수를 결정하는 값 (성능향상을 위해서 감소)# net.ipv4.tcp_keepalive_intvl - 상대로부터 활성화 상태 지속 응답이 수신되지 않을 경우 TCP/IP에서 활성화 상태 지속 전송을 반복하는 빈도를 결정하는 값 (성능향상을 위해서 감소)# 참고 사이트 : http://publib.boulder.ibm.com/wasce/V1.0.1/ko/Tasks/Tuning/Linux.htmlnet.ipv4.tcp_keepalive_time=300net.ipv4.tcp_keepalive_probes=5net.ipv4.tcp_keepalive_intvl=15# bootp 릴레이 비활성화net.ipv4.conf.all.bootp_relay=0# proxy arp 실행 비활성화 (누구든지 proxy arp 하지 마라!)net.ipv4.conf.all.proxy_arp=0# tcp_timestamps 기능 활성화# 정확한 타임 스탬프는 TCP 혼잡 제어 알고리즘이 더 잘 작동함net.ipv4.tcp_timestamps=1# ping 응답 활성화net.ipv4.icmp_echo_ignore_all=1# 브로드캐스트 요청 무시 비활성화net.ipv4.icmp_echo_ignore_broadcasts=0# 잘못된 오류 메시지 보호 활성화net.ipv4.icmp_ignore_bogus_error_responses=1# 로컬 포트 범위 설정# 원하는 대역대로 설정net.ipv4.ip_local_port_range=49152 65535# 세팅되면 TCP 스택은 RFC1337 을 따름# 해제되면 RFC를 따르지 않지만 TCP TIME_WAIT asassination 은 막아줌# net.ipv4.tcp_max_tw_buckets 값을 줄이고 net.ipv4.tcp_rfc1337 값을 설정하는게 나음net.ipv4.tcp_rfc1337=1# 자동 구성 IPv6 비활성화net.ipv6.conf.all.autoconf=0net.ipv6.conf.all.accept_ra=0net.ipv6.conf.default.autoconf=0net.ipv6.conf.default.accept_ra=0net.ipv6.conf.eth0.autoconf=0net.ipv6.conf.eth0.accept_ra=0###### 네트워크 성능 튜닝 ####### BBR TCP 혼잡 제어를 사용하고 tcp_notsent_lowat 을 16384 로 설정하여 HTTP/2 버전이 우선 순위가 최적으로 작동하도록 함# modprobe tcp_bbr 먼저 수행하며(커널 4.9 버전 이상) bbr 을 사용할 수 없는 경우 htcp 로 폴백(Fall-back)함net.ipv4.tcp_congestion_control=htcpnet.ipv4.tcp_congestion_control=bbrnet.ipv4.tcp_notsent_lowat=16384# tcp-heavy 작업 부하가있는 서버의 경우 'fq' 큐 관리 스케줄러를 활성화함 (커널 3.12 버전 이상)# FQ 란 혼잡제어를 위한 Queuing 메커니즘 중의 하나로 입력 트래픽의 큐에 대하여 공평하게 서비스되도록 스케줄링 기법을 수행하는 메커니즘net.core.default_qdisc=fq# tcp_window_scaling 기능 활성화net.ipv4.tcp_window_scaling=1# 읽기 버퍼 공간 할당량 증가# net.ipv4.tcp_rmem - TCP 수신 버퍼# net.ipv4.udp_rmem_min - UDP 수신 버퍼 최소량# net.core.rmem_default - 모든 프로토콜 수신 버퍼# net.core.rmem_max - 모든 프로토콜 수신 버퍼 최대량# 참고 사이트 : http://kensei.co.kr/289net.ipv4.tcp_rmem=8192 6553616777216net.ipv4.udp_rmem_min=16384net.core.rmem_default=262144net.core.rmem_max=16777216# 쓰기 버퍼 공간 할당량 증가# net.ipv4.tcp_wmem - TCP 송신 버퍼# net.ipv4.udp_wmem_min - UDP 송신 버퍼 최소량# net.core.wmem_default - 모든 프로토콜 송신 버퍼# net.core.wmem_max - 모든 프로토콜 송신 버퍼 최대량# 참고 사이트 : http://kensei.co.kr/289net.ipv4.tcp_wmem=8192 6553616777216net.ipv4.udp_wmem_min=16384net.core.wmem_default=262144net.core.wmem_max=16777216# 수신 연결 갯수 증가net.core.somaxconn=32768# 수신 연결 로그수 증가net.core.netdev_max_backlog=16384net.core.dev_weight=64# 옵션 메모리 버퍼의 최대 크기 증가net.core.optmem_max=65535# TIME_WAIT 상태 소켓 최대 설정값으로 간단한 DoS 공격을 방어하기 위해 해당 값 증가net.ipv4.tcp_max_tw_buckets=1048576# 시간 대기 연결을 재사용하려고 시도하지만 재사용하지 않음 (재사용으로 인해 NAT 뒤에 위치한 클라이언트가 손상될 수 있음)# net.ipv4.tcp_tw_recycle - TCP TIME_WAIT 소켓 재활용 여부 결정함. Packet Reordering 이 발생하여 Timestamp 역전 현상이 발생하면 클라이언트로 부터 수신한 SYN Packet 이 Drop 됨.# net.ipv4.tcp_tw_reuse - TCP TIME_WAIT 소켓 재사용 여부 결정함. 해당 옵션을 사용하지 않으면 시스템 과부하 시 TIME_WAIT 소켓 증가로 인한 로컬 포트 소진에 의해 신규 연결을 생성하지 못할 수 있음.# 참고 사이트 : http://linux.systemv.pe.kr/%EB%B2%88%EC%97%AD-%EB%B0%94%EC%81%9C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-tcp-time-wait-%EC%83%81%ED%83%9C-%EB%8C%80%EC%B2%98%ED%95%98%EA%B8%B0/# http://kikiho.tistory.com/entry/Linux-TIMEWAIT-State-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACnet.ipv4.tcp_tw_recycle=0net.ipv4.tcp_tw_reuse=1# 고아(orphan)의 수를 제한함# 각 고아는 스왑 불가능한 메모리의 16 M 까지 막을 수 있음# net.ipv4.tcp_max_orphans - 사용자 파일 핸들에 연결되어 있지 않아서 시스템이 가지고 있는 TCP 소켓의 최대 개수임. 이 개수를 초과하면 고아(orphan) 연결은 즉시 초기화 되고 경고가 출력됨. 단순한 DoS 공격 방어에 효율적이며 너무 의존하거나 제한값을 억지로 낮춰선 안 됨. 각각의 고아 연결은 스왑 불가능한 메모리 16M (max wmem) 를 잡아먹음.# net.ipv4.tcp_orphan_retries - 우리쪽에서 닫은 TCP 연결을 죽이기 전까지 몇 번이나 재시도를 할 것인가 여부# 참고 사이트 : http://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c01418125&sp4ts.oid=465646&lang=en-us&cc=usnet.ipv4.tcp_max_orphans=16384net.ipv4.tcp_orphan_retries=0# IP 조각 재구성에 사용되는 최대 메모리 제한 (CVE-2018-5391)# net.ipv4.ipfrag_high_thresh - IP 조각 재조립에 쓰이는 최대 메모리 (설정값 증가시켜야 함)# net.ipv4.ipfrag_low_thresh - IP 조각 재조립에 쓰이는 최소 메모리# 참고 사이트 : http://tei827.tistory.com/44net.ipv4.ipfrag_low_thresh=131072net.ipv6.ip6frag_low_thresh=131072net.ipv4.ipfrag_high_thresh=262144net.ipv6.ip6frag_high_thresh=262144# 이전 연결에서 ssthresh 캐시를 하지 않음net.ipv4.tcp_no_metrics_save=1net.ipv4.tcp_moderate_rcvbuf=1# RPC 데이터그램 큐 길이 크기 증가net.unix.max_dgram_qlen=50# ARP 캐시에 유지되는 최대 항목 수임 (2048 보더 더 혀용하지 말 것!)# 참고로# gc_thresh1 - minumum (default 128)# gc_thresh2 - soft maximum (default 512)# gc_thresh3 - hard maximum (default 1024)# 참고 사이트 : http://infoages.tistory.com/1466# http://qahuni.egloos.com/2517195net.ipv4.neigh.default.gc_thresh3=2048# ARP 캐시에 유지되는 Soft 최대 항목 수임# GC(Garbage Collector)가 실행되기 전에 5초 동안 항목 수가 초과하는 것을 허용함# LAN 크기에 따라 조정해야 하며 1024는 /24 네트워크에 적합함net.ipv4.neigh.default.gc_thresh2=1024# ARP 캐시에 유지되는 최소 항목 수임# 해당 값보다 적을 경우 GC(Garbage Collector)가 실행되지 않음net.ipv4.neigh.default.gc_thresh1=32# ARP 캐시에 GC(Garbage Collector)가 실행하는 시간 간격net.ipv4.neigh.default.gc_interval=30# TCP 큐 길이 증가net.ipv4.neigh.default.proxy_qlen=96net.ipv4.neigh.default.unres_qlen=6# 명백한 혼합 공지(Explicit Congestion Notification, RFC 3168 참조)를 사용하도록 설정하고 작동하지 않은 경우 해제해야 함# net.ipv4.tcp_ecn - 명백한 혼합 공지(Explicit Congestion Notification) 활성화# net.ipv4.tcp_reordering - TCP 스트림에 패킷들의 최대 재요청 설정값net.ipv4.tcp_ecn=1net.ipv4.tcp_reordering=3# net.ipv4.tcp_retries1 - 무언가 문제가 있을 때 연결을 위해 재시도할 횟수 (최소 값과 기본 값은 3)# net.ipv4.tcp_retries2 - TCP 연결을 끊기 전에 재시도할 횟수net.ipv4.tcp_retries1=3net.ipv4.tcp_retries2=15# 연결이 유휴 상태가 된 후에 천천히 시작하는 것을 피할 것!# keep alive 연결로 혼잡 윈도우 크기(cwnd)를 크게 유지함 (커널 3.6 버전 이상)net.ipv4.tcp_slow_start_after_idle=0# TCP fastopen flag 기능 활성화 (커널 3.7 버전 이상)# 원래 TCP fastopen flag 기능은 구글 크롬에서 사용되던 기능으로 TCP 3-Hand Negotiation 과정을 몇 단계 생략하여 접속을 빠르게 하는 기능임# 몇몇 방화벽에서는 TFO(TCP fastopen) 기능을 좋아하지 않아 조심히 쓸 것!net.ipv4.tcp_fastopen=3# 라우팅 캐시 청소 기능 활성화net.ipv4.route.flush=1net.ipv6.route.flush=1###### 의견 / 제안 / 추가는 환영합니다!#### webstormfs.inotify.max_user_watches=524288