관리 메뉴

Today is Present.

09 시스템최적화를 위한 커널옵션과 커널모듈 튜닝실무 본문

리눅스 학습

09 시스템최적화를 위한 커널옵션과 커널모듈 튜닝실무

MorningPhys 2020. 11. 30. 00:39

# /proc 파일시스템 개론

 

/proc 파일시스템은 중요한 커널정보를 저장하고 있는 가상파일시스템이다. 따라서 이 값들을 임의대로 변경하는 것은 서버다운 등의 심각한 상황을 초래할 수 있다. 따라서 정확한 이해와 설정변경으로 인한 상태변화 등을 정확하게 예측한 후에 설정하는 것이 좋다.

 

/proc 파일 시스템은 우리가 흔히 하는 말로 가상파일시스템(Virtual File System)이라고 한다. 하지만 이 말만으로는 PROC 파일시스템에 대한 의미의 전달을 정확하게 할 수 없다. 따라서 필자가 표현할 수 있는 여러가지 표현법으로 이 /PROC 파일 시스템을 표현해 본다면 다음과 같이 여러가지로 표현이 가능하다.

 

① /proc 파일시스템은 현재 리눅스 커널이 메모리에서 사용하고 있는 모든 자원들에 대한 정보들을 보관하고 있는 파일들로 구성되어 있다.

 

② 그리고 현재 실행중인 프로세스정보들의 PID 숫자로 된 디렉토리들이 저장되고 있으며 프로세스가 종료될 경우에는 PID 값의 숫자로된 파일 또한 사라지게 된다.

 

③ 또한 리눅스 서버의 커널이 사용중인 자원들에 대한 정보 또한 파일명으로 보관하고 있다.

 

④ 그리고 무엇보다 중요한 것은 디스크 상에는 절대로 존재하지 않는 파일들이며 메모리상에 임시적으로 존재하는 파일들이다. 따라서 서버가 종료되면 너무나 당연하게도 이 파일들은 사라지게 된다. 이 때문에 /PROC 파일시스템을 가상파일시스템(Virtual FileSystem)이라고 한다. 

 

⑤ 그리고 /PROC 파일시스템에는 커널옵션값을 설정할 수 있는 파일들이 있으며 보안을 위한 몇가지 설정사항들도 있다.

 

⑥ /etc/sysctl.conf 파일을 이용하여 부팅시에 매번 적용되도록 할 수 있다.

 

⑦ sysctl 명령어를 이용하여 커널옵션값을 변경할 수 있다.

 

# /proc 에 존재하는 파일들의 정체

/proc/kcore 파일은 "ls -l /proc/kcore" 를 실행하여 ls 명령어로 확인해보면 파일의 용량이 엄청나게 크다는 것을 알 수 있다.

 

[root@localhost /]# ls -l /proc/kcore
-r--------. 1 root root 140737486266368  9월 27 16:02 /proc/kcore
[root@localhost /]#

반면 "du -sh /proc/kcore" 를 실행해보면 용량이 0 이라는 것을 알 수 있다.

 

[root@localhost /]# du -sh /proc/kcore
0       /proc/kcore

즉 /proc/kcore 라는 파일은 디스크 상에 실제로 존재하는 파일이 아니라 메모리상에 존재하는 일종의 가상파일이다. /proc/kcore 라는 파일외에도 /proc 디렉토리에 존재하는 여러가지 파일들을 확인해 봐도 /proc/kcore 파일과 동일하다는 것을 알 수 있을 것이다. 참고로 /proc/kcore 파일은 리눅스서버의 실제 메모리용량과 크기가 동일하며 이 파일에는 메모리에 존재하는 내용을 그대로 보관하고 있다.

 

결론적으로 /proc 디렉토리에 존재하는 파일들은 디스크 상에 물리적으로 존재하는 파일들이 아니라 리눅스 운영체제가 임의로 사용하고 있는 실제값들로써 메모리상에 존재하는 가상파일들이다. 따라서 /proc 을 가상파일시스템이라고 하는 것이다.

 

# 시스템성능에 절대적인 영향을 주는 커널파라미터란 무엇인가?

[root@localhost /]# ls -l /proc/sys
합계 0
dr-xr-xr-x. 1 root root 0  9월 27 16:06 abi
dr-xr-xr-x. 1 root root 0  9월 27 16:02 crypto
dr-xr-xr-x. 1 root root 0  9월 27 16:06 debug
dr-xr-xr-x. 1 root root 0  9월 27 16:06 dev
dr-xr-xr-x. 1 root root 0  9월 27 16:02 fs
dr-xr-xr-x. 1 root root 0  9월 27 16:02 kernel
dr-xr-xr-x. 1 root root 0  9월 27 16:02 net
dr-xr-xr-x. 1 root root 0  9월 27 16:06 sunrpc
dr-xr-xr-x. 1 root root 0  9월 27 16:02 vm

 

[root@localhost /]# ls -l /proc/sys/net/ipv4
합계 0
-rw-r--r--. 1 root root 0  9월 27 16:07 cipso_cache_bucket_size
-rw-r--r--. 1 root root 0  9월 27 16:07 cipso_cache_enable
-rw-r--r--. 1 root root 0  9월 27 16:07 cipso_rbm_optfmt
-rw-r--r--. 1 root root 0  9월 27 16:07 cipso_rbm_strictvalid
dr-xr-xr-x. 1 root root 0  9월 27 16:02 conf
-rw-r--r--. 1 root root 0  9월 27 16:07 icmp_echo_ignore_all

 

# ping 에서 사용하는 ICMP 프로토콜 거부하는 설정

[root@localhost /]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@localhost /]#

# /proc 파일시스템에 존재하는 커널파라미터 변경하는 방법들

첫번째

/etc/sysctl.conf 파일에 등록해둔다. 부팅할 때마다 이 파일을 읽어서 적용을 하게 되므로 변경한 커널파라미터값을 지속적으로 적용하려면 이 파일에 넣어두면 된다.

두번째

sysctl 명령어를 이용하는 방법이다. 즉 "sysctl -w 파리미터변수=값" 의 형식으로 변경 가능하며 현재의 값만 변경하는 것이다. 지속적으로 적용을 하려면 /etc/sysctl.conf 파일에 등록해야 한다.

세번째

/proc/sys 디렉토리 내에 존재하는 각각의 파일들을 vi로 열어서 직접 변경하는 방법이다. 이 방법은 그다지 추천할 만한 방법은 아니다. /proc 디렉토리에 존재하는 파일들을 인위적으로 직접 수정하는 것은 좋은 방법이 아니다.

네번째

echo 명령어를 이용하여 "echo 1 > 파일위치"와 같은 방법을 이용하는 것이다. 간편하고 단순한 변경방법을 사용하려면 이 방법을 이용하면 된다.

 

# sysctl 을 이용한 커널옵션 설정 및 확인

sysctl 의 man page 를 확인해보면 sysctl은 "configure kernel parameters at runtime" 이라고 정의되어 있다. 즉, 커널파라미터값을 설정하는 명령어이다.

 

# 커널옵션값 전체 확인하는 방법

[root@localhost /]# sysctl -a | head -3
abi.vsyscall32 = 1
crypto.fips_enabled = 0
debug.exception-trace = 1

[root@localhost /]# sysctl -a | wc -l
954

[root@localhost /]# sysctl -a | grep kernel.max

kernel.max_lock_depth = 1024


[root@localhost /]# sysctl -a | grep kernel.panic
kernel.panic = 0
kernel.panic_on_io_nmi = 0
kernel.panic_on_oops = 1
kernel.panic_on_stackoverflow = 0
kernel.panic_on_unrecovered_nmi = 0
kernel.panic_on_warn = 0

 

# 특정 커널옵션값 확인하는 방법

[root@localhost /]# sysctl -a | grep syncookies
net.ipv4.tcp_syncookies = 1

[root@localhost /]#

 

# 특정 커널옵션값 설정하는 방법

[root@localhost /]# sysctl -w net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syncookies = 1
[root@localhost /]# sysctl -a | grep syncookies
net.ipv4.tcp_syncookies = 1
[root@localhost /]#


# 커널 파라미터값 최적화로 시스템 보안 및 성능 최적화하기

# 커널의 특정 파라미터값 변경하기

[root@localhost /]# sysctl -a | grep kernel.sysrq // 매직키 사용 가능하도록 설정
kernel.sysrq = 16
[root@localhost /]#

[root@localhost /]# sysctl -w kernel.sysrq=1
kernel.sysrq = 1
[root@localhost /]# sysctl -a | grep kernel.sysrq
kernel.sysrq = 1


[root@localhost /]# sysctl -a | grep fs.file-max
fs.file-max = 98134  // 기본값
[root@localhost /]# sysctl -w fs.file-max=200000  // 커널이 최대로 핸들링 할 수 있는 파일 개수
fs.file-max = 200000
[root@localhost /]#
[root@localhost /]# sysctl -a | grep fs.file-max
fs.file-max = 200000

 

# 서버의 호스트네임 확인

[root@localhost /]# cat /proc/sys/kernel/hostname

 

# 커널버전 확인

[root@localhost /]# cat /proc/sys/kernel/orelease

 

# 운영체제명 확인

[root@localhost /]# cat /proc/sys/kernel/ostype

 

# 커널 매직키(Magic Key) 사용가능 확인

[root@localhost /]# cat /proc/sys/kernel/sysrq

 

# /proc/sys/net/ipv4 에서 설정가능한 서버보안

# 외부의 ping 테스트 막기

[root@localhost /]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all   // 값 설정 : 1

 

# smurf 공격방지를 위한 broadcast 패킷방지하기

[root@localhost /]# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts    // 값 설정 : 1

 

# 세션 종료시간 조정

[root@localhost /]# cat /proc/sys/net/ipv4/tcp_fin_timeout    // 기본 60초 -> 10초 변경

 

# tcp keepalive time 설정

[root@localhost /]# cat /proc/sys/net/ipv4/tcp_keepalive_time    // 기본 7200 초 : 2시간

7200

[root@localhost /]#

 

# 서버에서 로컬 포트사용범위 설정

[root@localhost /]# cat /proc/sys/net/ipv4/ip_local_port_range   // 기본값은 메모리에 따라 달라짐

32768   61000

 

# IP 포워딩 기능 막기(라우팅 기능 비활성화)

[root@localhost /]# cat /proc/sys/net/ipv4/ip_forward      // 기본값 1 -> 0 설정

 

# 서버의 날짜정보 유출 막기

[root@localhost /]# cat /proc/sys/net/ipv4/tcp_timestamps  // 기본값 1 -> 0 설정

 

# SYN_Flooding 공격 막기

SYN Flooding 공격은 TCP 세션의 연결시에 존재하는 취약성을 이용한 공격이다. 원리만 알면 누구나 간단히 할 수 있는 일종의 서비스거부공격(DoS) 공격의 일종이다. SYN 패킷을 받은 목적지 서버는 SYN과 ACK 패킷을 보낸 후에 소스서버에서 ACK 패킷을 보내기를 기다리게 된다. 이 때에 계속적으로 기다리는 것이 아니라 백로그큐(BackLog Queue) 가 허용하는 공간에 연결정보를 보관하게 된다. 이런 상태가 수도없이 쌓이게 되면 목적지 서버의 특정 서비스가 정상적으로 이루어지지 않게 되어 서비스 다운 상태가 된다.

 

[root@localhost /]# cat /proc/sys/net/ipv4/tcp_syncookies   // 기본값 0 -> 1 설정

0

[root@localhost /]#

[root@localhost /]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog

1024

[root@localhost /]#

 

간단하게 설명하며 이런 공격이 DOS 공격의 일종인 SYN_Flooding 공격이다. 이런 공격을 차단하기 위해서 위의 예와 같이 두가지 설정이 필요하다. 백로그큐 사이즈를 늘려주는 방법과 tcp_syncookies 값을 "1"로 설정하는 것이 그것이다.

 

위의 설정과 같이 tcp_syncookies 값을 "1"로 설정하게 되면 TCP 세션시에 소스서버에서 정상적인 ACK 패킷이 도달하지 않는다면 TCP 세션연결을 위한 자원낭비를 하지 않게 된다.

 

# ICMP redirect 의 변조된 패킷 차단(accept 패킷 차단설정)

[root@localhost /]# cat /proc/sys/net/ipv4/conf/default/accept_redirects  // 기본값 1 -> 0 설정

1

[root@localhost /]#

 

# ICMP redirect 의 변조된 패킷 차단(send 패킷 차단설정)

[root@localhost /]# cat /proc/sys/net/ipv4/conf/default/send_redirects   // 기본값 1 -> 0 설정

1

[root@localhost /]#

 

# DoS 공격 source IP 로 사용되는 것을 차단(IP 스푸핑 방지하기)

[root@localhost /]# cat /proc/sys/net/ipv4/conf/default/rp_filter  // 기본값 0 -> 1 설정

1

[root@localhost /]# 

 

# 스푸핑 등의 패킷에 대한 로그를 남기도록 설정

[root@localhost /]# cat /proc/sys/net/ipv4/conf/default/log_martians  // 기본값 0 -> 1 설정

0

[root@localhost /]# 

 

# Source Route 패킷허용 막기(신뢰받는 호스트로 위장하는 것 막기)

[root@localhost /]# cat /proc/sys/net/ipv4/conf/default/accept_source_route

0

[root@localhost /]# 



출처: https://morphys.tistory.com/entry/리눅스-시스템최적화를-위한-커널옵션과-커널모듈-튜닝실무?category=627146 [This is your Park !!]

728x90
반응형