본문 바로가기

Linux/Tip&Tech

커널 파라메터 관련


net.ipv4.icmp_echo_ignore_broadcasts = 1
  
// 브로드캐스트(broadcast) 요청에 반응하지 않도록 설정, smurf공격을 막을 수 있다

net.ipv4.icmp_ignore_bogus_error_responses = 1  
// 부적합한 오류 메시지 로그로 남기기

net.ipv4.tcp_fin_timeout = 30    
// 세션 종료후에 얼마나 세션연결을 유지하고 있을지를 초단위로 값으로 설정

net.ipv4.tcp_keepalive_time = 180   
// TCP 연결상태를 계속 유지시키기 위한 시간 설정이다. 기본 초단위로 7200, 즉 2시간이 기본값이다

net.ipv4.tcp_timestamps = 0
// 서버의 날짜정보 유출막기

net.ipv4.tcp_syncookies = 1    
// SYN Flooding 공격방어--SYN패킷의 도착빈도가 일정한 횟수보다 많을 때 해당 요청을 허용하지 않음

net.ipv4.tcp_max_syn_backlog = 1024   
// TCP프로토콜에서 한 소켓이 동시에 SYN요청을 처리하기에기는 한계가 있는데 이 한계가
    백로그(backlog)이다. 백로그는 연결 요청이 아직 완전히 처리되지 아니한 대기상태에
    있는 큐의 길이이다. 이 백로그 큐가 꽉차게 되면 이후 들어오는 SYN요청은 무시되며
    이러한 공격이 위에서 말한 SYN Flooding공격이다. 그러나, 백로그를 무조건 늘리는 것이
    꼭 좋은 것만은 아니다. 또한 1024이상으로 설정하려면 커널소스를 수정해야 한다.

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

net.ipv4.tcp_window_scaling = 1   
// 윈도우 스케일링 활성화 설정

net.ipv4.conf.all.accept_redirects = 0   
// redirect 관련 패킷을 허가할 것인지를 결정 ICMP redirect 패킷은 서버의 routing 경로를 확인하는
    역할은 한다. 이러한 패킷을 차단

net.ipv4.conf.all.send_redirects = 0   
// 서버에서 나가는 ICMP redirect패킷을 허가할 것인지를 결정

net.ipv4.conf.all.rp_filter = 1    
// IPv4는 인증 매카니즘을 가지고 있지 않기 때문에 Source IP Address를 조작할 수 있다.
    rp_filter는 패킷이 들어오는 인터페이스와 나가는 인터페이스가 같은 지를 검사한다

net.ipv4.conf.all.log_martians = 1   
// 스푸핑 패킷과 redirect된 패킷의 기록을 남길 지 여부를 지정하는 파일이다.
    기본값은 '0'으로 기록을 남기지 않는다. 값을 '1'로 바꾸면 패킷을 기록한다

net.ipv4.conf.all.accept_source_route = 0  
// 라우팅과 라우팅 프로토콜은 몇가지 문제점을 생성해 내는데 목적지의 경로에 대한 
    세부적인 내용을 담고 있는 IP 소스 라우팅은 목적지 호스트에서도 같은 경로를 따라
    반응을 해야 한다는 문제점이 있다. 크래커가 특정 네트워크에 소스 라우팅 패킷을 보낼
    수 있다면 돌아오는 반응을 가로채서 상대방의 호스트와 신뢰받은 호스트처럼 속일 수 
    있게된다. 이 기능을 사용하지 못하게 값을 0으로 한다.

#net.ipv4.ip_local_port_range = 32768 61000  
// 서버내의 TCP와 UDP에서 사용할 수 있는 포트범위의 값을 지정

vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
vm.buffermem = 80 10 60'>/etc/sysctl.conf


net.ipv4.ip_forward = 0     
// 인터넷 공유나 IP 마스커레이드등 하나의 서버에서 IP를 공유하여 포워딩 여부 설정

kernel.sysrq = 1      
// magical key 설정. 커널이 완전히 죽지 않았다면 응답 함으로 커널 패닉시에도 리붓팅등이 가능


kernel.core_uses_pid = 1     
// core.(process number) 형식을 core로만 남도록 설정하기

- vm에 관련된 내용 -

가상 메모리 관련 최적화

가상 메모리(Virtual Memory, VM) 기법은 기억장치 관리에 있어 멀티 태스킹을
지원하기 위한 가장 기본적인 부분이다. VM은 하나의 프로그램이 실행될 때 프로그램
전체가 메모리에서 실행되지 않고 현재 실행에 필요한 부분만을 불러와 실행하는
기법을 기본으로 하며, 데이터 파일도 비슷한 방법으로 관리된다. 즉, 특정 데이터에
접근하기 위해 해당 파일 전체를 메모리로 불러들이지 않고 특정 부분만을 읽어와
메모리를 절약할 수 있다.

일반적으로 파일은 가상으로 분할돼 있는데 한 번 접근시 이미 분할된 부분을
한꺼번에 메모리로 읽어온다. 필요한 부분만 정확히 읽어오면 되겠지만, 이렇게
하려면 시간이 많이 걸리므로 미리 파일들을 분할해 메모리로 읽어들이기 편하게
만들어 놓는다. 이는 하드 디스크를 섹터 단위로 나눠 쓰는 원리와 비슷하다. 분할된
각 부분을 보통 블럭이라 하며, 보통 512∼4KB 크기로 나누어 놓는다. 각 나뉜 블럭의
크기가 일정한 것을 페이징(paging) 기법이라 하며, 일정하지 않는 것을
세그멘테이션(segmentation) 기법이라 한다. 즉, VM 기법은 하드 디스크 등의 블럭
디바이스에 관련한 입출력을 관리하는 기법이라 생각할 수도 있다. 동시에 처리할 수
있는 태스크 수와 효율은 VM의 동작에 따라 좌우되는데, 먼저 살펴볼 내용은
bdflush의 동작 설정이다.

bdflush

bdflush는 블럭 디바이스 입출력 버퍼를 관리하는 커널 데몬이다. 주로 버퍼를 비우는
중대한 일을 맡고 있다. 하드 디스크에 쓰여질 데이터는 바로 하드 디스크로 전달되지
않고 버퍼에 저장됐다가 전달된다. 이는 하드 디스크를 제어하는데 많은 자원을
소모하므로 버퍼에 쓸 내용을 모았다가 버퍼의 상태 또는 특정 시간마다 하드
디스크에 써넣기 위한 것이다. bdflush는 이때의 버퍼 관리를 한다. bdflush의 동작
설정은 래드햇 6.2부터 약간 바뀌었는데 우선 6.1까지는 /proc/sys/vm/bdflush에
설정값을 직접 전달하거나 /etc/rc.d/rc.local에 스크립트를 만들어줘야 했다.
6.2에서는 /etc/sysctl.conf 파일에서 설정을 바꿔주는 형태로 바뀌었다.

bdflush의 설정값은 9개의 필드로 구성되며, 기본적으로 ‘40 500 64 256 500 3000
500 1884 2’로 돼 있는데 이게 어떤 값을 가리키는지 궁금할 것이다. 우선 각 필드가
나타내는 값의 의미를 살펴보자.

nfract

9개의 필드로 구성된 bdflush의 설정값 중 가장 앞에 나오는 40은 전체 버퍼 캐시의
더티 버퍼(dirty buffer) 비율을 나타낸다. 여기서 ‘더티’는 주로 버퍼에서 비워질
내용을 말하는데, 즉 프로세스에서 모디파이돼 하드 디스크에 쓰여질 데이터를
의미한다. 버퍼에서 하드 디스크에 쓸 내용이 담긴 버퍼를 더티 버퍼라 한다. 쉽게
말해 하드 디스크에 쓰여질 데이터를 저장한 버퍼다. 40으로 설정됐다면 전체 버퍼
캐시의 더티 버퍼 크기가 40% 이하가 되게 한다. 40%가 되면 더티 버퍼의 내용을 하드
디스크에 기록하고 버퍼를 비우기 위한 시도를 한다. 값이 클수록 하드 디스크에
쓰여질 데이터는 오래 기다리며, 값이 작을 경우 하드 디스크로의 접근이 빈번해 전체
시스템의 수행 속도가 느려질 수 있다.

ndirty

두 번째 값인 500은 하드 디스크에 한번에 기록하는 버퍼의 크기를 나타낸다. 500으로
설정돼 있으므로 한번 하드 디스크에 기록을 할 때 500개의 더티 버퍼가 사라진다. 이
값 또한 작을수록 하드 디스크로의 접근이 빈번하게 일어난다.

nrefill

세 번째 값은 사용하지 않는 버퍼들의 리스트 작성에 사용한다. 64로 돼 있는데 이는
한번에 64개의 빈 버퍼를 만들라는 것이다. 이 값은 클수록 전체 메모리 낭비를
가져오지만 입출력 버퍼가 증가해 하드 디스크 접근 속도를 높일 수 있다.

기타 bdflush 설정 항목

nref_dirt : bdflush가 동작하는 경계를 나타낸다. 기본값이 256인데 더티 버퍼가 256
이상이면 bdflush가 동작한다.
dummy1 : 사용하지 않는 값이다.
age_buffer : 더티 버퍼의 수명을 말한다. 각 더티 버퍼는 생성된 후 최대
age_buffer에 나타난 시간이 지나기 전에 디스크에 기록된다는 의미다.
age_super : supper block의 수명을 나타낸다.
dummy2 : 사용되지 않는 값
dummy3 : 사용되지 않는 값
bdflush의 설정을 “100 1200 128 512 15 5000 500 1884 2”로 바꾸려면 래드햇 6.1
이하에서는 다음과 같이 하면 된다.

[root@maso]# echo “100 1200 128 512 15 5000 500 1884 2”>
/proc/sys/vm/bdflush

부팅시에 변경된 값을 자동으로 적용시키려면 “/etc/rc.d /rc.local” 스크립트에
위에서 사용한 명령어를 추가시키면 된다. 래드햇 6.2에서는
“/etc/systcl.conf”에서 vm.flush의 값을 다음과 같이 수정한다.

vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

buffermem

buffermem은 전체 메모리에서 버퍼로 사용할 수 있는 양을 제어하는 파일이다.
bufermem의 설정값은 min_percent, borrow_ percent, max_percent로 이뤄졌으나
min_percent만 사용하며, 나머지 두 값은 사용하지 않는다. min_percent 값은 전체
메모리에서 버퍼로 사용할 수 있는 최소량을 %로 표시한다. 일반적으로 buffermem
값은 ‘80 10 60’으로 설정돼 있다. 설정을 바꾸는 방법은 bdflush의 경우와 같다.
래드햇 6.1 이하에서는 다음과 같이 한다.

[root@maso]# echo “80 10 60”>/proc/sys/vm/buffermem

래드햇 6.2에서는 “/etc/systcl.conf”의 vm.buffermem의 값을 다음과 같이 바꾼다.

vm.buffermen = 80 10 60

새로 설정된 값을 적용하기 위해서는 재부팅이 일반적이지만, inetd 관련 프로세스만
새롭게 다시 시작시켜줘도 된다.


 

- Smuf 공격 -

DoS 공격의 한 방법으로 공격자가 Source IP Address를 Target으로 위장하여 네트워크로 ICMP echo request를 보내어
Target이 정상적으로 서비스를 할 수 없도록 만드는 기법


 

'Linux > Tip&Tech' 카테고리의 다른 글

MySQL 유용한 명령어 모음 #1 - SHOW  (0) 2009.06.17
tcpdump  (0) 2009.06.09
whowatch  (0) 2008.10.09
Areca 드라이버 올리는 방법  (0) 2008.10.09
img mount  (0) 2008.10.09