Battle.net 서버 설치 (PvPGN)

■PvPGN(Player versus Player Gaming Network)
  https://pvpgn.pro/

1. 소스코드 및 support 파일 다운로드
  https://github.com/pvpgn/pvpgn-server/archive/master.tar.gz
  https://sourceforge.net/projects/pvpgn.berlios/files/Support%20files/pvpgn-support-1.2.tar.gz/download

2. 소스코드 빌드
  mkdir build
  cd build
  cmake -D CMAKE_INSTALL_PREFIX=/usr/local/pvpgn -D WITH_MYSQL=false -D WITH_LUA=false ../
  make
  make install

3. systemctl 서비스 등록
  서비스 파일 작성
  vi /usr/lib/systemd/system/pvpgn.service
---------------------------------------
[Unit]
Description=Player versus Player Gaming Network(Battle.net) Service
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/pvpgn/sbin/bnetd
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target
---------------------------------------
  데몬 실행
  chmod 644 /usr/lib/systemd/system/pvpgn.service
  chown -R nobody:nogroup /usr/local/pvpgn
  systemctl daemon-reload
  systemctl enable pvpgn.service
  systemctl start pvpgn.service

4. 설정파일 편집
  vi /usr/local/pvpgn/etc/pvpgn/bnetd.conf

  allowed_clients = sexp
  mail_support = false

5. Support 파일 넣기
  /usr/local/pvpgn/var/pvpgn/files 에 다운로드 받은 Support 파일을 넣는다.

6. 환영 메세지 편집
  vi /usr/local/pvpgn/etc/pvpgn/i18n/koKR/bnmotd.txt

7. PC에서 배틀넷 등록
  ①blizzard-battle-net-gateway-editor 다운로드 후 실행
  https://www.engamers.com/blizzard-battle-net-gateway-editor/

  ②Zone을 -9로 설정하여 서버 등록

8. 방화벽 셋팅
  같은 네트워크가 아니면 배틀넷에 접속해도 JOIN이 되지 않는다.
  JOIN을 위해서는 방을 만드는 PC의 공유기 또는 방화벽에 아래와 같은 포트포워딩 정책을 추가해줘야 한다.
  <공유기><스타크래프트를 실행할 PC의 내부IP>
  Port: 6112/tcp,udp

  pvpgn 서버는 아래의 스크립트로 iptables를 사용하여 방화벽을 셋팅해 준다.


IPTABLES_CMD="/usr/sbin/iptables"
WAN_IF="enp1s0"
LAN_IF="enp2s0"
LAN_IP=$(ifconfig ${LAN_IF} | awk '/inet / {print $2}')

######################################################################
# 배틀넷에 접속할 PC들의 IP주소 맨 뒷자리 나열
######################################################################
GAMMING_PC="34 87 88 106 153"

######################################################################
# 배틀넷 PC 방화벽 정책 설정
######################################################################
func_set_battle_net_rules() {
  func_debug_msg ${FUNCNAME[0]}

  # 192.168.1 형태의 Network address를 구한다.
  IFS=. read -r ii1 ii2 ii3 ii4 <<< ${LAN_IP}
  NETWORK_HEAD3="${ii1}.${ii2}.${ii3}"

  #
  # BATTLE.NET OUTGOING NAT RULES
  #
  ${IPTABLES_CMD} -t nat -N BATTLENET_OUT
  ${IPTABLES_CMD} -t nat -I POSTROUTING -p udp -s ${LAN_NETWORK} --sport 6112 --dport 6112 -j BATTLENET_OUT
  ${IPTABLES_CMD} -t nat -I POSTROUTING -p tcp -s ${LAN_NETWORK} --sport 6112 --dport 6112 -j BATTLENET_OUT
  for LOOP_VAL1 in ${GAMMING_PC}
  do
    TMP_PORT1="$((60000 + $LOOP_VAL1))"
    ${IPTABLES_CMD} -t nat -I BATTLENET_OUT -p udp -s ${NETWORK_HEAD3}.${LOOP_VAL1} --sport 6112 --dport 6112 -j SNAT --to ${WAN_IP}:${TMP_PORT1}
    ${IPTABLES_CMD} -t nat -I BATTLENET_OUT -p tcp -s ${NETWORK_HEAD3}.${LOOP_VAL1} --sport 6112 --dport 6112 -j SNAT --to ${WAN_IP}:${TMP_PORT1}
  done

  #
  # BATTLE.NET INCOMING NAT RULES
  #
  ${IPTABLES_CMD} -t nat -N BATTLENET_IN
  for LOOP_VAL1 in ${GAMMING_PC}
  do
    TMP_PORT1="$((60000 + $LOOP_VAL1))"
    ${IPTABLES_CMD} -t nat -I PREROUTING -p udp --dport ${TMP_PORT1} -j BATTLENET_IN
  done

  for LOOP_VAL1 in ${GAMMING_PC}
  do
    TMP_PORT1="$((60000 + $LOOP_VAL1))"
    ${IPTABLES_CMD} -t nat -I PREROUTING -p tcp --dport ${TMP_PORT1} -j BATTLENET_IN
  done

  for LOOP_VAL1 in ${GAMMING_PC}
  do
    TMP_PORT1="$((60000 + $LOOP_VAL1))"
    ${IPTABLES_CMD} -t nat -I BATTLENET_IN -p udp -d ${WAN_IP} --dport ${TMP_PORT1} -j DNAT --to ${NETWORK_HEAD3}.${LOOP_VAL1}:6112
    ${IPTABLES_CMD} -t nat -I BATTLENET_IN -p tcp -d ${WAN_IP} --dport ${TMP_PORT1} -j DNAT --to ${NETWORK_HEAD3}.${LOOP_VAL1}:6112
  done

  ${IPTABLES_CMD} -A FORWARD -p udp --sport 6112 -j ACCEPT
  echo 0 > /proc/sys/net/ipv4/conf/${WAN_IF}/rp_filter
}
위로 스크롤