Thứ Hai, 7 tháng 5, 2012

Điều chỉnh Network Stack của Linux (Buffers Size) để tăng hiệu suất mạng


Vấn đề

Tôi có 2 server được đặt ở 2 data center khác nhau. Cả 2 server đều có một lượng lớn các file truyền đồng thời. Nhưng hiệu suất mạng rất kém đối với các file lớn và hiệu suất bị giảm sút đối với các file lớn. Làm thế nào để điều chỉnh TCP trên Linux để giải quyết vấn đề này?

Giải pháp

Mặc định network stack của Linux không được cấu hình để có được tốc độ truyền tải cao với các file lớn qua kết nối WAN. Điều này là để tiết kiệm tài nguyên bộ nhớ. Bạn có thể dễ dàng điều chỉnh network stack bằng cách tăng network buffers size để tăng tốc mạng kết nối đến hệ thống server để xử lý nhiều network packet hơn.
Giá trị mặc định lớn nhất của Linux TCP buffer size thường là nhỏ. TCP memory được tính toán tự động dựa trên memory của hệ thống; bạn có thể tìm giá trị thực bằng cách gõ lệnh sau:
$ cat /proc/sys/net/ipv4/tcp_mem
Giá trị mặc định và giá trị tối đa của socket memory nhận:
$ cat /proc/sys/net/core/rmem_default
$ cat /proc/sys/net/core/rmem_max
Giá trị mặc định và giá trị tối đa của socket memory gửi:
$ cat /proc/sys/net/core/wmem_default
$ cat /proc/sys/net/core/wmem_max
Giá trị tối đa của tùy chọn bộ nhớ đệm:
$ cat /proc/sys/net/core/optmem_max

Điều chỉnh các giá trị

Thiết lập giá trị tối đa của send buffer size (wmem) và receice buffer size (rmem) thành 12 MB cho hàng đợi trên tất cả các giao thức. Nói cách khác là thiết lập lượng bộ nhớ để phân bổ cho mỗi TCP socket khi nó được mở hoặc được tạo ra khi truyền file:
WARNING! Giá trị mặc định của rmem_max và wmem_max là 128 KB trong hầu hết các bản phân phối Linux, giá trị này có thể đu cho môi trường mạng thông thường có độ trễ thấp hoặc cho các ứng dụng như DNS / Web server. Tuy nhiên, nếu độ trễ lớn, kích thước mặc định có thể là nhỏ. Chú ý rằng các thiết lập sau để tăng bộ nhớ sử dụng trên server.
# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
Bạn cũng cần thiết lập giá trị nhỏ nhất, giá trị khởi tạo, và giá trị lớn nhất trong bytes:
# echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf
Bật window scaling có thể là một lựa chọn để mở rộng transfer window:
# echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
Kích hoạt nhãn thời gian theo định nghĩa trong RFC1323:
# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf
Kích hoạt báo nhận ack:
# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
Mặc định, TCP lưu lại rất nhiều số liệu kết nối trong bộ nhớ đệm định tuyến khi các kết nối đóng lại, bởi vậy các kết nối được thiết lập trong tương lai gần có thể sử dụng chúng để thiết lập điều kiện ban đầu.
Thông thường, điều này tăng hiệu năng tổng thể, nhưng có thể đôi khi là nguyên nhân giảm hiệu năng. Nếu thiết lập, TCP sẽ không cache dữ liệu khi đóng các kết nối.
# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
Thiết lập lượng packets tối đa, hàng đợi phía INPUT, khi interface nhận gói nhanh hơn kernel thì có thể thực hiện chúng.
# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
Thực hiện reload để cập nhật các thay đổi:
# sysctl -p
Sử dụng tcpdump để xem các thay đổi với eth0:
# tcpdump -ni eth0

Tăng cường bảo mật cho Kernel Linux


Vấn đề

Làm thế nào để thiết lập các tùy chọn bảo mật cấp cao với TCP/IP và bộ nhớ ảo (virtual memory) để cải thiện bảo mật và hiệu năng của hệ thống? Cấu hình Linux kernel như thế nào để ngăn chặn các dạng tấn công đã biết bằng cách sử dụng /etc/sysctl.conf? Thiết lập các tham số của kernel như thế nào?

Giải pháp

sysctl là một giao diện cho phép bạn thực hiện các thay đổi tới một Linux kernel đang hoạt động. Với /etc/sysctl.conf bạn có thể cấu hình rất nhiều các thiết lập về mạng và hệ thống Linux, như:
1.Cấu hình giới hạn băng thông mạng cho IPv4
2.Cấu hình giới hạn băng thông mạng cho IPv6
3. Bật lá chắn bảo vệ
4. Ngăn cản các dạng ‘syn flood attack’ thông thường
5. Bật chế độ xác thực địa chỉ IP nguồn verification
6. Ngăn chặn cracker sử dụng spoofing attack theo địa chỉ IP của server.
7. Log lại những kiểu gói tin (packets) khả nghi, như spoofed packets (giả mạo gói tin), các gói định tuyến nguồn, và chuyển hướng.

lệnh sysctl

Lệnh sysctl được sử dụng để sửa đổi các tham số của kernel khi đang chạy. /etc/sysctl.conf là một file text lưu trữ các giá trị sysctl để đọc vào bộ nhớ và thiết thiết lập bởi sysctl lúc khởi động. Để xem các giá trị hiện hành, dùng lệnh:

# sysctl -a
# sysctl -A
# sysctl mib
# sysctl net.ipv4.conf.all.rp_filter
Để tải các thiết lập, dùng lệnh:
# sysctl -p

File /etc/sysctl.conf mẫu

Sửa /etc/sysctl.conf và cập nhật nó như sau. File này có hướng dẫn với các comments kèm theo. Tuy nhiên, Tôi khuyên bạn nên đọc tài liệu hướng dẫn từ các file help chính thức của Linux kernel để điểu chỉnh sysctl (xem dưới đây):
# The following is suitable for dedicated web server, mail, ftp server etc.
# ---------------------------------------
# BOOLEAN Values:
# a) 0 (zero) - disabled / no / false
# b) Non zero - enabled / yes / true
# --------------------------------------
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
 
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
 
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
 
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
 
# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1
 
# Controls the use of TCP syncookies
#net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
 
########## IPv4 networking start ##############
# Send redirects, if router, but this is just server
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
 
# Accept packets with SRR option? No
net.ipv4.conf.all.accept_source_route = 0
 
# Accept Redirects? No, this is not router
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
 
# Log packets with impossible addresses to kernel log? yes
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
 
# Ignore all ICMP ECHO and TIMESTAMP requests sent to it via broadcast/multicast
net.ipv4.icmp_echo_ignore_broadcasts = 1
 
# Prevent against the common 'syn flood attack'
net.ipv4.tcp_syncookies = 1
 
# Enable source validation by reversed path, as specified in RFC1812
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
 
########## IPv6 networking start ##############
# Number of Router Solicitations to send until assuming no routers are present.
# This is host and not router
net.ipv6.conf.default.router_solicitations = 0
 
# Accept Router Preference in RA?
net.ipv6.conf.default.accept_ra_rtr_pref = 0
 
# Learn Prefix Information in Router Advertisement
net.ipv6.conf.default.accept_ra_pinfo = 0
 
# Setting controls whether the system will accept Hop Limit settings from a router advertisement
net.ipv6.conf.default.accept_ra_defrtr = 0
 
#router advertisements can cause the system to assign a global unicast address to an interface
net.ipv6.conf.default.autoconf = 0
 
#how many neighbor solicitations to send out per address?
net.ipv6.conf.default.dad_transmits = 0
 
# How many global unicast IPv6 addresses can be assigned to each interface?
net.ipv6.conf.default.max_addresses = 1
 
########## IPv6 networking ends ##############
 
#Enable ExecShield protection
kernel.exec-shield = 1
kernel.randomize_va_space = 1
 
# TCP and memory optimization
# increase TCP max buffer size setable using setsockopt()
#net.ipv4.tcp_rmem = 4096 87380 8388608
#net.ipv4.tcp_wmem = 4096 87380 8388608
 
# increase Linux auto tuning TCP buffer limits
#net.core.rmem_max = 8388608
#net.core.wmem_max = 8388608
#net.core.netdev_max_backlog = 5000
#net.ipv4.tcp_window_scaling = 1
 
# increase system file descriptor limit
fs.file-max = 65535
 
#Allow for more PIDs
kernel.pid_max = 65536
 
#Increase system IP port limits
net.ipv4.ip_local_port_range = 2000 65000