Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Инструменты (https://forum.zone-game.info/forumdisplay.php?f=39)
-   -   [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера (https://forum.zone-game.info/showthread.php?t=39512)

Alligat0r 05.03.2016 02:30

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от Aleksey (Сообщение 407981)
Вот честное слово, я с 10 года вроде админю, но телнет никогда не включал даже. Вообще было бы здорово послушать гуру на тему телнета. Его используют? Помню байка ходила мол лишняя уязвимость, но в те года все было одной большой уязвимостью.

Aleksey, его можно в принципе безопасно использовать. К примеру на фаерволе можно обозначить доступ к порту на котором телнет крутится только для своих хостов.

Я им как то пользовался когда нужно было выкинуть из игры юзеров и забанить их, но при этом у меня не было игрового клиента. В этом случае вещь очень полезная. Итемы насколько помню в онлайн режиме когда игрок в игре можно выдавать.


По сути, имея с собой мобильник с Java можно такой админкой получить отдачу команд ядру сборки, в точности будто я в игре нахожусь и отдаю эти команды в игровом интерфейсе.
Можно сервак ребутнуть, добавить/отобрать итем, забанить+кикнуть, бан чата дать, ну и так далее. Бывают моменты что срочно что то надо сделать, а под боком кроме телефона нет ничего.

К примере если через Вашу админку забанить акк то игрок все равно в игре остается, но не сможет зайти если оффнется. А при наличии телнета его можно кикнуть+бан одновременно. Очень здорово помогает если нет клиента игрового.

Aleksey 05.03.2016 02:43

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от Alligat0r (Сообщение 407982)
Aleksey, его можно в принципе безопасно использовать. К примеру на фаерволе можно обозначить доступ к порту на котором телнет крутится только для своих хостов.

Я им как то пользовался когда нужно было выкинуть из игры юзеров и забанить их, но при этом у меня не было игрового клиента. В этом случае вещь очень полезная. Итемы насколько помню в онлайн режиме когда игрок в игре можно выдавать.

К примере если через Вашу админку забанить акк то игрок все равно в игре остается, но не сможет зайти если оффнется. А при наличии телнета его можно кикнуть+бан одновременно. Очень здорово помогает если нет клиента игрового.

Не, в плане защиты порта - тут даже ssh туннель подойдет и закрытый телнет извне. Где раздобыть команды для телнета?

Alligat0r 05.03.2016 02:48

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от Aleksey (Сообщение 407984)
Не, в плане защиты порта - тут даже ssh туннель подойдет и закрытый телнет извне. Где раздобыть команды для телнета?

Aleksey, могу попробовать вспомнить это, но насколько я помню это отдача команд ядру точно такая же будто Вы в игре находитесь и командуете с игрового интерфейса. То есть можете рестарт делать, банить с выкидыванием из игры, добавлять итемы, даже если чар онлайн. Ну вообщем все как будто в игре Вы. Помоему он точно такие же команды просто ядру передает.

Вот из стрессвеба файл который рулит телнетом, я пользовался этой опцией в SW и она работала, судя по коду команды такие же как Вы из игры отдаете будучи там админом.

Код:

<?php

if ( !defined("STRESSWEB") )
    die( "Access denied..." );
if ( !$controller->isAdmin() ) {
    $controller->redirect( "index.php" );
}
$_action = isset( $_REQUEST["action"] ) ? $controller->SafeData( $_REQUEST["action"], 3 ):"";
function Telnet( $sendmsg )
{
    global $l2cfg, $sid;
    if ( $telnet = @fsockopen($l2cfg["gs"][$sid]["host"], $l2cfg["gs"][$sid]["telnet"]["port"], $errno, $errstr, $l2cfg["gs"][$sid]["telnet"]["timeout"]) ) {
        fputs( $telnet, $l2cfg["gs"][$sid]["telnet"]["pass"] );
        fputs( $telnet, "\r\n" );
        if ( !empty($l2cfg["gs"][$sid]["telnet"]["gmname"]) ) {
            fputs( $telnet, $l2cfg["gs"][$sid]["telnet"]["gmname"] );
            fputs( $telnet, "\r\n" );
        }
        fputs( $telnet, $sendmsg );
        fputs( $telnet, "\r\nexit\r\n" );
        if ( $telnet ) {
            fclose( $telnet );
            $echo = "<fieldset><legend>OK</legend>\n";
            $echo .= "<div class='warning'> &nbsp; Комманда успешно отправлена.</div>\n";
            $echo .= "</fieldset><br>\n";
        } else {
            $echo = "<fieldset><legend>Error</legend>\n";
            $echo .= "<div class='warning'> &nbsp; Ошибка при отправке команды (возможно неверный пароль).</div>\n";
            $echo .= "</fieldset><br>\n";
        }
    } else {
        $echo = "<fieldset><legend>Error</legend>\n";
        $echo .= "<div class='warning'> Невозможно подключиться к серверу через Telnet {$l2cfg["gs"][$sid]["host"]}:{$l2cfg["gs"][$sid]["telnet"]["port"]}</div>";
        $echo .= "</fieldset><br>\n";
    }
    return $echo;
}
$telnet_msg = "";
if ( empty($l2cfg["gs"][$sid]["host"]) ) {

    $telnet_msg = "<fieldset><legend>Ошибка</legend>\n";
    $telnet_msg .= "<div class='warning'> &nbsp; Не задан адрес telnet сервера</div>";
    $telnet_msg .= "</fieldset>\n";
} else {
    if ( isset($_action) ) {
        if ( $_action == "announce" ) {
            $telnet_msg = Telnet( "announce ".$_REQUEST["msg"] );
        } elseif ( $_action == "msg" ) {
            $telnet_msg = Telnet( "msg ".$_REQUEST["nick"]." ".iconv("UTF8", "UTF-8", $_REQUEST["msg"]) );
        } elseif ( $_action == "kick" ) {
            $telnet_msg = Telnet( "kick ".$_REQUEST["nick"] );
        } elseif ( $_action == "restart" ) {
            $telnet_msg = Telnet( "restart ".$_REQUEST["time"] );
        } elseif ( $_action == "shutdown" ) {
            $telnet_msg = Telnet( "shutdown ".$_REQUEST["time"] );
        } elseif ( !empty($_action) ) {
            $telnet_msg .= "<fieldset><legend>Error</legend>\n";
            $telnet_msg .= "<div class='warning'> &nbsp; Неизвестная комманда</div>\n";
            $telnet_msg .= "</fieldset><br>\n";
        }
    }
}
$select_server = $controller->select( "sid", $gsListTitles        , $sid, 'style="width: 100px;" onchange="javascript: document.sid.submit(); return false;"' );
$telnet_content = <<< HTML
<br /><table width="100%" border='0' cellpadding='0' cellspacing='0' style="border: 1px solid #AAA;" class='shadow'>
<tr>
    <td bgcolor="#EEEFEF" height="29" style="padding-right:10px; color: #888;" align="right" valign="middle">
                <form action="" method="GET" id="sid" name="sid">
                <input type="hidden" name="mod" value="telnet">
                Сервер: {$select_server}
                </form>
        </td>
</tr>
</table><br />
<table width="100%" cellpadding='0' cellspacing='0' class='shadow'>
<tr>
        <td bgcolor="#DDEFEF" height="29" style="padding-left:10px; color: #888; border: 1px solid #AAA;">
                <a href="javascript:ChangeOption('divAnnounce');"> &raquo;Announce</a> &nbsp;
                <a href="javascript:ChangeOption('divMsg');"> &raquo;ПМ</a> &nbsp;
                <a href="javascript:ChangeOption('divKick');"> &raquo;Kick</a> &nbsp;
                <a href="javascript:ChangeOption('divRestart');"> &raquo;Рестарт сервера</a> &nbsp;
                <a href="javascript:ChangeOption('divShutdown');"> &raquo;Выключение сервера</a> &nbsp;
        </td>
</tr>       
<tr>
    <td style="padding:5px;" bgcolor="#FFFFFF">
                {$telnet_msg}
                <div id="dle_tabView1">
                        <div id="divAnnounce" style="" >
                        <form action='{$_url}=telnet&action=announce&sid={$sid}' method='POST'>
                                <b>Сообщение</b> <input type='text' name='msg'> <br />
                                <input type='submit' value='Отправить' class='swbutton2 aleft'>                                                       
                        </form>
                        </div>
                                       
                        <div id="divMsg" style="display:none" >
                        <form action='{$_url}=telnet&action=msg&sid={$sid}' method='POST'>
                                <b>Ник игрока</b> <input type='text' name='nick'> <br /><br />
                                <b>Сообщение</b> <input type='text' name='msg'> <br />
                                <input type='submit' value='Отправить' class='swbutton2 aleft'>
                        </form>
                        </div>
                                       
                        <div id="divKick" style="display:none" >
                        <form action='{$_url}=telnet&action=kick&sid={$sid}' method='POST'>
                                <b>Ник игрока</b> <input type='text' name='nick'> <br />
                                <input type='submit' value='Отправить' class='swbutton2 aleft'>
                        </form>
                        </div>
                               
                        <div id="divRestart" style="display:none" >
                                <form action='{$_url}=telnet&action=restart&sid={$sid}' method='POST'>
                                <b>Время до рестарта</b> (сек) <input type='text' name='time' size='16'> <br />
                                <input type='submit' value='Отправить' class='swbutton2 aleft'>
                        </form>
                        </div>
                       
                        <div id="divShutdown" style="display:none" >
                        <form action='{$_url}=telnet&action=shutdown&sid={$sid}' method='POST'>
                                <b>Время до выключения</b> (сек) <input type='text' name='time' size='16'> <br />
                                <input type='submit' value='Отправить' class='swbutton2 aleft'>
                        </form>
                        </div>
                </div>
        </td>
</tr>
</table>
<script type="text/javascript">
function ChangeOption(selectedOption)
{
        document.getElementById('divAnnounce').style.display = "none";
        document.getElementById('divMsg').style.display = "none";
        document.getElementById('divKick').style.display = "none";
        document.getElementById('divRestart').style.display = "none";
        document.getElementById('divShutdown').style.display = "none";
        if(selectedOption == 'divAnnounce') {document.getElementById('divAnnounce').style.display = "";}
        if(selectedOption == 'divMsg') {document.getElementById('divMsg').style.display = "";}
        if(selectedOption == 'divKick') {document.getElementById('divKick').style.display = "";}
        if(selectedOption == 'divRestart') {document.getElementById('divRestart').style.display = "";}
        if(selectedOption == 'divShutdown') {document.getElementById('divShutdown').style.display = "";}       
}
</script>
HTML;
$tpl->SetResult( "content", $telnet_content );
?>


Aleksey 05.03.2016 02:51

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от Alligat0r (Сообщение 407985)
Aleksey, могу попробовать вспомнить это, но насколько я помню это отдача команд ядру точно такая же будто Вы в игре находитесь и командуете с игрового интерфейса. То есть можете рестарт делать, банить с выкидыванием из игры, добавлять итемы, даже если чар онлайн. Ну вообщем все как будто в игре Вы. Помоему он точно такие же команды просто ядру передает.

Спасибо за идею )
Думаю, было бы неплохо дополнить софтину
Кик чара например очень не помешает

Alligat0r 05.03.2016 04:17

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Aleksey, могу Вам посоветовать подумать над клиент-серверной реализацией.

Одна из причин - не каждый админ жаждет держать порт 3306 открытый из вне на сервере и ограничивается обычно доступом с домашнего хоста+хоста сервера где стоит веб-обвязка.
Телнет порт открытым держать если честно как то то же немного стремновато. Это же касается и SSH порта.

А вот если отдельно будет серверная версия этой админки висеть на порту с надежной авторизацией то возможности реализации функционала тут очень велики. Серверная софтина могла ты и по телнету со сборкой общаться по локалхосту и делать запросы в MySQL. Можно так же реализовать при бане/кике отдачу операционной системе к примеру команды iptables -I INPUT -p tcp -s xx.xx.xx.xx -j DROP, где xx.xx.xx.xx - IP облокируемого, можно и так xx.xx.xx.xx/24 по целой подсети, если игрок может быстро сменить IP в случае если провайдер по DHCP выдает. Это очень помогает когда кто то в чате сидит и рекламирует сторонние проекты, Вы его баните а он тут же новый акк регит, а способов обойти бан по железу полно. С заходом в исходники сборки можно даже реализовать отдачу сообщений чата в клиентскую часть админки. То есть у Вас очень большие возможности появятся в плане постоянного наращивания функционала данного продукта. Можно конечно параллельно держать Lite версию, без серверной части.

Aleksey 05.03.2016 12:45

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от Alligat0r (Сообщение 407989)
Aleksey, могу Вам посоветовать подумать над клиент-серверной реализацией.

Одна из причин - не каждый админ жаждет держать порт 3306 открытый из вне на сервере и ограничивается обычно доступом с домашнего хоста+хоста сервера где стоит веб-обвязка.
Телнет порт открытым держать если честно как то то же немного стремновато. Это же касается и SSH порта.

А вот если отдельно будет серверная версия этой админки висеть на порту с надежной авторизацией то возможности реализации функционала тут очень велики. Серверная софтина могла ты и по телнету со сборкой общаться по локалхосту и делать запросы в MySQL. Можно так же реализовать при бане/кике отдачу операционной системе к примеру команды iptables -I INPUT -p tcp -s xx.xx.xx.xx -j DROP, где xx.xx.xx.xx - IP облокируемого, можно и так xx.xx.xx.xx/24 по целой подсети, если игрок может быстро сменить IP в случае если провайдер по DHCP выдает. Это очень помогает когда кто то в чате сидит и рекламирует сторонние проекты, Вы его баните а он тут же новый акк регит, а способов обойти бан по железу полно. С заходом в исходники сборки можно даже реализовать отдачу сообщений чата в клиентскую часть админки. То есть у Вас очень большие возможности появятся в плане постоянного наращивания функционала данного продукта. Можно конечно параллельно держать Lite версию, без серверной части.

В своих целях использую порткнокинг к 22 порту.
Кстати реализовано в программе, но в настойки выносить не стал. Я там раньше описсывал, куда что добавить.
А вообще к 22 порту доступ должен быть всегда у админов имхо. Так что пока над серверно-клиентской версией не задумываюсь даже

Добавлено через 6 минут
Нашел чуть про телнет
Почему его не рекомендуют использовать? Допустим при условии, что порт будет закрыт извне?
http://www.l2jserver.com/forum/viewtopic.php?t=18292

Alligat0r 05.03.2016 14:04

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от Aleksey (Сообщение 407995)
Нашел чуть про телнет
Почему его не рекомендуют использовать? Допустим при условии, что порт будет закрыт извне?
http://www.l2jserver.com/forum/viewtopic.php?t=18292

Если честно больше баек про него ходит чем правды. Ломануть по сути нельзя, можно только пароль подобрать брутефорсом, но опять же если он сложный то нереально. Если даже и получат доступ то рулить смогут только игровой сборкой но не сервером. Есть еще отличие в плане безопасности, телнет использует открытый текстовый протокол и если снифером ловить где то на узлах маршрутизации то можно легко снять пароль, но вряд ли операторы связи будут страдать этой фигней. SSH напротив, использеут шифрование при работе.

n3k0nation 06.03.2016 01:46

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Alligat0r,
Aleksey, telnet не везде есть и обработка команд никак не связана с админ командами (там свои хандлеры). Если уж и использовать телнет, то только, как бинд на локалхост, а до него делать проброс через SSH-тунель.
А вообще, рекомендую отказаться от этого устаревшего... хм... механизма и посмотреть куда-нибудь в сторону написания референс бука по внешнему АПИ сервера <- любой_софт/обвязка/етц.

Aleksey 06.03.2016 02:31

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от n3k0nation (Сообщение 408059)
Alligat0r,
Aleksey, telnet не везде есть и обработка команд никак не связана с админ командами (там свои хандлеры). Если уж и использовать телнет, то только, как бинд на локалхост, а до него делать проброс через SSH-тунель.
А вообще, рекомендую отказаться от этого устаревшего... хм... механизма и посмотреть куда-нибудь в сторону написания референс бука по внешнему АПИ сервера <- любой_софт/обвязка/етц.

Покормите полезными ссылочками или хотя бы кратким разъяснением - куда копать?

n3k0nation 08.03.2016 02:57

Re: [Шара, исходники, BOOMSTARTER] L2jPane - Удобное управление базой сервера
 
Цитата:

Сообщение от Aleksey (Сообщение 408061)
Покормите полезными ссылочками или хотя бы кратким разъяснением - куда копать?

RPC (remote procedure calling). От рав протокола на сокетах, до JSON RPC (что потребует интеграцию веб-сервера в эмуль). Так же, в джаве есть Corba & RMI, но это по большей части ужОс и пережиток прошлого.
Если опишите протокол, экшены на каждую команду и остальные вещи, которые входят в референс бук, то вполне можно будет реализовать для большинства эмуляторов расширение, которое можно будет легко подключить:)


Текущее время: 14:48. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot