일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 윈도우10 먹통현상 해결하기
- POP폰트
- 작업표시줄 먹통현상 해결하기
- 복사 단축키
- 메타버스 용어
- 업무에 바로 쓰는 SQL
- 한글 기호 자동변환 해제
- 바탕화면에 원격 데스크톱 연결 바로가기 만들기
- 삼성멀티캠퍼스SQL
- AIX 버전확인
- 잘라내기 단축키
- 금리와 물가와의 상관관계
- 윈도우 10 프리징 해결하기
- 오라클DB팁
- 부자의 그릇 요약
- AIX NFS
- 엑셀에서 콤마를 제외한 숫자 개수 세기
- 붙여넣기 단축키
- AIX NAS NFS
- OpenSSL 업데이트
- net user 사용법
- javascript redirection code
- 레드햇 버전확인
- ie모드 해제
- 스타워즈 영화 감상 순서
- 헤드퍼스트SQL
- 오라클팁
- 윈도우 10 슬라이드 종료 단축키 만들기
- 롤오버 기간을 설정한 비밀번호 마이그레이션 방법
- 무료 이미지 제공 사이트
- Today
- Total
Today is Present.
09 시스템최적화를 위한 커널옵션과 커널모듈 튜닝실무 본문
# /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 !!]
'리눅스 학습' 카테고리의 다른 글
리눅스 로그 확인 (0) | 2023.06.13 |
---|---|
10 사용자 및 그룹관리 실무 (0) | 2020.11.30 |
08 인터넷 수퍼데몬 XINETD와 자동실행 서비스관리 실무 (0) | 2020.11.30 |
07 리눅스 로그시스템 이해와 활용 (0) | 2020.11.30 |
06 시스템 실행상태 모니터링 실무 (0) | 2020.11.30 |