미꾸라지 SP: 중계 서버 설치 ============================= .. note:: 문서에 오류가 있거나 건의 사항이 있으시면 메세지를 미꾸라지 포럼 (https://mudfish.net/forums/9) 에 남겨주세요. 이 문서는 미꾸라지 Server (혹은 미꾸라지 중계 서버) 를 운영하고자 하는 분들을 위한 것으로 환경 설정 및 실행 절차에 대해 기술하고 있습니다. 현재 미꾸라지 Server 는 다음과 운영체제 환경에서 돌아갈 수 있도록 설계되어 있습니다. * Amazon Linux - EC2 (64 bit) Macro instance 상에서도 무리 없이 돌아가야 합니다. :-) * CentOS 5.x 와 6.x (64 bit) 주의사항 -------- .. warning:: 미꾸라지 Server 패키지의 경우, 프로그램 설치 시 아래와 같은 내용이 자동으로 중앙 서버에 보고되게 되어 있습니다. 아래의 내용을 주의 깊게 읽으시고 **동의하지 않는다면** 설치를 자제해 주시기 바랍니다. 1. /var/log/messages 파일에서 미꾸라지 관련 서버 프로그램의 Warning, Error 등등 이상 오류가 발생될 시 해당 내용이 미꾸라지 중앙 서버로 자동 전송 및 수집 됩니다. 미꾸라지 Server 프로세스와 관련된 내용만 해당됩니다. 2. 미꾸라지 Server 프로그램을 통해 발생되는 Traffic 자료가 중앙 서버로 전송 및 수집됩니다. 사용자별 혹 서버별 traffic 산출에 사용됩니다. 3. 주기적인 heartbeat 신호를 중앙 서버로 전달되게 됩니다. 이는 중계 서버의 alive 여부를 따져 사용자로 하여금 어떤 서버가 살아있고 죽었는지를 알수 있도록 하기 위해서입니다. 4. 중계 서버와 미꾸라지에서 제공되는 게임 서버 (Backend 서버) 간의 RTT (Round Trip Time) 이 계산되어 중앙 서버로 전송 및 수집되게 됩니다. 이 정보는 미꾸라지 사용자가 마법사 메뉴를 통해 혹은 라우팅 테이블 설정을 위한 메뉴를 열었을 때 사용자 <-> 중계 서버 <-> 게임 서버 간의 RTT 정보를 보여주기 위해서입니다. 다운로드 -------- 미꾸라지 Server 프로그램은 미꾸라지 홈페이지 (http://sp.mudfish.net) 을 통해 배포하고 있습니다. 최신 버전의 패키지를 다운로드 받으시려면 홈페이지를 방문해 주세요. 설치하기 -------- .. warning:: 다음과 같은 환경에서 무리 없이 실행됩니다. * 실제 physical 한 서버 * OpenVZ * KVM * Xen 패키지를 설치하기 위해서는 root 권한이 필요하며 아래와 같은 패키지가 dependency 로 설정되어 있습니다. * gcc Cache-Terminator 가 gcc 에 대한 의존성을 가지고 있습니다. 이유는 VCL (Varnish Configuration Language) 가 gcc 기반으로 작성되어 있기 때문입니다. * GeoIP Cache-Terminator 가 GeoIP 에 대한 의존성을 가지고 있으며, 설정을 통해 사용자의 IP 가 어떤 국가에서 왔는지 확인을 하기 위해 사용될 수 있습니다. .. note:: 만약 CentOS 5.x 상에서, yum install GeoIP 시도 시 패키지를 찾을 수 없다고 나온다면 yum repository 중 "extras" repository 가 활성화되어 있는지 확인 바랍니다. 만약 CentOS 6.x 상에서, yum install GeoIP 시 패키지를 찾을 수 없다면 EPEL(Extra Packages for Enterprise Linux) yum repository 를 설치하셔야 합니다. 아래와 같은 명령을 통해 설치하셔서 다시 한번 더 해보시기 바랍니다. .. code-block:: none # cd /tmp/ # wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # rpm -ivh epel-release-6-8.noarch.rpm 위 두 패키지를 yum 명령어를 통해 우선 설치합니다. .. code-block:: none # yum install gcc GeoIP Loaded plugins: priorities, security, update-motd, upgrade-helper amzn-main | 2.1 kB 00:00 amzn-updates | 2.3 kB 00:00 Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package GeoIP.x86_64 0:1.4.8-1.5.amzn1 will be installed ---> Package gcc.noarch 0:4.6.2-1.8.amzn1 will be installed --> Processing Dependency: gcc46 = 4.6.2 for package: gcc-4.6.2-1.8.amzn1.noarch --> Running transaction check ---> Package gcc46.x86_64 0:4.6.2-2.65.amzn1 will be installed --> Processing Dependency: cpp46 = 4.6.2-2.65.amzn1 for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Processing Dependency: libgcc46 = 4.6.2 for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Processing Dependency: binutils >= 2.20.51.0.2-12 for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Processing Dependency: libgomp >= 4.6.2-2.65.amzn1 for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Processing Dependency: glibc-devel >= 2.2.90-12 for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Processing Dependency: libmpfr.so.1()(64bit) for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Processing Dependency: libmpc.so.2()(64bit) for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Processing Dependency: libgomp.so.1()(64bit) for package: gcc46-4.6.2-2.65.amzn1.x86_64 --> Running transaction check ---> Package binutils.x86_64 0:2.20.51.0.7-8.29.amzn1 will be installed ---> Package cpp46.x86_64 0:4.6.2-2.65.amzn1 will be installed ---> Package glibc-devel.x86_64 0:2.12-1.80.42.amzn1 will be installed --> Processing Dependency: glibc-headers = 2.12-1.80.42.amzn1 for package: glibc-devel-2.12-1.80.42.amzn1.x86_64 --> Processing Dependency: glibc-headers for package: glibc-devel-2.12-1.80.42.amzn1.x86_64 ---> Package libgcc46.x86_64 0:4.6.2-2.65.amzn1 will be installed ---> Package libgomp.x86_64 0:4.7.2-2.69.amzn1 will be installed ---> Package libmpc.x86_64 0:0.8.2-1.4.amzn1 will be installed ---> Package mpfr.x86_64 0:2.4.2-1.7.amzn1 will be installed --> Running transaction check ---> Package glibc-headers.x86_64 0:2.12-1.80.42.amzn1 will be installed --> Processing Dependency: kernel-headers >= 2.2.1 for package: glibc-headers-2.12-1.80.42.amzn1.x86_64 --> Processing Dependency: kernel-headers for package: glibc-headers-2.12-1.80.42.amzn1.x86_64 --> Running transaction check ---> Package kernel-headers.x86_64 0:3.2.39-6.88.amzn1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: GeoIP x86_64 1.4.8-1.5.amzn1 amzn-main 783 k gcc noarch 4.6.2-1.8.amzn1 amzn-main 2.7 k Installing for dependencies: binutils x86_64 2.20.51.0.7-8.29.amzn1 amzn-main 3.6 M cpp46 x86_64 4.6.2-2.65.amzn1 amzn-main 4.8 M gcc46 x86_64 4.6.2-2.65.amzn1 amzn-main 14 M glibc-devel x86_64 2.12-1.80.42.amzn1 amzn-main 1.0 M glibc-headers x86_64 2.12-1.80.42.amzn1 amzn-main 648 k kernel-headers x86_64 3.2.39-6.88.amzn1 amzn-updates 847 k libgcc46 x86_64 4.6.2-2.65.amzn1 amzn-main 98 k libgomp x86_64 4.7.2-2.69.amzn1 amzn-updates 113 k libmpc x86_64 0.8.2-1.4.amzn1 amzn-main 49 k mpfr x86_64 2.4.2-1.7.amzn1 amzn-main 182 k Transaction Summary ================================================================================ Install 12 Package(s) Total download size: 26 M Installed size: 50 M Is this ok [y/N]: y Downloading Packages: (1/12): GeoIP-1.4.8-1.5.amzn1.x86_64.rpm | 783 kB 00:00 (2/12): binutils-2.20.51.0.7-8.29.amzn1.x86_64.rpm | 3.6 MB 00:00 (3/12): cpp46-4.6.2-2.65.amzn1.x86_64.rpm | 4.8 MB 00:00 (4/12): gcc-4.6.2-1.8.amzn1.noarch.rpm | 2.7 kB 00:00 (5/12): gcc46-4.6.2-2.65.amzn1.x86_64.rpm | 14 MB 00:00 (6/12): glibc-devel-2.12-1.80.42.amzn1.x86_64.rpm | 1.0 MB 00:00 (7/12): glibc-headers-2.12-1.80.42.amzn1.x86_64.rpm | 648 kB 00:00 (8/12): kernel-headers-3.2.39-6.88.amzn1.x86_64.rpm | 847 kB 00:00 (9/12): libgcc46-4.6.2-2.65.amzn1.x86_64.rpm | 98 kB 00:00 (10/12): libgomp-4.7.2-2.69.amzn1.x86_64.rpm | 113 kB 00:00 (11/12): libmpc-0.8.2-1.4.amzn1.x86_64.rpm | 49 kB 00:00 (12/12): mpfr-2.4.2-1.7.amzn1.x86_64.rpm | 182 kB 00:00 -------------------------------------------------------------------------------- Total 15 MB/s | 26 MB 00:01 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : mpfr-2.4.2-1.7.amzn1.x86_64 1/12 Installing : libmpc-0.8.2-1.4.amzn1.x86_64 2/12 Installing : cpp46-4.6.2-2.65.amzn1.x86_64 3/12 Installing : kernel-headers-3.2.39-6.88.amzn1.x86_64 4/12 Installing : glibc-headers-2.12-1.80.42.amzn1.x86_64 5/12 Installing : glibc-devel-2.12-1.80.42.amzn1.x86_64 6/12 Installing : libgcc46-4.6.2-2.65.amzn1.x86_64 7/12 Installing : libgomp-4.7.2-2.69.amzn1.x86_64 8/12 Installing : binutils-2.20.51.0.7-8.29.amzn1.x86_64 9/12 Installing : gcc46-4.6.2-2.65.amzn1.x86_64 10/12 Installing : gcc-4.6.2-1.8.amzn1.noarch 11/12 Installing : GeoIP-1.4.8-1.5.amzn1.x86_64 12/12 Verifying : binutils-2.20.51.0.7-8.29.amzn1.x86_64 1/12 Verifying : glibc-headers-2.12-1.80.42.amzn1.x86_64 2/12 Verifying : GeoIP-1.4.8-1.5.amzn1.x86_64 3/12 Verifying : libmpc-0.8.2-1.4.amzn1.x86_64 4/12 Verifying : gcc46-4.6.2-2.65.amzn1.x86_64 5/12 Verifying : gcc-4.6.2-1.8.amzn1.noarch 6/12 Verifying : libgomp-4.7.2-2.69.amzn1.x86_64 7/12 Verifying : libgcc46-4.6.2-2.65.amzn1.x86_64 8/12 Verifying : mpfr-2.4.2-1.7.amzn1.x86_64 9/12 Verifying : cpp46-4.6.2-2.65.amzn1.x86_64 10/12 Verifying : glibc-devel-2.12-1.80.42.amzn1.x86_64 11/12 Verifying : kernel-headers-3.2.39-6.88.amzn1.x86_64 12/12 Installed: GeoIP.x86_64 0:1.4.8-1.5.amzn1 gcc.noarch 0:4.6.2-1.8.amzn1 Dependency Installed: binutils.x86_64 0:2.20.51.0.7-8.29.amzn1 cpp46.x86_64 0:4.6.2-2.65.amzn1 gcc46.x86_64 0:4.6.2-2.65.amzn1 glibc-devel.x86_64 0:2.12-1.80.42.amzn1 glibc-headers.x86_64 0:2.12-1.80.42.amzn1 kernel-headers.x86_64 0:3.2.39-6.88.amzn1 libgcc46.x86_64 0:4.6.2-2.65.amzn1 libgomp.x86_64 0:4.7.2-2.69.amzn1 libmpc.x86_64 0:0.8.2-1.4.amzn1 mpfr.x86_64 0:2.4.2-1.7.amzn1 Complete! # 설치가 완료되었다면 이제 mudfish-server RPM 패키지를 설치합니다. .. code-block:: none # rpm -ivh mudfish-server-1.0.0-0.x86_64.rpm Preparing... ########################################### [100%] 1:mudfish-server ########################################### [100%] 패키지의 설치는 완료되었습니다. 이제 미꾸라지 사용자가 이 중계 서버에 접속할 수 있도록 방화벽 설정을 하셔야 합니다. 방화벽 설정 ----------- 미꾸라지 Server 가 정상 작동되기 위해서는 반드시 아래의 방화벽 정책이 필요합니다. * TCP/UDP 10007 와 10008 포트 10007 포트와 10008 포트는 서버 데몬이 외부로부터 트래픽을 받기 위해 listening 하고 있는 포트들로써 반드시 TCP 와 UDP 모두 open 되어 있어야 합니다. * ICMP 미꾸라지 중계 서버로 등록이 되는 순간부터 미꾸라지 사용자들은 해당 중계 서버로 RTT (Round Trip Time) 값을 체크하기 위해 ICMP echo 메세지를 보내게 됩니다. (사용자의 설정에 따라 UDP 혹은 TCP 프로토콜이 사용될 수 있습니다만, default 는 ICMP 입니다.) 그렇기 때문에 만약 ICMP 프로토콜이 open 되어 있지 않다면 사용자들은 RTT 계산을 할 수 없게 됩니다. 이제 방화벽이 설정되었다면 시스템을 설정할 차례입니다. 시스템 설정 ----------- 시스템 설정은 두 부분으로 나누어집니다. 첫 번째는 NAT 설정이며, 두 번째는 IP forwarding 설정입니다. 아래의 명령어를 통해서 시스템을 설정할 수 있습니다. 명령을 실행하면서 오류가 발생한다면 포럼을 통해 문의 바랍니다. .. code-block:: none # /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 10.252.0.0/14 # /sbin/sysctl net.ipv4.ip_forward=1 만약 미꾸라지 Server v1.0.4 혹은 이상의 버전을 사용하고 계신다면 아래와 같이 추가적으로 sysctl 명령을 실행시켜 주셔야 합니다. .. code-block:: none # /sbin/sysctl net.ipv4.icmp_echo_ignore_all=1 .. note:: 만약 어떠한 이유로 시스템이 재부팅이 되게 되면 위에서 설정한 내용들이 **초기화 된다는 사실** 을 알아 두셔야 합니다. 만약 재부팅이 되어도 자동으로 위 내용이 세팅되길 원하신다면 위의 세팅을 모두 완료 후 아래의 명령을 이용해 정보를 시스템에 저장해 두세요. .. code-block:: none # /etc/init.d/iptables save # echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf # echo "net.ipv4.icmp_echo_ignore_all = 1" >> /etc/sysctl.conf 만약 미꾸라지 Server 가 시스템 재부팅시 자동 시작되길 원하신다면 아래의 명령으로 시스템에 등록해 두세요. .. code-block:: none # /sbin/chkconfig --level 2345 mudfish-server on 이제 미꾸라지 Server 설정 파일들을 용도에 맞게 수정할 차례입니다. 설정파일 -------- 기본적으로 설정파일을 전혀 수정하지 않고 미꾸라지 Server 를 실행하신다면 default 로 다음과 같은 이름 및 정책으로 중앙 서버에 등록되게 됩니다. * ``name`` 파일이 없거나 내용이 비어 있다면 서버 이름은 중앙 서버에서 임의 지정한 이름으로 설정됩니다. 보통 Public IP 와 국가 코드가 등록됩니다. * ``owner_name`` 혹은 ``owner_email`` 에 대한 정보가 없다면 Unknown 으로 미꾸라지 웹 페이지에 나타날 것입니다. * ``users_allow`` 혹은 ``users_deny`` 에 대한 임의 설정이 없다면 기본적으로 모든 사용자의 접속을 허용하도록 ACL 정책이 설정됩니다. Server 프로그램의 설정 파일은 항상 ``/etc/mudfish-server/`` 디렉토리 하위에 놓이게 되어 있습니다. 각 설정 파일에 대해 설명하겠습니다. * ``/etc/mudfish-server/commercial_node`` 만약 이 파일의 값이 True, 혹은 Yes 일 경우, 이 중계 서버는 유료 서버로 중앙 서버에 등록됩니다. 만약 무료 서버로 등록하실 생각이시면 이 파일을 생성하지 않거나, False 혹은 No 로 설정하시면 됩니다. .. code-block:: none $ cat /etc/mudfish-server/commercial_node Yes * ``/etc/mudfish-server/commercial_node_currency`` commercial_node_price_domestic 파일과 commercial_node_price_international 파일에 기술될 G 당 traffic 비용에 대한 통화를 기록합니다. 등록 가능한 통화는 아래의 목록과 같습니다. * KRW * USD 유료 서버로 등록된 경우에 대해서만 유효합니다. .. code-block:: none $ cat /etc/mudfish-server/commercial_node_currency USD * ``/etc/mudfish-server/commercial_node_price_domestic`` 이 중계 서버를 통해 국내로 전송되는 트래픽에 대해 Giga 당 traffic 비용을 나타냅니다. 소수점 밑으로의 가격이 허용되기 때문에 0.0123 와 같이 적으셔도 됩니다. 유료 서버로 등록된 경우에 대해서만 유효합니다. .. code-block:: none $ cat /etc/mudfish-server/commercial_node_price_domestic 0.0012 * ``/etc/mudfish-server/commercial_node_price_international`` 이 중계 서버를 통해 국외로 전송되는 트래픽에 대해 Giga 당 traffic 비용을 나타냅니다. 소수점 밑으로의 가격이 허용되기 때문에 0.0123 와 같이 적으셔도 됩니다. 유료 서버로 등록된 경우에 대해서만 유효합니다. .. code-block:: none $ cat /etc/mudfish-server/commercial_node_price_international 0.0015 * ``/etc/mudfish-server/country`` *자동 생성되는 파일입니다.* 현재 중계 서버의 Public IP 에 대한 국가 코드가 저장됩니다. 이 국가 코드는 GeoIP 정보를 기반으로 산출됩니다. * ``/etc/mudfish-server/name`` 현재 이 중계 서버가 미꾸라지 중앙 서버에 등록될 때 사용될 서버 이름을 나타냅니다. 오직 영문자 (대소문자) 및 숫자 그리고 몇 개의 기호만 허용되며 나머지 문자들은 서버 측에서 _ 문자로 강제 치환되게 됩니다. .. note:: GeoIP database 기반의 위치 코드 (영문자 2 자) 항상 이름 앞단에 붙게 되는 점 이해 바랍니다. 미꾸라지 사용자가 해당 중계 서버의 위치를 구분하지 못하는 문제를 개선하기 위한 조치입니다. .. code-block:: none $ cat /etc/mudfish-server/name US West (Weongyo's server) 만약 이름을 변경하길 원하신다면 미꾸라지 Server 를 이름 변경 후 재시작 하시면 됩니다. * ``/etc/mudfish-server/owner_name`` .. note:: 미꾸라지 Server v1.0.2 이상부터 이용 가능합니다. 현재 이 중계 서버를 운영하는 운영자의 이름 혹은 단체의 이름을 적는 파일입니다. 만약 설정하지 않는 다면 Unknown 으로 사용자에게 보여집니다. * ``/etc/mudfish-server/owner_email`` .. note:: 미꾸라지 Server v1.0.2 이상부터 이용 가능합니다. 현재 이 중계 서버를 운영하는 운영자의 EMAIL 연락처 혹은 단체의 연락처를 적는 파일입니다. 사용자 혹은 미꾸라지 운영자가 개별 중계 서버 운영자에게 연락하기 위한 수단으로 사용될 수 있습니다. * ``/etc/mudfish-server/public_ip`` **자동 생성 파일입니다.** 미꾸라지 중앙 서버에서 보았을 때 현재 이 중계 서버의 Public IP 가 저장됩니다. * ``/etc/mudfish-server/users_allow`` 만약 중계 서버를 허용한 사용자만 사용할 수 있도록 정책을 수립하기를 원하신다면 이 파일에 허용할 사용자의 미꾸라지 ID 를 적어주시면 됩니다. 그 외의 모든 사용자는 접근할 수 없게 됩니다. 한 줄에 한 ID 를 적으셔야 합니다. users_allow 와 users_deny 파일 모두에 미꾸라지 ID 가 동시에 올 수 없습니다. .. code-block:: none $ cat /etc/mudfish-server/users_allow weongyo userid1 mijung * ``/etc/mudfish-server/users_deny`` 만약 중계 서버를 이 파일에 나열된 사용자를 제외한 모든 사용자에게 허용하고자 한다면 이 파일에 거부할 사용자의 미꾸라지 ID 를 적으시면 됩니다. users_allow 와 users_deny 파일 모두에 ID 가 동시에 올 수 없습니다. * ``/etc/mudfish-server/type`` 기본으로 S 문자가 들어가 있으며, 수정하실 일이 없을 겁니다. S 는 Static 의 약자로 고정 중계 서버를 표시할 때 사용됩니다. M 이 사용될 때가 있는데, 중앙 서버를 나타날 때 사용됩니다. * ``/etc/mudfish-server/v2_tapip`` *자동 생성되는 파일입니다.* 현재 이 중계 서버가 부여받은 Private IP 주소 대역에 관한 정보를 가지고 있습니다. * ``/etc/mudfish-server/varnishd_listen_address`` *자동 생성되는 파일입니다.* 내부적으로 SOCKS v4 와 v5, HTTP proxy 지원을 위해 Cache-Terminator 프로그램이 사용되는데, 이에 대한 listening address 를 세팅하는 파일입니다. * ``/etc/mudfish-server/version`` 현재 사용할 미꾸라지 Server 의 버전을 가리킵니다. 미꾸라지 Server 패키지의 경우 ``/opt/mudfish-server//`` 디렉토리에 version 별로 별도 디렉토리에 설치되게 되는데, 이 파일의 내용을 보고 어떤 버전을 사용할지 결정하게 됩니다. 실행하기 -------- ``/etc/mudfish-server/`` 디렉토리 아래의 설정 파일들을 모두 제대로 설정을 하였다면 아래와 같은 방법으로 미꾸라지 데몬 프로그램들을 실행할 수 있습니다. .. code-block:: none # /etc/init.d/mudfish-server start 실행 과정에서 문제가 발생할 경우 보통 ``/var/log/messages`` 파일을 확인하시면 오류 메세지를 확인하실 수 있습니다. 이제 실행이 제대로 되었다면, 현재 서버가 제대로 미꾸라지 중앙 서버와 연동하여 등록되었는지 확인하셔야 합니다. 가장 손쉬운 방법은 아래의 링크에 들어가서 등록한 이름의 중계 서버가 존재하는지 체크하는 방법입니다. * 미꾸라지: 중계 서버 실시간 상태 https://mudfish.net/server/status 중지하기 -------- 서버 데몬 전체를 중지하기 위해서는 아래의 명령을 실행하시면 됩니다. .. code-block:: none # /etc/init.d/mudfish-server stop 반드시 종료 후 ps 명령어를 이용하여 프로세스 이름이 mud 로 시작되는 것이 남아 있는지 확인하시고, varnishd 프로세스 또한 실행되고 있는지 확인하시기 바랍니다.