본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
실행 중인 리눅스 커널의 매개변수(커널 변수)를 조회하고 바꾼다.
  • 리눅스에서만 지원
  • 경로 : /usr/sbin/sysctl (예전 배포판은 /sbin/sysctl)
  • 패키지 : procps-ng (데비안 계열은 procps)

커널 변수는 /proc/sys 아래에 파일 하나씩으로 드러나 있다. sysctl 이 쓰는 변수 이름은 그 경로에서 /proc/sys/ 를 빼고 / 를 . 으로 바꾼 것이다.

sysctl 변수 이름 /proc 파일
net.ipv4.ip_forward /proc/sys/net/ipv4/ip_forward
net.ipv4.tcp_keepalive_time /proc/sys/net/ipv4/tcp_keepalive_time

그래서 같은 값을 바꾸는 방법이 두 가지다. 둘 다 곧바로 적용되지만 재부팅하면 원래 값으로 돌아간다.

# sysctl -w net.ipv4.ip_forward=1
# echo 1 > /proc/sys/net/ipv4/ip_forward

재부팅 뒤에도 남기려면 /etc/sysctl.conf 나 /etc/sysctl.d/*.conf 에 변수 = 값 꼴로 적고 sysctl -p(또는 sysctl --system)로 읽어 들인다.

sysctl [옵션] [변수[=값]] ...
  • -a, --all : 모든 커널 변수와 값을 출력한다.
  • -w, --write : 변수=값 으로 값을 바꾼다.
  • -p [파일], --load : 파일(기본 /etc/sysctl.conf)에 적힌 설정을 읽어 적용한다.
  • --system : /etc/sysctl.d, /run/sysctl.d, /usr/lib/sysctl.d 와 /etc/sysctl.conf 를 모두 읽어 적용한다.
  • -n : 변수 이름 없이 값만 출력한다.
  • -e : 모르는 변수에 대한 오류를 무시한다.

자주 쓰는 변수

편집 원본 편집
변수 뜻 기본값
net.ipv4.ip_forward 1 이면 다른 호스트로 가는 패킷을 넘겨준다(라우터 역할) 0
net.ipv4.icmp_echo_ignore_all 1 이면 모든 ping(ICMP Echo 요청)에 응답하지 않는다 0
net.ipv4.icmp_echo_ignore_broadcasts 1 이면 브로드캐스트 ping 에 응답하지 않는다(스머프 공격 방어) 1
net.ipv4.tcp_syncookies 1 이면 SYN 쿠키로 SYN 플러딩을 막는다 1
net.ipv4.tcp_max_syn_backlog SYN_RECV 상태로 기다릴 수 있는 연결 수 메모리 크기에 따라 다르다
net.ipv4.tcp_keepalive_time 데이터가 오가지 않는 연결을 확인 없이 유지하는 시간. 이 시간이 지나면 상대가 살아 있는지 묻는 keepalive 패킷을 보낸다. 단위는 초 7200 (2시간)
net.ipv4.tcp_keepalive_intvl keepalive 패킷에 응답이 없을 때 다시 보내는 간격(초) 75
net.ipv4.tcp_keepalive_probes 응답이 없을 때 몇 번 더 보내고 연결을 끊을지 9
net.ipv4.tcp_fin_timeout 먼저 연결을 끊은 쪽이 FIN_WAIT2 상태로 상대의 FIN 을 기다리는 시간(초). 열린 연결을 유지하는 시간이 아니다 60
kernel.hostname 호스트 이름
fs.file-max 시스템 전체에서 열 수 있는 파일 수
vm.swappiness 스왑을 얼마나 적극적으로 쓸지. 클수록 일찍 스왑한다 60

예: 연결 유지 시간을 3시간으로

편집 원본 편집

3시간은 10800 초이므로 tcp_keepalive_time 에 10800 을 넣는다.

# echo 10800 > /proc/sys/net/ipv4/tcp_keepalive_time
# sysctl -w net.ipv4.tcp_keepalive_time=10800
# sysctl net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 10800
  • 둘째 줄은 첫째 줄과 같은 일을 한다. 둘 중 하나만 하면 된다
  • 값의 단위가 초이므로 tcp_keepalive_time=3 은 3시간이 아니라 3초다
  • tcp_fin_timeout 은 끊는 중(FIN_WAIT2)인 연결을 정리하기까지 기다리는 시간이라, 열린 연결을 얼마나 유지하느냐와는 관계없다 → TCP 연결 상태, TCP 타이머