Страница 1 из 1

Игровой сервер для sudden-strike

Добавлено: 2017-09-12 10:37:16
zarathustra
Небольшая вводная:
Команда существует уже около 20 лет и занимается некоммерческой разработкой мода на базе SSRW. Игрушка старая и в мульти использовали Hamachi. Однако с этого года цена на подсеть у них стала совсем дурная, а мы все (домены, хостинг, рекламу и пр.) оплачиваем из своего кармана. Учитывая, что команда несколько лет как уже имеет свой сервер, решение напрашивалось однозначное.

На данны момент имеется канал 50 Mb, за роутером:
основной сервер: FreeBSD 10.3, DNS, DHCP, ftp, ntp, Samba, VPN.
резервный: FreeBSD 10.3, ftp, VPN. (т.е. имеется возможность безболезненно тренироваться "на кошках")
Несколько человек подключается по vpn и благополучно работает с файлами не первый год (сразу для ясности: мои отношение с unx на уровне - возникла задача => читаю/разбираюсь => делаю => до следующей задачи). Казалось - сложностей быть не должно
Ядро собрано с опциями:

Код: Выделить всё

# IPFW
options         IPFIREWALL
options         IPFIREWALL_NAT
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=5
options         IPDIVERT
options         DUMMYNET
options         LIBALIAS
options         ROUTETABLES=2
options         HZ="1000"
options         SC_DISABLE_REBOOT
# NETGRAPH
options         NETGRAPH
options         NETGRAPH_ETHER
options         NETGRAPH_SOCKET
options         NETGRAPH_TEE
options         NETGRAPH_MPPC_ENCRYPTION
options         NETGRAPH_MPPC_COMPRESSION
options         NETGRAPH_BPF
options         NETGRAPH_IFACE
options         NETGRAPH_KSOCKET
options         NETGRAPH_PPP
options         NETGRAPH_PPTPGRE
options         NETGRAPH_TCPMSS
options         NETGRAPH_VJC
options         NETGRAPH_ONE2MANY
options         NETGRAPH_RFC1490
options         NETGRAPH_TTY
options         NETGRAPH_UI
# IpSec
options         IPSEC
options         IPSEC_FILTERTUNNEL
options         IPSEC_NAT_T
options         IPSEC_DEBUG
device          crypto
device          enc
rc.conf

Код: Выделить всё

hostname="srv3.xxxx.local"
ifconfig_em0="inet 192.168.1.251 netmask 255.255.255.0 media 1000baseT mediaopt full-duplex"
defaultrouter="192.168.1.252"
local_unbound_enable="YES"
sshd_enable="YES"
ntpd_enable="YES"
ntpd_sync_on_start="YES"
powerd_enable="YES"
dumpdev="AUTO"
fsck_y_enable="YES"
background_fsck="NO"
font8x16="cp866b-8x16"
font8x14="cp866-8x14"
font8x8="cp866-8x8"
keymap="ru.koi8-r"
scrnmap="koi8-r2cp866"
dhcpd_enable="YES"
dhcpd_ifaces="em0"
dhcpd_conf="/usr/local/etc/dhcpd.conf"
dhcpd_withumask="022"
ftpd_enable="YES"
ftpd_flags="-4 -D -h -l -l -r"
samba_server_enable="YES"
firewall_enable="YES"
firewall_script="/etc/ipfw.rules"
gateway_enable="YES"
mpd_enable="YES"
mpd_flags="-b"
log_in_vain="YES"
syslogd_enable="YES"
inetd_enable="NO"
smartd_enable="YES"
Для разделения всех членов команды перевел на L2TP. Правда, нахрапом настроить IpSec не получилось, но это я потом прикручу.
mpd.conf

Код: Выделить всё

startup:
        log -all +auth
        set user xxxx xxxxxxxx admin
        set user xxxx xxxxxxxx admin
        set user xxxx xxxxxxxx admin
        set user xxxx xxxxxxxx admin
        set web self 0.0.0.0 5006
        set web open
        
default:
        load pptp_server
        load l2tp_server
        
pptp_server:
        set ippool add rwg-tow 10.2.2.11 10.2.2.250
        create bundle template B
        set iface enable proxy-arp
        set iface idle 1800
        set iface enable tcpmssfix
        set iface enable nat
        set iface enable netflow-in
        set iface enable netflow-out
        set ipcp yes vjcomp
        set ipcp ranges 10.2.2.1/24 ippool rwg-tow
        set ipcp dns 10.2.2.1
        set ipcp nbns 10.2.2.1
        set bundle enable compression
        set ccp yes pred1 deflate mppc
        set mppc yes compress e40 e56 e128 stateless
        create link template L pptp
        set link enable multilink
        set link yes acfcomp protocomp
        set link action bundle B
        set link no pap chap eap
        set link enable chap chap-msv1 chap-msv2
        set link mtu 1460
        set link keep-alive 60 180
        set pptp self 192.168.1.251
        set link enable incoming

l2tp_server:
        set ippool add pool2 192.168.1.150 192.168.1.199
        create bundle template C
        set iface enable proxy-arp
        set iface idle 1800
        set iface enable tcpmssfix
        set ipcp yes vjcomp
        set ipcp ranges 192.168.1.251/32 ippool pool2
        set ipcp dns XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX
        set ipcp nbns 192.168.1.251
        set ccp yes pred1 deflate mppc
        set mppc yes e40 e56 e128 stateless
        create link template N l2tp
        set link action bundle C
        set link enable multilink
        set link yes acfcomp protocomp
        set link no pap chap
        set link enable chap chap-msv1 chap-msv2
        set link mtu 1460
        set link keep-alive 60 180
        set l2tp self 192.168.1.251
        set l2tp hostname srv3.xxxx.local
        set link enable incoming
mpd.secret

Код: Выделить всё

User1        xxxxxxxxxx        192.168.1.199
xxxx2        xxxxxxxxxx        192.168.1.198
xxxx3        xxxxxxxxxx        192.168.1.197
xxxx4        xxxxxxxxxx        192.168.1.196
xxxx5        xxxxxxxxxx        192.168.1.194
xxxx6        xxxxxxxxxx        192.168.1.193
xxxx7        xxxxxxxxxx        192.168.1.192
xxxx8        xxxxxxxxxx        192.168.1.191
xxxx9        xxxxxxxxxx        192.168.1.190
xxxx0        xxxxxxxxxx        192.168.1.188
xxxxX        xxxxxxxxxx        192.168.1.187
xxxx1        xxxxxxxxxx        10.2.2.2
xxxx2        xxxxxxxxxx        10.2.2.3
xxxx3        xxxxxxxxxx        10.2.2.4
Gamer       Gamer              *
Поскольку (как выяснилось) у многих возникают проблемы с настройкой, было решено использовать CMAK: помимо возможности добавлять маршруты ещё и "подтягивает" список серверов с внешнего ресурса (что называется, на вырост).

На этом все хорошее и заканчивается:
Игра, как правило, не видит созданный одним из игроков сервер или видит, но не подключается.
Пляски с маршрутами и/или метриками иногда! решают проблему, но это не выход.
Sudden strike использует порты:

Код: Выделить всё

TCP 2300 (2300-2400)
TCP 3389
TCP 6073
TCP 28800 (28800-28900)
TCP 47624
UDP 1900
UDP 2350
UDP 47624
ipfw.rules

Код: Выделить всё

ipfw -q -f flush
cmd="ipfw -q add"
ks="keep-state"
lif="em0"
lip="192.168.1.251"
lan="192.168.1.0/24"
gate="192.168.1.252"
vpn="10.2.2.0/24"
iip="XXX.XXX.XXX.XXX"
dns="XXX.XXX.XXX.XXX,XXX.XXX.XXX.XXX"
$cmd 00005 allow ip from any to any via lo0
$cmd 00010 check-state
# $cmd 00100 deny ip from any to 127.0.0.0/8
# $cmd 00110 deny ip from 127.0.0.0/8 to any
# $cmd 00120 reject log tcp from any to any tcpflags fin, syn, rst, psh, ack, urg via $lif
# $cmd 00130 reject log tcp from any to any tcpflags !fin, !syn, !rst, !psh, !ack, !urg via $lif
# $cmd 00140 reject log tcp from any to any not established tcpflags fin via $lif
# $cmd 00150 deny log ip from any to any not verrevpath in via $lif
# $cmd 00160 deny log all from any to any frag in via $lif
# ban="table(1)"
# ipfw table 1 flush
# ipfw table 1 add 93.153.142.102
# $cmd 00170 deny log all from any to ${ban}
# $cmd 00190 deny log all from ${ban} to any
$cmd 00200 allow tcp from any to any established
$cmd 01000 allow tcp from any to me 11022 via $lif setup $ks
$cmd 01010 allow tcp from any to me 20,21 setup $ks
$cmd 01020 allow udp from any to $dns 53 out via $lif $ks
$cmd 01030 allow all from $lan to $lip 43,53,81,137-139,445 via $lif setup $ks
$cmd 01035 allow all from $lan to $lip 81,137-139,445 via ng* setup $ks
$cmd 01036 allow udp from $lan to me 53,137-139,445 via ng* $ks
$cmd 01040 allow udp from me to any 37,123 via $lif $ks
$cmd 01045 allow udp from $lan to me 37,53,123 via $lif $ks
$cmd 01050 allow tcp from $lan to $lip 43,53 via $lif $ks
$cmd 01060 allow udp from $lan to $lan 1900 via $lif $ks
$cmd 01070 allow icmp from $lan to any via $lif
$cmd 01100 allow udp from $gate to any 520,1025 via $lif $ks
$cmd 02000 allow tcp from any to me 1701,1723,5006 setup $ks
$cmd 02010 allow gre from any to me via $lif $ks
$cmd 02020 allow gre from any to me via ng* $ks
$cmd 02030 allow gre from $vpn to $vpn via ng* $ks
$cmd 02100 allow udp from any to me 1701 $ks
$cmd 65000 allow log all from any to any
Пробовал и совсем все открывать (благо, роутер защищает).
Не знаю, что еще может быть завязано.
Собственно, прошу ткнуть носом: где у меня руки не оттуда растут? :oops:

Игровой сервер для sudden-strike

Добавлено: 2017-09-12 11:24:33
Neus
Я правильно распарсил ваш конфиг - у вас клиент впн получает адрес 192.168.1.х/32?
Тогда в этом и проблема - чтобы контра увидела сервер не зная адреса, они (игроки в вашем случае) должны быть в одной подсети.

Игровой сервер для sudden-strike

Добавлено: 2017-09-12 13:13:58
zarathustra
Не совсем так:
адреса 192.168.1.х/32 выдаются клиентам команды (L2TP) для работы с сервером и тут проблем нет - все работает как надо.
Игрокам (PPTP) выдаются адреса 10.2.2.x/32 и им наоборот (по хорошему) нужно закрыть доступ к серверу - там конечно и так особо ничего не наломаешь, но мало ли.
+ не контра, а Sudden strike (у нас известна так же как "Противостояние") - там сервер создается одним из игроков и только на эту (одну) игру - т.е. игровой сервер в привычном понимании там вообще не нужен, им может быть любой хост. Сервер же нужен только для объединения игроков в рамках одной сети. А не видят, очевидно, из-за проблем с broadcast - обнаружение сервера идет именно так.
В обычной локалке с этим нет проблем - там и маска обычно 255.255.255.0, а vpn-сервер выдает клиентам 255.255.255.255 - что логично, т.к. точка-точка.
Словом, задача открыть для клиентов все (включая broadcast) внутри "игровой" подсети - 10.2.2.x/32

Игровой сервер для sudden-strike

Добавлено: 2017-09-13 1:29:14
Neus
Словом, задача открыть для клиентов все (включая broadcast) внутри "игровой" подсети - 10.2.2.x/32
Так это как бы не подсеть, у неё нету ни адреса сети ни адреса broadcast. Куда запрос слать то?
Нельзя открыть то, чего нет :)

Игровой сервер для sudden-strike

Добавлено: 2017-09-13 10:57:49
zarathustra
Neus писал(а): Так это как бы не подсеть, у неё нету ни адреса сети ни адреса broadcast. Куда запрос слать то?
Да, но адрес сервера (10.2.2.1) прописан в mpd.conf ?
Neus писал(а): Нельзя открыть то, чего нет
Хорошо, а если на сервере создать vlan? Или еще проще: у меня там незадействованная сетевая есть + (наверное) можно и через dhcp тот же шлюз или маршрут раздавать? Это может как-то помочь в решении проблемы?
Просто не настолько хорошо разбираюсь в вопросе, а тут еще и связка такая unix/vpn/сеть ?
РС Если я правильно понимаю, мне надо обеспечить доступность клиентов PPTP между собой и прохождение broadcast для них в сети 10.2.2.x/24 ?
Наверное, еще могут быть какие-то проблемы с приоритетами в маршрутах на машинах клиентов.

Игровой сервер для sudden-strike

Добавлено: 2017-09-13 17:00:51
Neus
Ну да, у "геймеров" должна быть одна подсеть и файрвол не должен резать броадкаст.

Отправлено спустя 7 минут 3 секунды:
Вот примерно так http://itadept.ru/freebsd-mpd5-server/#firewall

Игровой сервер для sudden-strike

Добавлено: 2018-01-31 16:50:29
Гость
А еще остались те, кто этим увлекается?

Игровой сервер для sudden-strike

Добавлено: 2018-01-31 19:27:12
zarathustra
Удивительно, но "ДА" - и не только у нас в стране, но и во всем мире. Поэтому в моде у нас с вер.0.7 в дополнение к английскому введена полная поддержка еще и немецкого и французского языков.
Конечно, игра уже давно не собирает тысячи поклонников, как это было на портале sudden-strike.ru, но и ничего близко похожего по реалистичности/масштабности так и не появилось.
Кстати, проблема так и не решена :(
Теоретически все ясно, вот с практической реализацией не получается.

Игровой сервер для sudden-strike

Добавлено: 2018-05-06 12:01:21
zarathustra
Не выходит каменный цветок
Возможно, я буду говорить сейчас очевидные для кого-то вещи.
В моём случае не просто нет нормальной сети, нет и "не нормальной": мы имеем несколько виртуальных сетей, каждая из которых состоит из двух хостов, один из которых у всех общий - это vpn-сервер. Следовательно, без ната не обойтись. После долгих экспериментов я остановился на следующей схеме:
Выделил под vpn отдельный сетевой адаптер, и на него проброшены порты с внешнего шлюза от ForteGate 200
ipfw.rules:

Код: Выделить всё

ipfw -q -f flush
cmd="ipfw -q add"
ks="keep-state"
lan="192.168.1.0/24"
gw="192.168.1.252"
vpn="192.168.204.0/24"
dns="x.x.x.x"
$cmd 010 allow ip from any to any via lo0
$cmd 020 check-state
$cmd 200 allow tcp from any to any established
$cmd 01000 allow tcp from any to me 11022 via em0 setup $ks
$cmd 01100 allow tcp from any to me 20,21 setup $ks
$cmd 01200 allow udp from any to $dns 53 out via em0 $ks
$cmd 01300 allow all from $lan to me 37,43,53,81,123,137-139,445 via em0 setup $ks
$cmd 01400 allow udp from me to any 37,123 via em0 $ks
$cmd 01700 allow icmp from $lan to any via em0
ipfw nat 1 config if em1 reset same_ports log unreg_only
ipfw table all flush
/usr/local/etc/mpd5/table1.sh
$cmd 2500 nat 1 all from "table(1)" to any out via em1
$cmd 2510 nat 1 all from any to $vpn in via em1
$cmd 03000 allow tcp from any to me 1701,1723,5006 via em1 setup keep-state
$cmd 03100 allow udp from any to me 500,1701,4500 via em1 keep-state
$cmd 04000 allow all from $vpn to $vpn
$cmd 06000 allow all from $lan to $lan
$cmd 65000 allow log all from any to any
mpd.conf:

Код: Выделить всё

startup:
        log -all +authstartup +auth +console +iface
        set user xxx xxx admin
        set web self 0.0.0.0 5006
        set web open
default:
        load pptp_server
        load l2tp_server
pptp_server:
        set ippool add rwg-tow 192.168.204.21 192.168.204.200
        create bundle template B
        set iface enable proxy-arp
        set iface idle 900
        set iface enable tcpmssfix
        set ipcp yes vjcomp
        set iface group Multi-Gamers
        set ipcp ranges 192.168.204.1/24 ippool rwg-tow
        set ipcp dns 192.168.204.1
        set ipcp nbns 192.168.204.1
        set bundle enable compression
        set ccp yes pred1 deflate mppc
        set mppc yes compress e40 e56 e128 stateless
        create link template L pptp
        set link action bundle B
        set link enable multilink
        set link yes acfcomp protocomp
        set link no pap chap eap
        set link enable chap chap-msv1 chap-msv2
        set link mtu 1400
        set link keep-alive 60 180
        set pptp self 192.168.204.1
        set link enable incoming
        set pptp enable always-ack
        set link yes report-mac
        set auth max-logins 1 CI
l2tp_server:
        set ippool add rwg-tow 192.168.204.21 192.168.204.200
        create bundle template C
        set iface enable proxy-arp
        set iface idle 900
        set iface enable tcpmssfix
        set iface group Multi-Gamers
        set ipcp yes vjcomp
        set ipcp ranges 192.168.204.1/24 ippool rwg-tow
        set ipcp dns 192.168.204.1
        set ipcp nbns 192.168.204.1
        set ccp yes pred1 deflate mppc
        set mppc yes e40 e56 e128 stateless
        create link template M l2tp
        set link action bundle C
        set link enable multilink
        set link yes acfcomp protocomp
        set link no pap chap
        set link enable chap chap-msv1 chap-msv2
        set link mtu 1500
        set link keep-alive 60 180
        set l2tp self 192.168.204.1
        set l2tp hostname srv3.monk.local
        set link enable incoming
        set link yes report-mac
        set auth max-logins 1 CI
С такими настройками всё работает, если игрок руками введёт IP хоста, к которому будет подключаться (т.е. поиск не работает, поскольку нет broadcast между игроками).
Нашел вот такой рецепт, но "переварить" его на современные реалии не смог - слишком многое изменилось.
Возникли вопросы
1. Не могу завернуть gre в нат, при том, что через natd всё работает. Так и не нашел нигде однозначного ответа - работает ли gre через kernel nat?
2. Есть ли возможность совместить set auth max-logins 1 CI и мульти-подключения по одному (специальному) логину, скажем Gamer? Вопрос легко решается созданием отдельной секции в mpd.conf и set auth authname login- это единственный вариант?
3. Есть ли возможность "прицепить" к файлу mpd.secret список из файла? Т.е. не ext-auth, а именно расширение файла mpd.secret с помощью отдельного списка?

Игровой сервер для sudden-strike

Добавлено: 2018-05-06 12:14:27
zarathustra
По третьему вопросу, наверное, нужны пояснения.
Дело в том, что сервер (помимо игрового) используется для доступа к внутренней сети и ресурсам самого сервера, т.е. в файле mpd.secret содержатся логин/пасс членов семьи и команды разработчиков. При запуске игрового сервера в "жизнь" скорее всего потребуется предоставить возможность добавлять игроков человеку, который не должен их видеть + далёкому от работы в консоли. Как такое можно реализовать?