KR_Linux_Kernel - somaz94/DevOps-Engineer GitHub Wiki
์ง๋ฌธ: ๋ฆฌ๋ ์ค์์ ์์ฃผ ์ฌ์ฉํ๋ ์ปค๋ ํ๋ผ๋ฏธํฐ(sysctl)๋ฅผ ์ค๋ช ํ๊ณ , ๋คํธ์ํฌ ์ฑ๋ฅ ์ต์ ํ์ ์์คํ ์์ ์ฑ ํฅ์์ ์ํ ์ฃผ์ ์ค์ ๊ฐ์ ์ ์ํ์ธ์.
๋ต๋ณ:
# ๋ชจ๋ ์ปค๋ ํ๋ผ๋ฏธํฐ ํ์ธ
sysctl -a
# ํน์ ํ๋ผ๋ฏธํฐ ํ์ธ
sysctl net.ipv4.ip_forward
sysctl vm.swappiness
# ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ (์์)
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w vm.swappiness=10
# ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ (์๊ตฌ)
sudo vi /etc/sysctl.conf
sudo sysctl -p # ์ ์ฉ# /etc/sysctl.conf ๋๋ /etc/sysctl.d/99-network.conf
# ===== TCP/IP ์คํ ์ต์ ํ =====
# net.core.rmem_max: TCP ์์ ๋ฒํผ์ ์ต๋ ํฌ๊ธฐ
# - ๊ธฐ๋ณธ๊ฐ: 212992 (์ฝ 208KB)
# - ๊ถ์ฅ๊ฐ: 134217728 (128MB) - 10Gbps ๊ณ ์ ๋คํธ์ํฌ ํ๊ฒฝ
# - ์ค๋ช
: ๋คํธ์ํฌ ์นด๋์์ ๋ฐ์ ํจํท์ ์ ์ฅํ๋ ์ปค๋ ๋ฒํผ์ ์ต๋ ํฌ๊ธฐ
# - ํจ๊ณผ: ๋์ฉ๋ ํ์ผ ์ ์ก, ์คํธ๋ฆฌ๋ฐ ์๋น์ค์์ ์ฒ๋ฆฌ๋ ํฅ์
# - ์ฃผ์: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ OOM ๊ฐ๋ฅ์ฑ, ์์คํ
RAM ๊ณ ๋ ค ํ์
net.core.rmem_max = 134217728
# net.core.wmem_max: TCP ์ก์ ๋ฒํผ์ ์ต๋ ํฌ๊ธฐ
# - ๊ธฐ๋ณธ๊ฐ: 212992 (์ฝ 208KB)
# - ๊ถ์ฅ๊ฐ: 134217728 (128MB)
# - ์ค๋ช
: ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ณด๋ด๋ ๋ฐ์ดํฐ๋ฅผ ๋คํธ์ํฌ ์นด๋๋ก ์ ์กํ๊ธฐ ์ ์์ ์ ์ฅ
# - ํจ๊ณผ: ๊ณ ๋์ญํญ ํ๊ฒฝ์์ ์ก์ ์ฑ๋ฅ ํฅ์
# - ์ฌ์ฉ ์ฌ๋ก: CDN ์๋ฒ, ๋น๋์ค ์คํธ๋ฆฌ๋ฐ, ๋์ฉ๋ ํ์ผ ์๋ฒ
net.core.wmem_max = 134217728
# net.core.rmem_default / wmem_default: ์์ผ ์์ฑ ์ ๊ธฐ๋ณธ ๋ฒํผ ํฌ๊ธฐ
# - ์ค๋ช
: ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ช
์์ ์ผ๋ก ๋ฒํผ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ง ์์ ๋ ์ฌ์ฉ
# - ๊ถ์ฅ๊ฐ: 16MB (์ผ๋ฐ์ ์ธ ์น ํธ๋ํฝ์ ์ ํฉ)
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
# net.ipv4.tcp_rmem / tcp_wmem: ์์ผ๋ณ TCP ๋ฒํผ ์๋ ํ๋ (์ต์, ๊ธฐ๋ณธ, ์ต๋)
# - ํ์: min default max
# - tcp_rmem = 4096 87380 134217728
# * 4096 (4KB): ์ต์ ๋ฒํผ - ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์์๋ ๋ณด์ฅ
# * 87380 (85KB): ๊ธฐ๋ณธ ๋ฒํผ - ์ผ๋ฐ์ ์ธ ์ฐ๊ฒฐ์ ์ฌ์ฉ
# * 134217728 (128MB): ์ต๋ ๋ฒํผ - ๊ณ ์ ๋คํธ์ํฌ์์ ์๋ ํ์ฅ
# - ์ค๋ช
: ์ปค๋์ด ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ฒํผ ํฌ๊ธฐ ์กฐ์
# - ํจ๊ณผ: Bandwidth-Delay Product (BDP) ์ต์ ํ
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
# ===== ์ฐ๊ฒฐ ๋๊ธฐ์ด ๊ด๋ฆฌ =====
# net.core.somaxconn: listen() ์์คํ
์ฝ์ backlog ํ๋ผ๋ฏธํฐ ์ต๋๊ฐ
# - ๊ธฐ๋ณธ๊ฐ: 128 (๋งค์ฐ ์์!)
# - ๊ถ์ฅ๊ฐ: 65535 (๊ณ ๋ถํ ์น ์๋ฒ)
# - ์ค๋ช
: accept() ์ ๋๊ธฐ ์ค์ธ ์์ ํ ์ฐ๊ฒฐ๋(ESTABLISHED) ์์ผ ํ ํฌ๊ธฐ
# - ๋ฌธ์ : ๊ฐ์ด ์์ผ๋ฉด "connection refused" ์๋ฌ ๋ฐ์
# - ํจ๊ณผ: ํธ๋ํฝ ๊ธ์ฆ ์์๋ ์ฐ๊ฒฐ ์์ค ๋ฐฉ์ง
# - ์์: Nginx์ listen 80 backlog=65535;์ ์ฐ๊ณ
net.core.somaxconn = 65535
# net.core.netdev_max_backlog: ๋คํธ์ํฌ ์ฅ์น ์
๋ ฅ ํ ํฌ๊ธฐ
# - ๊ธฐ๋ณธ๊ฐ: 1000
# - ๊ถ์ฅ๊ฐ: 100000 (10Gbps ํ๊ฒฝ)
# - ์ค๋ช
: NIC์์ ์ปค๋๋ก ์ ๋ฌ๋ ํจํท์ ์ฒ๋ฆฌํ๊ธฐ ์ ๋๊ธฐํ๋ ํ
# - ๋ฌธ์ : ๊ฐ์ด ์์ผ๋ฉด ํจํท ๋๋กญ (ifconfig์์ RX dropped ์ฆ๊ฐ)
# - ํ์ธ: netstat -s | grep "dropped"
# - ์ฌ์ฉ ์ฌ๋ก: DDoS ๋ฐฉ์ด, ๊ณ PPS(Packets Per Second) ํ๊ฒฝ
net.core.netdev_max_backlog = 100000
# net.ipv4.tcp_max_syn_backlog: SYN_RECV ์ํ ์์ผ ๋๊ธฐ์ด ํฌ๊ธฐ
# - ๊ธฐ๋ณธ๊ฐ: 128-1024 (๋ฐฐํฌํ๋ง๋ค ๋ค๋ฆ)
# - ๊ถ์ฅ๊ฐ: 8192
# - ์ค๋ช
: SYN์ ๋ฐ์์ง๋ง ์์ง ACK๋ฅผ ๋ฐ์ง ๋ชปํ ๋ฐ์ฏค ์ฐ๊ฒฐ๋(Half-open) ์์ผ ํ
# - ๋ฌธ์ : ๊ฐ์ด ์์ผ๋ฉด SYN Flood ๊ณต๊ฒฉ์ ์ทจ์ฝ
# - ํจ๊ณผ: ๋๋์ ๋์ ์ฐ๊ฒฐ ์์ฒญ ์ฒ๋ฆฌ (์น ์๋ฒ ๋ถํ
์งํ ํธ๋ํฝ ํญ์ฆ)
# - ๋ณด์: tcp_syncookies์ ํจ๊ป ์ฌ์ฉ
net.ipv4.tcp_max_syn_backlog = 8192
# ===== TIME_WAIT ์์ผ ์ต์ ํ =====
# net.ipv4.tcp_tw_reuse: TIME_WAIT ์์ผ์ ์ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉ
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋นํ์ฑํ)
# - ๊ถ์ฅ๊ฐ: 1 (ํด๋ผ์ด์ธํธ ์ธก์์ ํ์ฑํ)
# - ์ค๋ช
: ์ธ๋ถ ์๋ฒ๋ก ๋๊ฐ๋(outbound) ์ฐ๊ฒฐ ์ TIME_WAIT ์์ผ ์ฆ์ ์ฌ์ฌ์ฉ
# - ๋ฌธ์ ํด๊ฒฐ: "Cannot assign requested address" ์๋ฌ ๋ฐฉ์ง
# - ์๋๋ฆฌ์ค: API Gateway, Reverse Proxy๊ฐ ๋ฐฑ์๋ ์๋ฒ๋ก ๋ค๋์ ์์ฒญ
# - ์ฃผ์: ์๋ฒ ์ธก(inbound)์๋ ์ํฅ ์์, NAT ํ๊ฒฝ์์ ๋ฌธ์ ๊ฐ๋ฅ์ฑ
# - ํ์ธ: ss -tan | grep TIME_WAIT | wc -l
net.ipv4.tcp_tw_reuse = 1
# net.ipv4.tcp_fin_timeout: FIN-WAIT-2 ์ํ ์ ์ง ์๊ฐ
# - ๊ธฐ๋ณธ๊ฐ: 60์ด
# - ๊ถ์ฅ๊ฐ: 30์ด
# - ์ค๋ช
: TCP ์ฐ๊ฒฐ ์ข
๋ฃ ์ FIN-WAIT-2 ์ํ์์ ๋๊ธฐํ๋ ์๊ฐ
# - ํจ๊ณผ: ๋น์ ์ ์ข
๋ฃ๋ ์ฐ๊ฒฐ์ ๋ฆฌ์์ค๋ฅผ ๋น ๋ฅด๊ฒ ํ์
# - ์ฃผ์: ๋๋ฌด ์งง์ผ๋ฉด (์: 5์ด) ๋๋ฆฐ ํด๋ผ์ด์ธํธ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
net.ipv4.tcp_fin_timeout = 30
# ===== TCP Keepalive ์ค์ =====
# net.ipv4.tcp_keepalive_time: ์ ํด ์ฐ๊ฒฐ์ keepalive ํ๋ก๋ธ ์ ์ก ์์ ์๊ฐ
# - ๊ธฐ๋ณธ๊ฐ: 7200์ด (2์๊ฐ)
# - ๊ถ์ฅ๊ฐ: 600์ด (10๋ถ)
# - ์ค๋ช
: ๋ง์ง๋ง ๋ฐ์ดํฐ ์ ์ก ํ ์ฐ๊ฒฐ์ด ์ด์์๋์ง ํ์ธํ๊ธฐ๊น์ง์ ์๊ฐ
# - ํจ๊ณผ: ์ข๋น ์ฐ๊ฒฐ(Zombie Connection) ์กฐ๊ธฐ ํ์ง
# - ์ฌ์ฉ ์ฌ๋ก: ๋ก๋ ๋ฐธ๋ฐ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ, SSH ์ธ์
์ ์ง
net.ipv4.tcp_keepalive_time = 600
# net.ipv4.tcp_keepalive_intvl: keepalive ํ๋ก๋ธ ์ฌ์ ์ก ๊ฐ๊ฒฉ
# - ๊ธฐ๋ณธ๊ฐ: 75์ด
# - ๊ถ์ฅ๊ฐ: 30์ด
# - ์ค๋ช
: ์๋ต์ด ์์ ๋ ๋ค์ ํ๋ก๋ธ๋ฅผ ๋ณด๋ด๋ ๊ฐ๊ฒฉ
net.ipv4.tcp_keepalive_intvl = 30
# net.ipv4.tcp_keepalive_probes: keepalive ํ๋ก๋ธ ์ต๋ ์ฌ์๋ ํ์
# - ๊ธฐ๋ณธ๊ฐ: 9ํ
# - ๊ถ์ฅ๊ฐ: 3ํ
# - ์ค๋ช
: ์๋ต์ด ์์ ๋ ์ฐ๊ฒฐ์ ๋๊ธฐ ์ ๊น์ง ์๋ ํ์
# - ๊ณ์ฐ: ์ด ๋๊ธฐ ์๊ฐ = keepalive_time + (keepalive_intvl * keepalive_probes)
# = 600 + (30 * 3) = 690์ด (์ฝ 11.5๋ถ) ํ ์ฐ๊ฒฐ ์ข
๋ฃ
net.ipv4.tcp_keepalive_probes = 3
# ===== TCP Fast Open (TFO) =====
# net.ipv4.tcp_fastopen: TCP 3-way handshake ์ต์ ํ
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋นํ์ฑํ)
# - ๊ถ์ฅ๊ฐ: 3 (ํด๋ผ์ด์ธํธ + ์๋ฒ ๋ชจ๋ ํ์ฑํ)
# - ๊ฐ์ ์๋ฏธ:
# * 1: ํด๋ผ์ด์ธํธ๋ง ํ์ฑํ (์ธ๋ถ ์๋ฒ ์ฐ๊ฒฐ ์)
# * 2: ์๋ฒ๋ง ํ์ฑํ (๋ค์ด์ค๋ ์ฐ๊ฒฐ ์๋ฝ)
# * 3: ํด๋ผ์ด์ธํธ + ์๋ฒ (๋นํธ OR: 1 | 2 = 3)
# - ์๋ฆฌ: SYN ํจํท์ ๋ฐ์ดํฐ ํฌํจ โ RTT(Round Trip Time) 1ํ ์ ์ฝ
# - ํจ๊ณผ: ์ฐ๊ฒฐ ์ง์ฐ ๊ฐ์ (HTTP ์์ฒญ์ด ๋ง์ ํ๊ฒฝ์์ ์ฒด๊ฐ ํฅ์)
# - ์๊ตฌ์ฌํญ: ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋ ์ง์ ํ์ (์ปค๋ 3.7+)
# - ๋ณด์: TFO Cookie๋ก SYN Flood ๋ฐฉ์ด
net.ipv4.tcp_fastopen = 3
# ===== IP ํฌ์๋ฉ =====
# net.ipv4.ip_forward: IPv4 ํจํท ํฌ์๋ฉ ํ์ฑํ
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋นํ์ฑํ)
# - ๊ถ์ฅ๊ฐ: 1 (๋ผ์ฐํฐ, NAT, ์ฟ ๋ฒ๋คํฐ์ค ๋
ธ๋)
# - ์ค๋ช
: ๋ค๋ฅธ ๋คํธ์ํฌ๋ก ํจํท์ ์ ๋ฌํ ์ ์๊ฒ ํจ
# - ํ์ ์๋๋ฆฌ์ค:
# * ์ฟ ๋ฒ๋คํฐ์ค ์์ปค ๋
ธ๋ (Pod ๊ฐ ํต์ )
# * Docker ๋ธ๋ฆฟ์ง ๋คํธ์ํฌ
# * VPN ๊ฒ์ดํธ์จ์ด
# * NAT ๋ผ์ฐํฐ
# - ํ์ธ: cat /proc/sys/net/ipv4/ip_forward
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# ===== ๋ก์ปฌ ํฌํธ ๋ฒ์ =====
# net.ipv4.ip_local_port_range: ์ธ๋ถ ์ฐ๊ฒฐ ์ ์ฌ์ฉํ ์์(ephemeral) ํฌํธ ๋ฒ์
# - ๊ธฐ๋ณธ๊ฐ: 32768 60999 (์ฝ 28,000๊ฐ)
# - ๊ถ์ฅ๊ฐ: 10000 65535 (์ฝ 55,000๊ฐ)
# - ์ค๋ช
: ํด๋ผ์ด์ธํธ๊ฐ ์ธ๋ถ ์๋ฒ๋ก ์ฐ๊ฒฐ ์ ์๋ ํ ๋น๋๋ ์์ค ํฌํธ
# - ๋ฌธ์ : ๋ฒ์๊ฐ ์ข์ผ๋ฉด "Cannot assign requested address" ์๋ฌ
# - ์๋๋ฆฌ์ค: Reverse Proxy, API Gateway๊ฐ ๋ฐฑ์๋๋ก ๋๋ ์ฐ๊ฒฐ
# - ๊ณ์ฐ: ๋์ ์ฐ๊ฒฐ ์ = (ํฌํธ ๋ฒ์) / (TIME_WAIT ์๊ฐ / ์ฐ๊ฒฐ ์ง์ ์๊ฐ)
# - ์์: 1์ด๋น 1000๊ฐ ์์ฒญ, TIME_WAIT 30์ด โ ์ต์ 30,000 ํฌํธ ํ์
# - ํ์ธ: ss -tan | awk '{print $4}' | grep -oP ':\d+$' | sort | uniq -c
net.ipv4.ip_local_port_range = 10000 65535# ===== SYN Flood ๊ณต๊ฒฉ ๋ฐฉ์ด =====
# net.ipv4.tcp_syncookies: SYN Cookie ๋ฉ์ปค๋์ฆ ํ์ฑํ
# - ๊ธฐ๋ณธ๊ฐ: 1 (๋๋ถ๋ถ ๋ฐฐํฌํ์์ ๊ธฐ๋ณธ ํ์ฑํ)
# - ๊ถ์ฅ๊ฐ: 1 (ํ์)
# - ์๋ฆฌ:
# 1. ์ ์: ํด๋ผ์ด์ธํธ SYN โ ์๋ฒ SYN-ACK (ํ์ ์ ์ฅ) โ ํด๋ผ์ด์ธํธ ACK
# 2. ๊ณต๊ฒฉ: ์์ฒ ๊ฐ์ SYN โ ํ ๊ฐ๋์ฐธ โ ์ ์ ์ฐ๊ฒฐ ๊ฑฐ๋ถ
# 3. SYN Cookie: SYN-ACK์ ์ํ์ค ๋ฒํธ์ ์ฐ๊ฒฐ ์ ๋ณด ์ํธํ ์ ์ฅ โ ํ ๋ถํ์
# - ํจ๊ณผ: tcp_max_syn_backlog ์ด๊ณผ ์์๋ ์ฐ๊ฒฐ ์๋ฝ ๊ฐ๋ฅ
# - ๋จ์ : TCP ์ต์
(Window Scaling ๋ฑ) ์ผ๋ถ ์์ค ๊ฐ๋ฅ
# - ํ์ธ: netstat -s | grep "SYNs to LISTEN sockets dropped"
net.ipv4.tcp_syncookies = 1
# net.ipv4.tcp_max_syn_backlog: SYN Flood ๋ฐฉ์ด์ฉ ๋ฐฑ์
๋๊ธฐ์ด
# - tcp_syncookies์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉ ๋ฐฉ์ด ๊ฐํ
net.ipv4.tcp_max_syn_backlog = 8192
# ===== ICMP Redirect ๊ณต๊ฒฉ ๋ฐฉ์ง =====
# net.ipv4.conf.*.accept_redirects: ICMP Redirect ๋ฉ์์ง ์๋ฝ ์ฌ๋ถ
# - ๊ธฐ๋ณธ๊ฐ: 1 (์๋ฝ)
# - ๊ถ์ฅ๊ฐ: 0 (๊ฑฐ๋ถ)
# - ๊ณต๊ฒฉ ์๋๋ฆฌ์ค:
# 1. ๊ณต๊ฒฉ์๊ฐ ์์กฐ๋ ICMP Redirect ๋ฉ์์ง ์ ์ก
# 2. ํผํด์์ ๋ผ์ฐํ
ํ
์ด๋ธ ๋ณ๊ฒฝ
# 3. ํธ๋ํฝ์ด ๊ณต๊ฒฉ์๋ฅผ ๊ฒฝ์ โ MitM (Man-in-the-Middle) ๊ณต๊ฒฉ
# - ์์: "๋ ๋์ ๊ฒฝ๋ก๊ฐ ์์ด์" ๋ฉ์์ง๋ก ์์ฌ์ ๊ฒ์ดํธ์จ์ด ๋ณ๊ฒฝ
# - ํ์ ์ ์ฉ: ํ๋ก๋์
์๋ฒ, ๋ผ์ฐํฐ
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# ===== Source Routing ๊ณต๊ฒฉ ๋ฐฉ์ง =====
# net.ipv4.conf.*.accept_source_route: Source Routing ํจํท ์๋ฝ ์ฌ๋ถ
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋๋ถ๋ถ ๋ฐฐํฌํ์์ ๋นํ์ฑํ)
# - ๊ถ์ฅ๊ฐ: 0 (๊ฑฐ๋ถ)
# - ๊ณต๊ฒฉ ์๋ฆฌ:
# * Source Routing: ์ก์ ์๊ฐ ํจํท ๊ฒฝ๋ก๋ฅผ ์ง์ (์ผ๋ฐ์ ์ผ๋ก ๋ผ์ฐํฐ๊ฐ ๊ฒฐ์ )
# * ๊ณต๊ฒฉ์๊ฐ ์์ ๊ฒฝ๋ก ์ง์ โ ๋ฐฉํ๋ฒฝ ์ฐํ, ์คํธํ
# - ํจ๊ณผ: IP ์คํธํ ๊ณต๊ฒฉ ์ฐจ๋จ
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# ===== ICMP Echo (Ping) ์๋ต =====
# net.ipv4.icmp_echo_ignore_all: Ping ์์ฒญ ๋ฌด์
# - ๊ธฐ๋ณธ๊ฐ: 0 (์๋ตํจ)
# - ๊ถ์ฅ๊ฐ: 0 (์ผ๋ฐ ์๋ฒ), 1 (๊ณ ๋ณด์ ์๋ฒ)
# - ์ฅ์ : ๋คํธ์ํฌ ์ค์บ ํํผ (Nmap ๋ฑ)
# - ๋จ์ : ๋คํธ์ํฌ ๋๋ฒ๊น
์ด๋ ค์ (traceroute, ping ๋ถ๊ฐ)
# - ๊ถ์ฅ: ๋ฐฉํ๋ฒฝ์์ ICMP ์ ์ดํ๋ ๊ฒ์ด ๋ ๋์
net.ipv4.icmp_echo_ignore_all = 0
# net.ipv4.icmp_echo_ignore_broadcasts: ๋ธ๋ก๋์บ์คํธ Ping ๋ฌด์
# - ๊ธฐ๋ณธ๊ฐ: 1 (๋ฌด์)
# - ๊ถ์ฅ๊ฐ: 1 (ํ์)
# - ๊ณต๊ฒฉ: Smurf Attack (๋ธ๋ก๋์บ์คํธ Ping์ผ๋ก DDoS ์ฆํญ)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# ===== IP ์คํธํ ๋ฐฉ์ง (Reverse Path Filtering) =====
# net.ipv4.conf.*.rp_filter: ์ญ๊ฒฝ๋ก ํํฐ๋ง
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋นํ์ฑํ) ๋๋ 1
# - ๊ถ์ฅ๊ฐ: 1 (Strict Mode)
# - ๊ฐ์ ์๋ฏธ:
# * 0: ๋นํ์ฑํ (์ํ!)
# * 1: Strict Mode - ๋ค์ด์จ ์ธํฐํ์ด์ค๋ก ์๋ต ํจํท๋ ๋๊ฐ๋์ง ํ์ธ
# * 2: Loose Mode - ์๋ต ๊ฒฝ๋ก๊ฐ ๋ผ์ฐํ
ํ
์ด๋ธ์ ์กด์ฌํ๋์ง๋ง ํ์ธ
# - ์๋ฆฌ: ํจํท์ ์์ค IP๊ฐ ์์กฐ๋์๋์ง ๋ผ์ฐํ
ํ
์ด๋ธ๋ก ๊ฒ์ฆ
# - ์์:
# * eth0์ผ๋ก 10.0.0.5์์ ์จ ํจํท ์์
# * ๋ผ์ฐํ
ํ
์ด๋ธ ํ์ธ: 10.0.0.5๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ eth0์ธ๊ฐ?
# * ์๋๋ฉด โ ์คํธํ๋ ํจํท์ผ๋ก ํ๋จํ์ฌ ๋๋กญ
# - ํจ๊ณผ: DDoS ๊ณต๊ฒฉ์ ์์ค IP ์์กฐ ์ฐจ๋จ
# - ์ฃผ์: ๋น๋์นญ ๋ผ์ฐํ
ํ๊ฒฝ์์๋ 2(Loose Mode) ์ฌ์ฉ
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ===== ๋ณด์ ๋ก๊น
=====
# net.ipv4.conf.*.log_martians: ๋น์ ์ ํจํท ๋ก๊ทธ ๊ธฐ๋ก
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋ก๊ทธ ์ ๋จ๊น)
# - ๊ถ์ฅ๊ฐ: 1 (๋ก๊ทธ ๋จ๊น)
# - Martian Packets:
# * ์์ฝ๋ IP ์ฃผ์ (0.0.0.0, 127.0.0.0/8, 224.0.0.0/4)
# * ๋ธ๋ก๋์บ์คํธ ์ฃผ์
# * ๋ฉํฐ์บ์คํธ ์ฃผ์
# * ์๋ชป๋ ์์ค IP
# - ๋ก๊ทธ ์์น: /var/log/kern.log ๋๋ dmesg
# - ์์: "martian source 192.168.1.1 from 10.0.0.5"
# - ์ฉ๋: ๋คํธ์ํฌ ๊ณต๊ฒฉ ํ์ง, ์ค์ ์ค๋ฅ ๋๋ฒ๊น
# - ์ฃผ์: ๋ก๊ทธ๊ฐ ๋ง์ผ๋ฉด ๋์คํฌ I/O ์ฆ๊ฐ
net.ipv4.conf.all.log_martians = 1
# ===== SYN/ACK ์ฌ์ ์ก =====
# net.ipv4.tcp_synack_retries: SYN-ACK ์ฌ์ ์ก ํ์
# - ๊ธฐ๋ณธ๊ฐ: 5ํ (์ฝ 180์ด ๋๊ธฐ)
# - ๊ถ์ฅ๊ฐ: 2ํ (์ฝ 7์ด ๋๊ธฐ)
# - ์ค๋ช
: ํด๋ผ์ด์ธํธ๊ฐ ACK๋ฅผ ๋ณด๋ด์ง ์์ ๋ SYN-ACK ์ฌ์ ์ก ํ์
# - ํจ๊ณผ: SYN Flood ๊ณต๊ฒฉ ์ ๋ฆฌ์์ค ๋น ๋ฅด๊ฒ ํ์
# - ์ฌ์ ์ก ๊ฐ๊ฒฉ: 1์ด, 2์ด, 4์ด, 8์ด, 16์ด (์ง์ ๋ฐฑ์คํ)
net.ipv4.tcp_synack_retries = 2
# net.ipv4.tcp_syn_retries: SYN ์ฌ์ ์ก ํ์ (ํด๋ผ์ด์ธํธ ์ธก)
# - ๊ธฐ๋ณธ๊ฐ: 6ํ (์ฝ 127์ด)
# - ๊ถ์ฅ๊ฐ: 3ํ (์ฝ 7์ด)
# - ์ค๋ช
: ์ธ๋ถ ์๋ฒ๋ก ์ฐ๊ฒฐ ์ SYN ํจํท ์ฌ์ ์ก ํ์
net.ipv4.tcp_syn_retries = 3# ===== Swappiness =====
# vm.swappiness: Swap ์ฌ์ฉ ์ ๊ทน์ฑ (0~100)
# - ๊ธฐ๋ณธ๊ฐ: 60
# - ๊ถ์ฅ๊ฐ:
# * 0: Swap ์ต์ํ (๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ, Redis, Elasticsearch)
# * 10: ์ฑ๋ฅ ์ค์ (์น ์๋ฒ, ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ)
# * 60: ๊ธฐ๋ณธ๊ฐ (๋ฐ์คํฌํฑ, ์ผ๋ฐ ์๋ฒ)
# * 100: ์ ๊ทน์ Swap (๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ํ๊ฒฝ)
# - ์๋ฆฌ:
# * ๊ฐ์ด ๋์์๋ก โ ์ปค๋์ด ์ ๊ทน์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ Swap์ผ๋ก ์ด๋
# * ๊ฐ์ด ๋ฎ์์๋ก โ RAM์ ์ต๋ํ ํ์ฉ, Swap์ ์ตํ์ ์๋จ
# - ํจ๊ณผ:
# * 0: OOM Killer ๋ฐ๋ ๊ฐ๋ฅ์ฑ ์ฆ๊ฐํ์ง๋ง ์ฑ๋ฅ ์ต์
# * 10: ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๊ท ํ (ํ๋ก๋์
๊ถ์ฅ)
# * 60: ๋์คํฌ I/O ์ฆ๊ฐ๋ก ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ
# - ํ์ธ:
# * cat /proc/sys/vm/swappiness
# * free -h (Swap ์ฌ์ฉ๋ ํ์ธ)
# * vmstat 1 (si/so ์ปฌ๋ผ์ผ๋ก Swap In/Out ๋ชจ๋ํฐ๋ง)
# - ์ฃผ์:
# * 0์ผ๋ก ์ค์ ํด๋ Swap์ด ์์ ํ ๋นํ์ฑํ๋๋ ๊ฒ์ ์๋
# * swapoff -a๋ก ์์ ํ ๋นํ์ฑํ ๊ฐ๋ฅ (์ฟ ๋ฒ๋คํฐ์ค ๊ถ์ฅ)
vm.swappiness = 10
# ===== Dirty Page ๊ด๋ฆฌ =====
# vm.dirty_ratio: ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๋๋น ๋ํฐ ํ์ด์ง ๋น์จ ์๊ณ๊ฐ (%)
# - ๊ธฐ๋ณธ๊ฐ: 20 (20%)
# - ๊ถ์ฅ๊ฐ: 15
# - ์ค๋ช
:
# * Dirty Page: ์์ ๋์์ง๋ง ์์ง ๋์คํฌ์ ์ฐ์ด์ง ์์ ํ์ด์ง ์บ์
# * ์๊ณ๊ฐ ๋๋ฌ ์ โ ํ๋ก์ธ์ค ๋ธ๋ก๋๊ณ ๊ฐ์ ๋ก ๋์คํฌ์ ์ฐ๊ธฐ ์์
# - ๋ฌธ์ : ๊ฐ์ด ๋๋ฌด ํฌ๋ฉด (์: 40%) โ ํ๊บผ๋ฒ์ ๋์คํฌ ์ฐ๊ธฐ โ ์์คํ
์๋ต ์ง์ฐ
# - ์์: 32GB RAM, dirty_ratio=15 โ 4.8GB ๋ํฐ ํ์ด์ง ๋์ ์ ๊ฐ์ ์ฐ๊ธฐ
# - ํจ๊ณผ: ์ฐ๊ธฐ ์ฑ๋ฅ๊ณผ ์์คํ
์๋ต์ฑ์ ๊ท ํ
# - ํ์ธ:
# * cat /proc/meminfo | grep Dirty
# * watch -n 1 'cat /proc/meminfo | grep -E "Dirty|Writeback"'
vm.dirty_ratio = 15
# vm.dirty_background_ratio: ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๊ธฐ ์์ ๋น์จ (%)
# - ๊ธฐ๋ณธ๊ฐ: 10 (10%)
# - ๊ถ์ฅ๊ฐ: 5
# - ์ค๋ช
:
# * ์ด ๊ฐ ๋๋ฌ ์ โ pdflush/flush ์ปค๋ ์ค๋ ๋๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋์คํฌ์ ์ฐ๊ธฐ ์์
# * ํ๋ก์ธ์ค๋ ๋ธ๋ก๋์ง ์์ (๊ณ์ ์คํ ๊ฐ๋ฅ)
# - ์๋ฆฌ:
# 1. ๋ํฐ ํ์ด์ง 5% ๋๋ฌ โ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๊ธฐ ์์ (๋ถ๋๋ฝ๊ฒ)
# 2. ๋ํฐ ํ์ด์ง 15% ๋๋ฌ โ ๊ฐ์ ์ฐ๊ธฐ (ํ๋ก์ธ์ค ๋ธ๋ก)
# - ํจ๊ณผ: ๋์คํฌ I/O๋ฅผ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ๋ถ์ฐ์์ผ ์๋ต ์ง์ฐ ๋ฐฉ์ง
vm.dirty_background_ratio = 5
# vm.dirty_expire_centisecs: ๋ํฐ ํ์ด์ง ๋ง๋ฃ ์๊ฐ (centiseconds, 1/100์ด)
# - ๊ธฐ๋ณธ๊ฐ: 3000 (30์ด)
# - ๊ถ์ฅ๊ฐ: 3000
# - ์ค๋ช
: ์ด ์๊ฐ๋ณด๋ค ์ค๋๋ ๋ํฐ ํ์ด์ง๋ ์ฐ์ ์ ์ผ๋ก ๋์คํฌ์ ์ฐ๊ธฐ
# - ํจ๊ณผ: ๋ฐ์ดํฐ ์์ค ๋ฐฉ์ง (์ ์ ์ ์ต๋ 30์ด ๋ฐ์ดํฐ๋ง ์์ค)
# - ์๋๋ฆฌ์ค: ํ์ผ ์ฐ๊ธฐ โ 30์ด ์ด๋ด ์ ์ โ ๋ฐ์ดํฐ ์์ค
vm.dirty_expire_centisecs = 3000
# vm.dirty_writeback_centisecs: pdflush ์ค๋ ๋ ์คํ ๊ฐ๊ฒฉ (centiseconds)
# - ๊ธฐ๋ณธ๊ฐ: 500 (5์ด)
# - ๊ถ์ฅ๊ฐ: 500
# - ์ค๋ช
: pdflush ์ปค๋ ์ค๋ ๋๊ฐ ๊นจ์ด๋์ ๋ํฐ ํ์ด์ง๋ฅผ ํ์ธํ๋ ์ฃผ๊ธฐ
# - ํจ๊ณผ: ๋์คํฌ ์ฐ๊ธฐ ๋น๋ ์กฐ์
# - ์ฃผ์: ๊ฐ์ 0์ผ๋ก ์ค์ ํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๊ธฐ ๋นํ์ฑํ (์ํ!)
vm.dirty_writeback_centisecs = 500
# ===== OOM (Out Of Memory) Killer =====
# vm.overcommit_memory: ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒ์ปค๋ฐ ์ ์ฑ
# - ๊ธฐ๋ณธ๊ฐ: 0 (ํด๋ฆฌ์คํฑ)
# - ๊ฐ์ ์๋ฏธ:
# * 0: ํด๋ฆฌ์คํฑ - ์ปค๋์ด ์์ฒญ์ ํ๊ฐํ์ฌ ํ๋จ (๊ธฐ๋ณธ๊ฐ)
# * 1: ํญ์ ํ์ฉ - ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋ง์ ํ ๋น ํ์ฉ (์ํ!)
# * 2: ์๊ฒฉ ์ ํ - Swap + RAM * overcommit_ratio๊น์ง๋ง ํ์ฉ
# - ์ค๋ช
:
# * ํ๋ก์ธ์ค๊ฐ malloc()๋ก ๋ฉ๋ชจ๋ฆฌ ์์ฒญ โ ์ค์ ์ฌ์ฉ ์ ๊น์ง ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๋ฏธํ ๋น
# * ์ค๋ฒ์ปค๋ฐ: ์ด ํ ๋น ์์ฒญ > ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ
# - ์๋๋ฆฌ์ค:
# * Mode 0: ์ผ๋ฐ ์๋ฒ (๊ท ํ)
# * Mode 1: ๊ณผํ ๊ณ์ฐ (๋ฉ๋ชจ๋ฆฌ ๋ง์ด ํ ๋นํ์ง๋ง ์ ๊ฒ ์ฌ์ฉ)
# * Mode 2: ๋ฐ์ดํฐ๋ฒ ์ด์ค (์์ธก ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ)
# - ํ์ธ: cat /proc/meminfo | grep Committed
vm.overcommit_memory = 0
# vm.overcommit_ratio: overcommit_memory=2์ผ ๋ ํ์ฉ ๋น์จ (%)
# - ๊ธฐ๋ณธ๊ฐ: 50 (50%)
# - ์ค๋ช
: ์ต๋ ํ ๋น = Swap + (RAM * overcommit_ratio / 100)
# - ์์: 32GB RAM, 8GB Swap, ratio=50 โ ์ต๋ 24GB (8 + 32*0.5)
vm.overcommit_ratio = 50
# vm.panic_on_oom: OOM ๋ฐ์ ์ ์ปค๋ ํจ๋ ์ฌ๋ถ
# - ๊ธฐ๋ณธ๊ฐ: 0 (OOM Killer ์คํ)
# - ๊ถ์ฅ๊ฐ: 0 (์ผ๋ฐ ์๋ฒ), 1 (ํด๋ฌ์คํฐ ๋
ธ๋)
# - ์ค๋ช
:
# * 0: OOM Killer๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐ๋ ํ๋ก์ธ์ค ์ข
๋ฃ
# * 1: ์ฆ์ ์ปค๋ ํจ๋ โ ์์คํ
์ฌ๋ถํ
# - ์ฌ์ฉ ์ฌ๋ก:
# * 0: ๋จ์ผ ์๋ฒ (ํ๋ก์ธ์ค ํ๋๋ง ์ฃฝ์ด๊ณ ์์คํ
์ ์ง)
# * 1: HA ํด๋ฌ์คํฐ (๋
ธ๋ ์ ์ฒด ์ฌ์์ํ์ฌ ํ์ผ์ค๋ฒ)
vm.panic_on_oom = 0
# vm.oom_kill_allocating_task: OOM ๋ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ ์์ฒญํ ํ๋ก์ธ์ค ์ข
๋ฃ
# - ๊ธฐ๋ณธ๊ฐ: 0 (๊ฐ์ฅ ํฐ ํ๋ก์ธ์ค ์ข
๋ฃ)
# - ์ค๋ช
:
# * 0: OOM Score๊ฐ ๊ฐ์ฅ ๋์ ํ๋ก์ธ์ค ์ข
๋ฃ
# * 1: ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํ ํ๋ก์ธ์ค ์ฆ์ ์ข
๋ฃ
vm.oom_kill_allocating_task = 0
# ===== Huge Pages (๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
) =====
# vm.nr_hugepages: Huge Page ๊ฐ์
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋นํ์ฑํ)
# - ๊ถ์ฅ๊ฐ: ๊ณ์ฐ ํ์ (์ ํ๋ฆฌ์ผ์ด์
๋ฉ๋ชจ๋ฆฌ / 2MB)
# - ์ค๋ช
:
# * ์ผ๋ฐ ํ์ด์ง: 4KB
# * Huge Page: 2MB (x86_64)
# * TLB (Translation Lookaside Buffer) ๋ฏธ์ค ๊ฐ์ โ ์ฑ๋ฅ ํฅ์
# - ๊ณ์ฐ:
# * Oracle DB 10GB SGA ํ์ โ 10240 MB / 2 MB = 5120 Huge Pages
# - ํ์ธ:
# * cat /proc/meminfo | grep -i huge
# * hugeadm --pool-list
# - ์ฌ์ฉ ์ฌ๋ก:
# * Oracle Database (SGA)
# * PostgreSQL (shared_buffers)
# * Redis (๋์ฉ๋ ์ธ์คํด์ค)
# * SAP HANA
# - ์ฃผ์:
# * ์์คํ
๋ถํ
์ ๋ฏธ๋ฆฌ ํ ๋น (Swap ๋ถ๊ฐ)
# * ๋๋ฌด ๋ง์ด ์ค์ ํ๋ฉด ์ผ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
vm.nr_hugepages = 0
# vm.hugetlb_shm_group: Huge Page๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ทธ๋ฃน GID
# - ์ค๋ช
: ์ด ๊ทธ๋ฃน์ ์ํ ์ฌ์ฉ์๋ง Huge Page ์ฌ์ฉ ๊ฐ๋ฅ
# - ์์: oracle ๊ทธ๋ฃน GID=1001
vm.hugetlb_shm_group = 0
# ===== Transparent Huge Pages (THP) =====
# ์ฐธ๊ณ : THP๋ sysctl์ด ์๋ /sys/kernel/mm/transparent_hugepage/์์ ์ค์
# - ํ์ธ: cat /sys/kernel/mm/transparent_hugepage/enabled
# - ๋นํ์ฑํ (Redis, MongoDB, Oracle ๊ถ์ฅ):
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
# - ์ด์ : THP๋ ๋์ ํ ๋น์ผ๋ก ์ง์ฐ(latency) ๋ฐ์ ๊ฐ๋ฅ# ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ ํ
fs.file-max = 2097152 # ์์คํ
์ ์ฒด ์ต๋ FD
fs.nr_open = 1048576 # ํ๋ก์ธ์ค๋น ์ต๋ FD
# inotify ์ ํ (ํ์ผ ๊ฐ์)
fs.inotify.max_user_watches = 524288 # ์ฌ์ฉ์๋น ์ต๋ ๊ฐ์ ์
fs.inotify.max_user_instances = 512 # ์ธ์คํด์ค ์
# AIO (๋น๋๊ธฐ I/O)
fs.aio-max-nr = 1048576
# ์ปค๋ ๋ฉ์์ง ๋ฒํผ
kernel.printk = 4 4 1 7 # ์ฝ์ ๋ก๊ทธ ๋ ๋ฒจ
# ์ฝ์ด ๋คํ ์ค์
kernel.core_uses_pid = 1 # ์ฝ์ด ๋คํ์ PID ํฌํจ
kernel.core_pattern = /var/crash/core.%e.%p.%h.%t# ===== ๋ธ๋ฆฟ์ง ๋คํธ์ํฌ ์ค์ (ํ์!) =====
# net.bridge.bridge-nf-call-iptables: ๋ธ๋ฆฟ์ง ํธ๋ํฝ iptables ์ฒ๋ฆฌ
# - ๊ธฐ๋ณธ๊ฐ: 0 (๋นํ์ฑํ) ๋๋ 1
# - ๊ถ์ฅ๊ฐ: 1 (์ฟ ๋ฒ๋คํฐ์ค ํ์)
# - ์ค๋ช
:
# * Pod ๊ฐ ํต์ ํจํท์ด Linux ๋ธ๋ฆฟ์ง๋ฅผ ํต๊ณผํ ๋ iptables ๊ท์น ์ ์ฉ ์ฌ๋ถ
# * ์ฟ ๋ฒ๋คํฐ์ค Service (kube-proxy)๊ฐ iptables๋ก ๋ก๋ ๋ฐธ๋ฐ์ฑ ๊ตฌํ
# - ๋ฌธ์ : ๋นํ์ฑํ ์ Service Discovery ์๋ ์ ํจ
# - ํ์ ์๋๋ฆฌ์ค:
# * ์ฟ ๋ฒ๋คํฐ์ค ๋ชจ๋ ๋
ธ๋ (๋ง์คํฐ + ์์ปค)
# * Docker Swarm
# * Calico, Flannel, Weave ๋คํธ์ํฌ ํ๋ฌ๊ทธ์ธ
# - ํ์ธ:
# * lsmod | grep br_netfilter (๋ชจ๋ ๋ก๋ ํ์ธ)
# * modprobe br_netfilter (๋ชจ๋ ๋ก๋)
# - ์ฃผ์: br_netfilter ์ปค๋ ๋ชจ๋์ด ๋จผ์ ๋ก๋๋์ด์ผ ํจ
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# ===== IP ํฌ์๋ฉ (ํ์!) =====
# net.ipv4.ip_forward: Pod ๊ฐ ํจํท ๋ผ์ฐํ
# - ์ฟ ๋ฒ๋คํฐ์ค์์ ํ์ (Pod to Pod, Pod to Service ํต์ )
# - ํ์ธ: sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
# ===== Conntrack (์ฐ๊ฒฐ ์ถ์ ) ํ
์ด๋ธ =====
# net.netfilter.nf_conntrack_max: Conntrack ํ
์ด๋ธ ์ต๋ ํญ๋ชฉ ์
# - ๊ธฐ๋ณธ๊ฐ: 65536 (๋๋ฌด ์์!)
# - ๊ถ์ฅ๊ฐ: 1048576 (100๋ง, ๋๊ท๋ชจ ํด๋ฌ์คํฐ)
# - ์ค๋ช
:
# * Conntrack: iptables๊ฐ ์ํ ๊ธฐ๋ฐ ๋ฐฉํ๋ฒฝ์ ์ํด ์ฐ๊ฒฐ ์ถ์
# * ๊ฐ TCP/UDP ์ฐ๊ฒฐ๋ง๋ค ํญ๋ชฉ ์์ฑ (5-tuple: src IP, src port, dst IP, dst port, protocol)
# - ์ฟ ๋ฒ๋คํฐ์ค ์๋๋ฆฌ์ค:
# * 100๊ฐ Pod ร 10๊ฐ Service ร 100 ์ฐ๊ฒฐ = 100,000+ ํญ๋ชฉ
# * NodePort, LoadBalancer ์ฌ์ฉ ์ ๋ ๋ง์ ํญ๋ชฉ
# - ๋ฌธ์ : ์ด๊ณผ ์ "nf_conntrack: table full, dropping packet" ์๋ฌ
# - ํ์ธ:
# * cat /proc/sys/net/netfilter/nf_conntrack_count (ํ์ฌ ์ฌ์ฉ)
# * cat /proc/sys/net/netfilter/nf_conntrack_max (์ต๋๊ฐ)
# * conntrack -L | wc -l (์ค์ ์ฐ๊ฒฐ ์)
# - ๋ก๊ทธ: dmesg | grep conntrack
# - ๊ณ์ฐ: ๋๋ต ๋ฉ๋ชจ๋ฆฌ 1GB๋น 25,000 ํญ๋ชฉ ๊ฐ๋ฅ
net.netfilter.nf_conntrack_max = 1048576
net.nf_conntrack_max = 1048576
# net.netfilter.nf_conntrack_tcp_timeout_established: TCP ์ฐ๊ฒฐ ํ์์์
# - ๊ธฐ๋ณธ๊ฐ: 432000 (5์ผ!)
# - ๊ถ์ฅ๊ฐ: 86400 (1์ผ) ๋๋ 3600 (1์๊ฐ)
# - ์ค๋ช
: ESTABLISHED ์ํ TCP ์ฐ๊ฒฐ์ด Conntrack ํ
์ด๋ธ์ ์ ์ง๋๋ ์๊ฐ
# - ํจ๊ณผ: ์ค๋๋ ์ฐ๊ฒฐ ๋น ๋ฅด๊ฒ ์ ๊ฑฐํ์ฌ ํ
์ด๋ธ ๊ณต๊ฐ ํ๋ณด
# - ์ฃผ์: ๋๋ฌด ์งง์ผ๋ฉด (์: 300์ด) ์ฅ์๊ฐ ์ ์ง๋๋ ์ฐ๊ฒฐ ๋๊น
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
# net.netfilter.nf_conntrack_tcp_timeout_time_wait: TIME_WAIT ํ์์์
# - ๊ธฐ๋ณธ๊ฐ: 120์ด
# - ๊ถ์ฅ๊ฐ: 30์ด
# - ์ค๋ช
: TIME_WAIT ์ํ ์ฐ๊ฒฐ์ด Conntrack์ ์ ์ง๋๋ ์๊ฐ
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
# ===== ARP (Address Resolution Protocol) ํ
์ด๋ธ =====
# net.ipv4.neigh.default.gc_thresh1: ARP ํ
์ด๋ธ ์ํํธ ์ต์๊ฐ
# - ๊ธฐ๋ณธ๊ฐ: 128 (๋๋ฌด ์์!)
# - ๊ถ์ฅ๊ฐ: 8192
# - ์ค๋ช
: ์ด ๊ฐ ์ดํ์์๋ ๊ฐ๋น์ง ์ปฌ๋ ์
์คํ ์ ํจ
# - ๋ฌธ์ : ๊ฐ์ด ์์ผ๋ฉด "Neighbour table overflow" ์๋ฌ
# - ์ฟ ๋ฒ๋คํฐ์ค: Pod๋ง๋ค IP ์ฃผ์ โ ARP ํญ๋ชฉ ๊ธ์ฆ
net.ipv4.neigh.default.gc_thresh1 = 8192
# net.ipv4.neigh.default.gc_thresh2: ARP ๊ฐ๋น์ง ์ปฌ๋ ์
์์
# - ๊ธฐ๋ณธ๊ฐ: 512
# - ๊ถ์ฅ๊ฐ: 32768
# - ์ค๋ช
: ์ด ๊ฐ ์ด๊ณผ ์ ๊ฐ๋น์ง ์ปฌ๋ ์
์์ (์ค๋๋ ํญ๋ชฉ ์ ๊ฑฐ)
net.ipv4.neigh.default.gc_thresh2 = 32768
# net.ipv4.neigh.default.gc_thresh3: ARP ํ
์ด๋ธ ํ๋ ์ต๋๊ฐ
# - ๊ธฐ๋ณธ๊ฐ: 1024
# - ๊ถ์ฅ๊ฐ: 65536
# - ์ค๋ช
: ์ ๋ ์ด๊ณผ ๋ถ๊ฐ, ์ด๊ณผ ์ ์ ํญ๋ชฉ ๊ฑฐ๋ถ
# - ํ์ธ:
# * ip -s neigh show (ARP ํ
์ด๋ธ ํ์ธ)
# * arp -an | wc -l (ํญ๋ชฉ ์)
net.ipv4.neigh.default.gc_thresh3 = 65536
# ===== ํ์ผ ๋์คํฌ๋ฆฝํฐ =====
# fs.file-max: ์์คํ
์ ์ฒด ์ต๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ
# - ๊ธฐ๋ณธ๊ฐ: ์์ญ๋ง (์์คํ
๋ง๋ค ๋ค๋ฆ)
# - ๊ถ์ฅ๊ฐ: 2097152 (200๋ง)
# - ์ฟ ๋ฒ๋คํฐ์ค: ๊ฐ Pod๋ง๋ค ๋ค์์ FD ์ฌ์ฉ (์์ผ, ํ์ผ)
# - ํ์ธ:
# * cat /proc/sys/fs/file-nr (์ฌ์ฉ์ค / ์ฌ์ฉ๊ฐ๋ฅ / ์ต๋)
# * lsof | wc -l (์ด๋ฆฐ ํ์ผ ์)
fs.file-max = 2097152
# fs.inotify.max_user_watches: inotify ๊ฐ์ ํ์ผ ์
# - ๊ธฐ๋ณธ๊ฐ: 8192 (๋งค์ฐ ์์!)
# - ๊ถ์ฅ๊ฐ: 524288
# - ์ค๋ช
: ํ์ผ ๋ณ๊ฒฝ ๊ฐ์ง (kubectl logs -f, ConfigMap ์๋ ๋ฆฌ๋ก๋)
# - ๋ฌธ์ : ์ด๊ณผ ์ "too many open files" ๋๋ "no space left on device" (๋์คํฌ๋ ์ถฉ๋ถํ๋ฐ๋)
# - ์ฌ์ฉ ์ฌ๋ก:
# * kubectl logs -f (์ค์๊ฐ ๋ก๊ทธ)
# * Prometheus ํ์ผ ๊ฐ์
# * IDE (VS Code, IntelliJ)
# - ํ์ธ:
# * cat /proc/sys/fs/inotify/max_user_watches
# * find /proc/*/fd -lname anon_inode:inotify | wc -l (์ฌ์ฉ ์ค)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512
# ===== Swap ๋นํ์ฑํ (์ฟ ๋ฒ๋คํฐ์ค ๊ถ์ฅ) =====
# vm.swappiness: ์ฟ ๋ฒ๋คํฐ์ค์์๋ 0 ๊ถ์ฅ
# - ์ค๋ช
:
# * ์ฟ ๋ฒ๋คํฐ์ค๋ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค ์ ํ(limits)์ ์ ํํ ์ถ์ ํ์
# * Swap ์ฌ์ฉ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์์ธก ๋ถ๊ฐ โ Pod Eviction ์ค์๋
# - ๊ณต์ ๊ถ์ฅ: Swap ์์ ๋นํ์ฑํ (swapoff -a)
# - ๋์: vm.swappiness=0 (์ปค๋์ ๋ฐ๋ผ ์ฌ์ ํ ์ผ๋ถ Swap ์ฌ์ฉ ๊ฐ๋ฅ)
vm.swappiness = 0
# ===== PID ์ ํ =====
# kernel.pid_max: ์์คํ
์ต๋ ํ๋ก์ธ์ค ID
# - ๊ธฐ๋ณธ๊ฐ: 32768
# - ๊ถ์ฅ๊ฐ: 4194304 (๋๊ท๋ชจ ํด๋ฌ์คํฐ)
# - ์ฟ ๋ฒ๋คํฐ์ค: ๋ง์ Pod + Container โ ๋ง์ ํ๋ก์ธ์ค
# - ํ์ธ: cat /proc/sys/kernel/pid_max
kernel.pid_max = 4194304
# ===== ๋คํธ์ํฌ ์ฑ๋ฅ =====
# net.core.somaxconn: Ingress Controller, Service ์ฒ๋ฆฌ๋
# - ์ฟ ๋ฒ๋คํฐ์ค Ingress (Nginx, Traefik)๋ ๋์ backlog ํ์
net.core.somaxconn = 65535
# net.ipv4.tcp_max_syn_backlog: NodePort, LoadBalancer ํธ๋ํฝ
net.ipv4.tcp_max_syn_backlog = 8192
# ===== ๋ณด์ (์ ํ์ ) =====
# net.ipv4.conf.all.rp_filter: Calico, Flannel์์ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
# - Loose Mode (2) ๊ถ์ฅ (๋น๋์นญ ๋ผ์ฐํ
ํ์ฉ)
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2์ฟ ๋ฒ๋คํฐ์ค ๋ ธ๋ ์ ์ฉ ์์:
# /etc/sysctl.d/99-kubernetes.conf
# ๋ธ๋ฆฟ์ง ๋คํธ์ํฌ (ํ์)
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# IP ํฌ์๋ฉ (ํ์)
net.ipv4.ip_forward = 1
# Conntrack (๋๊ท๋ชจ ํด๋ฌ์คํฐ)
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
# ARP ํ
์ด๋ธ
net.ipv4.neigh.default.gc_thresh1 = 8192
net.ipv4.neigh.default.gc_thresh2 = 32768
net.ipv4.neigh.default.gc_thresh3 = 65536
# ํ์ผ ์์คํ
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
# ๋ฉ๋ชจ๋ฆฌ
vm.swappiness = 0
vm.overcommit_memory = 1
# ํ๋ก์ธ์ค
kernel.pid_max = 4194304
# ๋คํธ์ํฌ
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
# ์ ์ฉ
sudo modprobe br_netfilter
sudo sysctl --systemํ์ธ ์คํฌ๋ฆฝํธ:
#!/bin/bash
echo "=== ์ฟ ๋ฒ๋คํฐ์ค ์ปค๋ ํ๋ผ๋ฏธํฐ ํ์ธ ==="
echo "1. ๋ธ๋ฆฟ์ง ์ค์ :"
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.bridge.bridge-nf-call-ip6tables
echo "2. IP ํฌ์๋ฉ:"
sysctl net.ipv4.ip_forward
echo "3. Conntrack:"
echo " ํ์ฌ: $(cat /proc/sys/net/netfilter/nf_conntrack_count)"
echo " ์ต๋: $(cat /proc/sys/net/netfilter/nf_conntrack_max)"
echo "4. ARP ํ
์ด๋ธ:"
echo " ํญ๋ชฉ ์: $(ip neigh show | wc -l)"
sysctl net.ipv4.neigh.default.gc_thresh3
echo "5. ํ์ผ ๋์คํฌ๋ฆฝํฐ:"
cat /proc/sys/fs/file-nr
sysctl fs.inotify.max_user_watches
echo "6. Swap:"
sysctl vm.swappiness
free -h | grep Swap๊ณ ์ฑ๋ฅ ์น ์๋ฒ (Nginx/Apache):
# /etc/sysctl.d/99-web-server.conf
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 100000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10000 65535
vm.swappiness = 10
fs.file-max = 2097152
# ์ ์ฉ
sudo sysctl -p /etc/sysctl.d/99-web-server.conf๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ (MySQL/PostgreSQL):
# /etc/sysctl.d/99-database.conf
vm.swappiness = 1 # Swap ์ต์ํ
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
kernel.shmmax = 68719476736 # ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ต๋๊ฐ (64GB)
kernel.shmall = 4294967296
fs.file-max = 2097152
# Huge Pages (์: 10GB)
vm.nr_hugepages = 5120์ฟ ๋ฒ๋คํฐ์ค ์์ปค ๋ ธ๋:
# /etc/sysctl.d/99-kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.netfilter.nf_conntrack_max = 1048576
vm.swappiness = 0
fs.inotify.max_user_watches = 524288
fs.file-max = 2097152# ํ์ฌ ์ค์ ํ์ธ
sysctl -a | grep tcp_rmem
sysctl net.ipv4.tcp_tw_reuse
# ์ ์ฉ๋ ์ค์ ๊ฒ์ฆ
cat /proc/sys/net/ipv4/tcp_tw_reuse
cat /proc/sys/vm/swappiness
# ๋ถํ
์ ์๋ ์ ์ฉ ํ์ธ
sudo sysctl --system
# ์ค์ ํ์ผ ์์น
/etc/sysctl.conf # ์ ํต์ ์์น
/etc/sysctl.d/*.conf # ์ฐ์ ์ ์ฉ (๊ถ์ฅ)
/run/sysctl.d/*.conf # ๋ฐํ์ ์ค์
/usr/lib/sysctl.d/*.conf # ์์คํ
๊ธฐ๋ณธ๊ฐ| ํ๋ผ๋ฏธํฐ | ๊ธฐ๋ณธ๊ฐ | ๊ถ์ฅ๊ฐ | ์ฉ๋ |
|---|---|---|---|
vm.swappiness |
60 | 10 | ์น/DB ์๋ฒ |
net.core.somaxconn |
128 | 65535 | ๊ณ ์ฑ๋ฅ ์น ์๋ฒ |
net.ipv4.tcp_tw_reuse |
0 | 1 | TIME_WAIT ์ฌ์ฌ์ฉ |
fs.file-max |
์์ญ๋ง | 2097152 | ํ์ผ ๋์คํฌ๋ฆฝํฐ |
net.ipv4.ip_forward |
0 | 1 | ๋ผ์ฐํฐ/์ฟ ๋ฒ๋คํฐ์ค |
net.netfilter.nf_conntrack_max |
65536 | 1048576 | ์ฟ ๋ฒ๋คํฐ์ค |
fs.inotify.max_user_watches |
8192 | 524288 | IDE/๋น๋ ํด |
์ฃผ์์ฌํญ:
- ๋ณ๊ฒฝ ์ ๋ฐ๋์ ๋ฐฑ์ ํ์
- ํ๋ก๋์ ํ๊ฒฝ์ ํ ์คํธ ํ ์ ์ฉ
- ์์คํ
์ฌ๋ถํ
์์๋ ์ ์ง๋๋์ง ํ์ธ (
/etc/sysctl.conf๋๋/etc/sysctl.d/)
- What is Linux Kernel?
- Linux Documentation: https://www.kernel.org/doc/
- RedHat Documentation: https://access.redhat.com/documentation
- Ubuntu Server Guide: https://ubuntu.com/server/docs
- sysctl Documentation: https://www.kernel.org/doc/Documentation/sysctl/