A.1. network

/proc/sys/net/ipv4/아래에 있는 파일들입니다. 여러분 머신에 설정된 값들을 보고싶다면 다음 명령을 사용하세요:

# cd /proc/sys/net/ipv4/
# grep [0-9] *

A.1.1. Global Parameters:

ip_forward - BOOLEAN

0 - disabled (default)

not 0 - enabled

인터페이스들 사이에서 패킷을 전달합니다.

이 변수는 특별해서, 값을 바꾸면 관련된 모든 패러미터들을 기본값으로 바꿉니다 (호스트는 RFC1122, 라우터는 RFC1812)

ip_default_ttl - INTEGER

TTL(Time To Live)은 IP 패킷 안에 들어있는 (대개 0부터 255 사이) 정수값으로 TTL이라는 말 그대로 패킷의 수명을 카운트합니다. 라우터 하나를 지날때마다 초기값에서 1 (혹은 그 이상)을 빼는데 값이 0이 되면 라우터는 그 패킷을 버리고 재전송을 요청하는 ICMP 메시지를 발신지 호스트에 보냅니다. 리눅스는 그 값이 255이나 윈도우95나 98의 TTL 기본 값은 32 홉으로 운영체제마다 다를 수 있습니다.

ping과 traceroute 유틸리티는 TTL 값을 사용하는 대표적인 프로그램인데 사용자가 TTL 값을 조정할 수 있으며 traceroute는 TTL 기본값을 30으로 낮추어 패킷을 전송합니다.

멀티캐스팅에서는 TTL 값이 패킷이 전달되어야 하는 범위나 구역을 가리킵니다.

  • 0은 같은 호스트로 제한된다.

  • 1은 같은 서브넷으로 제한된다.

  • 32는 같은 사이트로 제한된다.

  • 64는 같은 지역으로 제한된다.

  • 128은 같은 대륙으로 제한된다.

default 64

ip_no_pmtu_disc - BOOLEAN

MTU(Maximum Transmission Unit)는 프레임이나 패킷이 한번에 하나씩 전송될 때 통과할 수 있는 크기로 프로토콜마다 그 크기가 다릅니다. 예를 들어 이더넷에서는 1500이지만 X.25에서는 576입니다. Path MTU는 두 호스트사이 경로(path)에서 가장 작은 MTU 값입니다.

호스트가 같더라도 라우팅 경로나 프로토콜은 매번 바뀌므로 MTU 값도 계속 달라지게됩니다. 현재 패킷보다 작은 MTU 값을 가진 라우터를 통과할 때 패킷은 그 라우터 MTU에 맞춰 잘게 쪼개집니다. 수신하는 호스트에서는 그렇게 쪼개진 조각들을 모두 받아서 다시 재조립하는데, 그 가운데 한 조각이라도 drop되면 모든 조각을 다시 전송받아야 합니다. 이런 경우 라우터는 조각을 나누느라 바쁘고, 호스트는 재조립하느라 바빠지며, 재전송이 많아지는 등 퍼포먼스를 떨어트리게 됩니다.

이럴 때 pmtu discovery를 사용합니다. 먼저 패킷을 발송할 때 헤더에 DF(Don't Fragment) 비트를 설정해서 조각내지 말라고 알립니다. DF 비트가 설정된 패킷을 받은 라우터는 자신의 MTU보다 큰 경우 조각화하는 대신 Can't Fragment 에러와 MTU값을 돌려보냅니다. 그 값을 돌려받는 호스트가 라우터의 MTU 값에 맞추어 패킷을 다시 전송합니다. 조각나는 것을 피하면서 가장 큰 패킷을 보내기 위해 pmtu discovery를 사용하는 것입니다.

단, 이 기능을 사용하기 위해서는 ICMP 메시지 타입 3 가운데 code 4(Fragmentation Needed and Don't fragment)를 허용해야합니다.

default FALSE

A.1.2. IP Fragmentation:

ipfrag_high_thresh - INTEGER

IP 조각들을 재조합할 때 사용할 최대 메모리를 지정합니다. ipfrag_high_thresh 값이 지정되어 있으면, 프래그먼트 핸들러는 ipfrag_low_thresh에 다다를 때까지 패킷을 토스합니다.

ipfrag_low_thresh - INTEGER

ipfrag_high_thresh를 보세요

ipfrag_time - INTEGER

메모리에 IP 조각을 담아두는 시간을 초 단위로 설정합니다.

A.1.3. TCP variables:

tcp_syn_retries - INTEGER

활성 TCP 연결에서 재전송을 위해 지정한 시간만큼 지난 뒤에 초기화 SYN 패킷을 보냅니다. 255보다 클 수 없습니다. 기본값은 5인데 180초에 해당합니다.

tcp_synack_retries - INTEGER

Passive TCP 연결에서 재전송을 위해 지정한 시간만큼 지난 뒤에 초기화 SYNACK 패킷을 보냅니다. 255보다 클 수 없습니다. 기본값은 5인데 180초에 해당합니다.

tcp_keepalive_time - INTEGER

keepalive가 활성화되었을 때 얼마나 자주 keepalive 메시지를 내보낼 것인지 정합니다. 기본값은 2 시간입니다.

tcp_keepalive_probes - INTEGER

연결이 끊어졌다고 여길 때까지 keepalive probe를 얼마나 내보낼지 정합니다. 기본값은 9입니다.

tcp_keepalive_interval - INTEGER

얼마나 자주 probe를 내보낼지 정합니다. probe가 출발한 뒤에 tcp_keepalive_probes에 tcp_keepalive_interval을 곱한 만큼 시간이 지나면 응답하지 않는 연결을 죽입니다. 기본값은 75초입니다. 예를 들어 기본 값들을 그대로 두었을 때 11분 15초동안 재시도한 다음 연결을 취소할 것입니다.

tcp_retries1 - INTEGER

무언가 잘못되었고, 이런 의심스런 면을 네트워크 레이어에 알리는 것이 좋겠다고 판단하기 전에 몇번 확인해 볼지 정합니다. 최소 RFC 값은 3으로, RTO에서 3초에서 8분 사이에 해당합니다.

tcp_retries2 - INTEGER

살아있는 TCP 연결을 끊기 전에 확인하는 횟수를 정합니다. RFC1122는 100초보다 길게 제한하라 이릅니다. 하지만 너무 작은 값입니다. 기본값은 15로 RTO 13-30분에 해당합니다.

tcp_orphan_retries - INTEGER

우리 쪽에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수를 정합니다. 기본값은 7로 RTO 50초에서 16분 사이에 해당합니다. 여러분 머신에 웹 서버가 올라와 있다면 이 값을 줄여서 소켓 등이 귀한 리소스를 소비하지 않도록 할 수도 있습니다.

tcp_fin_timeout - INTEGER

우리 쪽에서 닫을 때 FIN-WAIT-2 상태인 소켓을 잡아둘 시간을 정합니다. 상대편은 깨어진 뒤에 스스로 닫지 못하거나 뜻하지 않게 죽어버릴 수도 있습니다. 기본 값은 60초입니다. 2.2에서 일반적인 값은 180초였는데 2.4에서도 이 값을 그대로 사용할 수 있지만, 여러분 머신이 웹 서버로 부하가 많다면 죽은 소켓들이 그대로 엄청나게 쌓여 메모리가 넘쳐나는 문제가 생길 것입니다. FIN-WAIT-2 소켓은 최대 1.5K 메모리만 잡아 먹으므로 FIN-WAIT-1 소켓보다는 덜 위험합니다. 그러나 더 오래 버티는 경향이 있습니다.

tcp_max_tw_buckets - INTEGER

시스템에서 동시에 잡아두는 timewait 소켓의 수를 정합니다. 이 값이 time-wait 소켓을 넘어서면 바로 파괴되고 경고가 출력됩니다. 이 제한은 단순한 DoS 공격을 방어하기 위해서만 필요하며, 기본값보다 작게해서는 절대 안됩니다. 네트워크 환경이 기본값보다 큰 값을 요구한다면 늘려도 됩니다 (아마, 설치된 메모리를 증설한 다음)

tcp_tw_recycle - BOOLEAN

빠른 재생 TIME-WAIT 소켓을 사용합니다. 기본값은 1입니다. 전문가의 조언/요청이 없다면 절대 바꾸지 마세요.

tcp_max_orphans - INTEGER

시스템에 고정되었거나, 사용자 파일 핸들에 연결되지 않은 TCP 소켓의 최대 값을 지정합니다. 고아 연결이 이 값을 초과하면 즉시 리셋되고 경고를 출력합니다. 이 제한은 단순한 DoS 공격을 방어하기 위해서만 필요하며, 기본값보다 작게해서는 절대 안됩니다. 네트워크 환경이 기본값보다 큰 값을 요구하거나 오래 버티어서 그런 문제들은 더 공격적으로 죽이기 위해 네트워크를 조율한다면 늘려도 됩니다 (아마, 설치된 메모리를 증설한 다음) 한번 더 당부하자면: 고아 연결들은 스왑할 수 없는 메모리를 각자 64K 이상 잡아먹습니다.

tcp_abort_on_overflow - BOOLEAN

리스닝 서비스가 새로운 연결을 수락하기에 너무 느리다면 그 서비스를 리셋합니다. 기본값은 FALSE입니다. 이 것은 갑자기 오버플로가 발생하더라도 연결이 복구된다는 뜻입니다. 리스닝 디먼이 연결을 더 빨리 수락하도록 자리잡지 못하는게 정말 확실할 때에만 이 옵션을 활성화하세요. 이 옵션을 활성화하면 여러분 서버에서 손상된 클라이언트라도 리슨합니다.

tcp_syncookies - BOOLEAN

커널을 컴파일할 때 CONFIG_SYNCOOKIES 를 활성화했을 때에만 사용가능합니다. 일반적으로 'syn flood attack'로 알려진 공격을 방어합니다. 기본값은 FALSE

syncookie는 예비 기능임을 기억해 두세요. 이 옵션은 합법적인 연결로 많은 부하가 걸리는 서버에서는 절대 사용하지 마세요. 여러분 로그에서 synflod 경고가 뜨지만, 알고보니 정상적인 연결이 과중해서 생긴거라면 경고 메시지가 사라질 때까지 다른 패러미터를 조율해보세요.

See: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.

syncookies 는 TCP 프로토콜에 심각하게 어긋나며, TCP 확장을 사용할 수 없으며, 특정 서비스(f.e. SMTP relaying)에 심각한 손상을 가져올 수 있습니다. 여러분에게 보이지 않더라도, 클라이언트들은 연계되어 여러분에게 닿아 있습니다. 로그에 synflood 경고가 남지만 진짜로 넘쳐난 것이 아니라면, 여러분 서버 설정이 아주 엉터리일 것입니다.

tcp_stdurg - BOOLEAN

TCP urg 포인터 필드 해석기가 필요할 때에 사용하세요. 대부분 오래된 BSD 해석기를 사용하는데, 리눅스가 그런 것들과 제대로 소통하지 못하는 듯 하다면 켜세요. 기본값은 FALSE

tcp_max_syn_backlog - INTEGER

연결한 클라이언트로부터 응답 패킷을 받지 못하고 있는 접속 요청을 몇 개나 기억하고 있을지 정합니다. 기본값은 1024로 128MB 이상 메모리를 가져야합니다. 그보다 작을 때에는 128을 사용하세요. 서버가 과부하에 허덕인다면 이 값을 늘리세요. 다만 1024 보다 크게 하려면 include/net/tcp.h 파일을 열어 TCP_SYNQ_HSIZE 값을 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog 공식에 맞추어 설정한 다음 커널을 다시 컴파일해야 합니다.

tcp_window_scaling - BOOLEAN

Enable window scaling as defined in RFC1323.

tcp_timestamps - BOOLEAN

Enable timestamps as defined in RFC1323.

tcp_sack - BOOLEAN

Enable select acknowledgments (SACKS).

tcp_fack - BOOLEAN

FACK 혼잡 회피와 빠른 재선송을 가능하게 합니다. tcp_sack가 활성화되지 않았다면 값이 사용되지 않습니다.

tcp_dsack - BOOLEAN

Allows TCP to send "duplicate" SACKs.

tcp_ecn - BOOLEAN

명백한 혼잡 공지(Explicit Congestion Notification).

tcp_reordering - INTEGER

Maximal reordering of packets in a TCP stream. Default: 3

tcp_retrans_collapse - BOOLEAN

망가진 프린터에 Bug-to-bug 호환. 더 큰 패킷을 다시 전송해서 어떤 TCP 스택에 있는 버그를 피해갑니다.

tcp_wmem - vector of 3 INTEGERs: min, default, max

min: TCP 소켓에서 send 버퍼를 위해 예약된 메모리 크기.Default: 4K

default: 이 값은 다른 프로토콜들에 의해 사용되는 net.core.wmem_default 값에 우선합니다. Default: 16K

max: TCP 소켓에서 자동으로 선택된 send 버퍼를 위한 최대 메모리 크기. 이 값보다 net.core.wmem_max 값이 우선합니다. Default: 128K

tcp_rmem - vector of 3 INTEGERs: min, default, max

min: TCP 소켓에 의해 사용되는 receive 버퍼의 최소 크기. Default: 8K

default: 이 값은 net.core.rmem_default에 우선합니다. Default: 87380 바이츠.

max: receiver 버퍼에서 사용할 수 있는 최대 크기. 이 값보다 net.core.rmem_max 가 우선합니다. Default: 87380*2 bytes.

tcp_rfc1337 - BOOLEAN

세팅되면 TCP 스택은 RFC1337을 따릅니다. 해제되면 RFC를 따르지 않지만 TCP TIME_WAIT asassination은 막아줍니다.

Default: 0

ip_local_port_range - 2 INTEGERS

TCP나 UDP에서 로컬 포트로 선택할 포트 범위를 정합니다. 첫 숫자가 첫 번호이고, 두번째 숫자가 마지막 로컬 포트번호입니다. 기본값은 시스템에서 사용할 수 있는 메모리에 따라 정해집니다.

128Mb 보다 큰 경우 32768-61000,

128Mb 보다 작은 경우 1024-4999 혹은 더 조금.

이 숫자는 TCP 확장(timestamp) 없이 동시에 열 수 있는 접속 수를 뜻합니다. tcp_tw_recycle을 설정했다면 timestamp 지원으로 1024-4999 범위로도 초당 2000 연결이 충분합니다.

ip_nonlocal_bind - BOOLEAN

세팅되면 프로세스가 로컬 IP가 아닌 주소에 bind()할 수 있습니다. 매우 유용한 기능이지만 어떤 어플리케이션에서는 나쁠 수 있습니다.

Default: 0

ip_dynaddr - BOOLEAN

0이 아닌 값을 세팅하면 동적 주소를(dynamic addresses) 지원합니다. 1보다 큰 값을 세팅하면 동적 주소가 다시 쓰여질 때마다 로그 메시지가 출력될 것입니다.

Default: 0

icmp_echo_ignore_all - BOOLEAN, icmp_echo_ignore_broadcasts - BOOLEAN

둘 가운데 하나라도 참이면 커널은 그 장비나 브로드캐스트/멀티캐스트 주소로 오는 모든 ICMP ECHO을 무시합니다. 만약 boardcast/multicast 주소의 ICMP ECHO 요청을 받아들이면 denial of service(DOS) packet flooding 공격에 이용 될 수 있습니다.

icmp_ratelimit - INTEGER

아래 icmp_ratemask와 일치하는 곳에서 ICMP 패킷을 보낼 수 있는 최대 빈도를 제한합니다.

0은 제한을 없애며 그 밖의 값은 최대 빈도를 의미합니다.

Default: 1

icmp_ratemask - INTEGER

매스크는 빈도를 제한할 ICMP 타입를 만듭니다.

Default: 6168

Note: 6168 = 0x1818 = 1<<ICMP_DEST_UNREACH + 1<<ICMP_SOURCE_QUENCH +1<<ICMP_TIME_EXCEEDED + 1<<ICMP_PARAMETERPROB, which means dest unreachable (3), source quench (4), time exceeded (11) and parameter problem (12) ICMP packets are rate limited (check values in icmp.h)

icmp_ignore_bogus_error_responses - BOOLEAN

어떤 라우터들은 브로드캐스트 프레임에 거짓 응답(bogus responses)을 해서 RFC 1122를 위반합니다. 그런 경우 일반적으로 커널 경고를 통해 기록됩니다. 이 값이 참이면 커널은 그런 경고를 남기지 않습니다. Default: FALSE

(1) Jiffie:

커널을 위한 내부 타임유닛입니다. i386에서 1/100 초, 알파에서 1/1024 초입니다. 여러분 시스템에 딱 맞는 값이 궁금하면 /usr/include/asm/param.h 에서 HZ define을 보세요.

igmp_max_memberships - INTEGER

멀티캐스트 그룹에 참여할 수 있는 최대 값을 바꿉니다.

Default: 20

conf/interface/*:

conf/all/* 아래 있는 것들은 모든 인터페이스에 적용할 값들입니다.

log_martians - BOOLEAN

불가능한 주소를 가진 패킷들을 커널 로그에 기록합니다.

accept_redirects - BOOLEAN

ICMP redirect 메시지를 허용합니다.

TRUE (host) FALSE (router)

forwarding - BOOLEAN

지정한 인터페이스에서 IP 포워딩을 허용합니다.

mc_forwarding - BOOLEAN

멀티캐스트 라우팅을 지원합니다. CONFIG_MROUTE 옵션을 넣어 커널을 컴파일해야 하며 mrouted 등 멀티캐스트 라우팅 디먼이 필요합니다.

proxy_arp - BOOLEAN

프록시 ARP 는 지정한 인터페이스와 연결된 다른 호스트의 ARP 주소를 대신 뿌려주고, 받습니다. 투명하게 동작하는 네트워크 장비에 반드시 필요합니다.

shared_media - BOOLEAN

RFC1620 미디어 공유 리다이렉트를 보내거나(라우터) 수락(호스트)합니다. 이 옵션 값이 0이면 한 장치에 설정된 서로 다른 서브넷을 직접 통신할 수 없습니다.

default TRUE

secure_redirects - BOOLEAN

디폴트 게이트웨이 목록에 올라있는 게이트웨이에만 ICMP 리다이렉트 메시지를 허용합니다.

default TRUE

send_redirects - BOOLEAN

라우터라면 다른 호스트로 ICMP 리다이렉트를 보냅니다. Default: TRUE

bootp_relay - BOOLEAN

BOOTP 릴레이 디먼이 있어야합니다

default FALSE

Not Implemented Yet.

accept_source_route - BOOLEAN

SRR 옵션으로 소스 라우팅 패킷들을 허용합니다.

default TRUE (router) FALSE (host)

이 값이 참이면 패킷 경로를 출발지에서 조작할 수 있으므로 IP 스푸핑 등에 악용될 수 있습니다

rp_filter - BOOLEAN

1 - RFC1812 권고에 따라 한쪽 네트워크만 연결된 호스트나 쪼개진 네트워크에서 라우터는 역경로 추적을 통해 출발지가 유효한지 판단합니다. 네트워크에서 네트워크로 연결하는 라우터에서 이 옵션을 1로 설정하면, 방화벽 규칙을 더 추가하지 않고, 내부 네트워크에서 시도하는 스푸핑 공격을 막습니다 (외부 스푸핑과 상관 없습니다).

느리고 불안정한 프로토콜을(RIP 따위) 사용하는 통짜 네트워크나 고정 라우트에서는 문제를 일으킬 수 있습니다.

기본값 0 - 소스 경로를 검사하지 않습니다.