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