■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 }