주제 :
1. 하나의 서버당 동접자 2000명을 운영하기 위한 튜닝 사항들
2. 보안 설정에 필요한 커널 튜닝 사항들
3. 상기 튜닝내용들에 대한 적용방안 및 계획.
1. 글의 목적
서버 Xeon-2.4Ghz(듀얼), 메모리 1GB자원을 가지는 서버에 FreeBSD를 설치하여 프록시와 같은 통신서버로 사용할 경우, 서버성능을 극대화 시킬 수 있는 여러 튜닝사항들을 다음과 같이 정리하고자 한다.
2. 튜닝 기준
동접자 수 : 2000명,
서버자원 : Xeon 2.4Ghz 듀얼, 1GM
3. 커널 튜닝 적용 내용
다음과 같이 향후 1월드에 테스트로 적용하게될 여러 튜닝사항들은 관련 인터넷 기술문서와 서적을 참조로 하여 작성되어 졌으며, 그 신뢰성은 상당히 높은 수준의 것들로써 참조하였다. 또한 더욱 안정적인 테스트를 위해 해당 문서의 내용상 또는 그 문서의 신뢰성이 보장되지 않을 경우에는 해당 튜닝 사항에서 제외하였다. 다음은 이러한 내용들을 각 항목별로 정리하였다.
3.1. “ maxusers 512 “ 설정
maxusers 값은 커널 내부 테이블의 크기를 계산하기 위해 사용되는 대략적인 값이다. 이 커널 내부 테이블은 네트워크 연결의 최대 개수와 동시에 열릴 수 있는 파일의 최대 개수 같은 것들을 제어한다. 따라서 maxusers값이 너무 낮으면 파일과 네트웍크 연결을 모두 처리할 수 없다. 만약 이러한 경우 커널로그(/var/log/message)에서 그 내용을 확인 할 수 있다.
현재 디오 시스템에 운영중인 프록시 서버와 게임 서버에는 이러한 메시지를 찾아 볼 수 없기 때문에 기존 설정 값인 512로 설정을 유지하고자 한다.
※ 참고 : 256으로 설정할 경우 수천개의 네트웍크와 파일들을 처리할 수 있는 수준들이다.
3.2. Window Size 설정
Window Size를 늘려 줄 경우 보다 효과적인 데이터 전송이 가능하다 하지만 이 값을 무리하게 늘릴 경우 시스템자원을 크게 소모하게 되어 메모리(mbuf) 부족으로 동시접속TCP세션 수를 떨어 뜨릴 수 있기 때문에 해당 시스템의 자원현황을 고려하여 증설해야 할 것이다.
현재 모든 디오 시스템에 설정된 해당 값들은 아래의 커널 설정의 내용처럼 모두 32KB로 적절構?설정되어 있고 Stevens著의 “TCP illustrated” 의 내용으로 볼 때에도 크게 문제되지 않을것으로 판단되어 지기 때문에 해당 커널설정을 변경할 필요가 없을 것으로 여겨진다.
net.inet.tcp.sendspace=32767 //Maximum outgoing TCP datagram size
net.inet.tcp.recvspace=32767 //Maximum incoming TCP datagram size
net.inet.udp.recvspace=65535 //Maximum incoming UDP datagram size
net.inet.udp.maxdgram=57344
net.local.stream.recvspace=65535
net.local.stream.sendspace=65535
3.3. 최대 동시 접속자 수 증대를 위한 mbuf와 nmbclusters 관련 커널설정
mbufs는 서버가 처리할 수 있는 네트웍크 연결 개수가 아니라, 네트워크 연결을 유지하기 위해 사용되는 메모리이며, 하나의 네트웍크 연결이 여러 개의 mbufs(2KB)를 소비한다. Nmbclusters은 커널이 생성한 mbufs의 수를 제어하기 때문에 nmbcluster의 값이 적을 경우 동시 접속 TCP세션수가 줄어 들 수 있다.
하나의 프록시 서버에 1000명의 동접자를 안정적으로 서비스를 제공하기 위해 사용되는 최대 동시 접속TCP세션은 3000세션이 사용되어 질 수 있다. 따라서nmbcluster 용량은 해당 세션수에 따라 다음과 같이 설정되어야 한다. ( 현재 nmbcluster는 maxusers 설정수에 따라 25600으로 설정됨 )
최대 동접자 수 1000명 ( 2500 tcp session )
tcp windowsize = 32K (단방향)
mbuf = 양방향 tcp windowsize *2*최대 동접 세션수 = 64K*2*3000 = 384000K
nmbcluster = mbuf / 2K = 384000K / 2k = 192000
* 참고 : 일반적으로 실제 메모리(1GB)의 1/4(250MB) 상당의 메모리를 mbuf로 사용하는 것이 일반적이다
3.4. 소켓 통신 버퍼 설정
다음은 프록시 서버와 같이 고속 데이터 처리를 요구함과 동시에 많은 통신세션을 안정적으로 유지하는데 있어 필요한 설정사항으로써 해당 설정을 충분히 늘려줄 경우 외부 해커의 SYN attacks과 같은 SYNFLOOD attacks등의 DOS공격 또한 막을 수 있다. 따라서 외부 DOS해킹 공격이 예상됨과 동시에 대량의 트레픽을 고속으로 처리가 요구되는 프록시 서버에 다음과 같은 커널설정 요구되겠다
kern.ipc.maxsockbuf=4194304 //Maximum socket buffer size설정
kern.ipc.somaxconn=8192 //Maximum pending socket connection queue size설정
kern.ipc.maxsockets=16424 //Maximum socket개수 설정
kern.maxfiles=65536 //Maximum files 개수 설정
kern.maxfilesperproc=32768 //Maximum files allowed open per process설정
3.5. 통신 프로토콜 커널 튜닝
RFC1323은 4.4BSD(Net/3)에서 추가된 TCP Extention이다. TCP Header에 새로운 옵션을 추가해서 FDDI나 Gigabit Ethernet등의 고속의 Link에서 동작될때 TCP 통신의 제약을 극복하고자하는 프로토콜이다. 해당 프로토콜은 TCP Window Scale Option, RTT계산, Sequence Number Wrapping 시에 2MSL State 감지등의 기능을 가지고 있다.
당사 DO네트웍 망의 경우 100Mbit Link의 망을 사용하고 있기 때문에 FreeBSD의 TCP Extention(RFC1323) 기능이 활성화 되는 것이 성능상볼 때 매우 바람직하겠다.
net.inet.tcp.rfc1323=1 //rfc1323프로토콜 설정
3.6. 통신 보안 설정 ( 프록시 서버의 경우에만 적용 )
프록시 시스템의 경우 외부환경(외부네트웍망)에 노출되어 있기 때문에 악의적 목적을 가진 해커의 공격대상이 될 수 있기 있다. 따라서 syn flooding attack과 같은 다양한 외부 해킹 공격을 최대한 방어하기 위해서는 OS자체적으로 가지고있는 보안상의 문제점을 다음에 나열한 커널튜닝 내용들을 적용함으로써 최소화 시킬 수 있다..
입입되는 SYN segment는 단순히 drop되어지며 어떠한 RST도 보내지 않는다. 이것이 blackhole으로써의 시스템 구현이다. 이처럼 구현하기 위해 다음의 설정내용과 같이 2값으로 설정할 경우 닫힌 포트에 도착한 어떠한 segment일 지라도 RST없이 모두 drop되어진다. 이러한 설정은 악위적으로 서비스를 저해하려는 사용자(크래커)가 stealth port scans하는 것을 막을 수 있는 동시에 Dos공격 또한 방어할 수 있으나 자칫 시스템이 패닉상태로 빠질 수 있는 단점이 있다.(해당 설정의 경우 인터넷에서는 많은 이가 FreeBSD4.9에서 설정할 경우 패닉현상이 발생되었다는 보고가 조사되었다.)
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
다음은 IP패킷이 해당 시스템의 인터페이스에 도착하였을 경우 패킷이 패킷의 송신 주소와 일치하는지를 검사하도록 하여 spoofing공격에 대비하도록 하는 설정 내용이다.
net.inet.ip.check_interface=1
잘 디자인된 네트웍에서는 종단 시스템에 리다이렉트(redirect)되는 것은 요구되지 않는다. 즉 리다이렉트를 받는쪽이나 보낸쪽 모두 불가능하도록 설정해야 한다. 이를 위해 다음과 같이 커널을 튜닝해야 한다.
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
Source routing이란 패킷을 전송하고자 하는 노드가 목적지까지의 경로를 미리 결정하여 패킷 헤더에 첨부하여 보내는 방법이다. 송신자(sender)가 최적의 경로를 설정할 수 있다는 장점이 있으나 경로가 길 경우 헤더의 길이가 너무 길어질 수가 있고, 해당 경로상의 링크나 노드가 고장이 났다면 패킷이 전달되지 못하는 단점이 있다. hop-by-hop routing은 패킷을 전달받은 중간 노드가 패킷을 넘겨줄 다음 노드를 결정하므로 경로가 비효율적일 수 있다. 이들 두 방법을 절충한 형태로 송신자가 패킷이 전달되어야 할 경로를 하나의 경로로 지정하지 않고 라우터의 집합으로 지정하는 loose source routing 방법도 제안되었다. 이 경우에 정확한 경로는 라우터의 집합에서 스스로 판단하게 된다
이러한 source routing은 해커가 네트워크 토폴로지상에서 보안체 계를 우회하도록 사용될 수 있다. 물론 하나의 네트워크상에서 source-route된 패킷은 특별한 경우를 제외하고는 사용되지 않는다. 그렇기 때문에 IP Forwarding을 제공하는 모든 호스트들은 kernel 변수인 ip_forward_src_routed를 0으로 세팅하여 source-route된 패킷들이 자동으로 drop되도록 설정하여 운영하여야 한다. 그 설정 내용은 다음과 같다.
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
4. 성능향상 관련 커널 설정
kern.maxusers=512 //maxusers
kern.ipc.nmbclusters=192000 //nmbcluster 설정
net.inet.tcp.rfc1323=1 //rfc1323프로토콜 설정
kern.ipc.maxsockbuf=4194304 //Maximum socket buffer size설정
kern.ipc.somaxconn=8192 //Maximum pending socket connection queue size설정
kern.ipc.maxsockets=16424 //Maximum socket개수 설정
kern.maxfiles=65536 //Maximum files 개수 설정
kern.maxfilesperproc=32768 //Maximum files allowed open per process설정
net.inet.tcp.sendspace=32767 //Maximum outgoing TCP datagram size
net.inet.tcp.recvspace=32767 //Maximum incoming TCP datagram size
net.inet.udp.recvspace=65535 //Maximum incoming UDP datagram size
net.inet.udp.maxdgram=57344
net.local.stream.recvspace=65535 //로컬 스트림통신에 대한 윈도우사이즈 설정
net.local.stream.sendspace=65535
5. 시스템 보안 관련 커널 설정
net.inet.ip.check_interface=1
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
FreeBSD 튜닝방안 - 동접자수 증대방안