Quarcel
МаглыQuarcel's Achievements
Первая Кровь (2/9)
0
Репутація
-
Видимо этот свитч начинате бесконечно повторять пакеты которые принимает. (Подобного эффекта можно достичь если если сетевой кабель обоими концами воткнуть в один свитч) Я видел похожий эффект - свитч повторял пакеты 2-6 раз(случайным образом), особенно это хорошо видно на броадкастовых чатах - сообщения двоятся,троятся... мечта флудера вообщем Кстати дешевые свитчи от такой нагрузки легко могут сгореть. Так что при обнаружении таких свитчей их нужно вывозить загород и закапывать на глубине не менее 3 метров -)
-
Не умеет. И мне кажется врядли будет - не для таких он целей. Хотя с NetFlow реализовать имхо не так уж трудно.
-
ловля пакетов через libipq появлиась в последних релизах stg2, сморти здесь: http://local.com.ua/forum/index.php?showtopic=1140
-
я уже кажется говорил: пакетные сокеты(и вообще никакие сокеты) не дают 100% гарантию доставки пакета, соб-но проблема в том что не всё влезает в буфер сокета и то, что не успевает обрабатываться программой, пропадает. попробуйте сделать так: echo "1048576" > /proc/sys/net/core/rmem_max echo "1048576" > /proc/sys/net/core/rmem_default (при указанном значении, те 1мб было значительное улучшение, но попробуйте ставить другие значения) и перезапустите СТГ, таким образом вы этот буфер увеличимте, но и это не дает гарантии, так что пользуйте libipq, хотя и при этом есть минусы - вносится задержка в прохождение пакетов, т.к. пока пакет не будет обработан он никуда не пойдет.
-
Покажи файл rules и причем тут ICMP? авторизация идет по UDP протоколу
-
Баг: При добавлению юзера тариф не правильно выставляется(выставляется самый первый в списке тарифов), имя тарифа он везде правильно пишет, а индекс тарифа(порядковый номер для внутреннего пользования) не получает, такое продолжается до: 1)перезапуска СГ 2)до изменения тарифа версии в которых присутствует: beta5,beta8, другие не смотрел Избавиться можно так: В файле ConfigProto.cpp после строк: if (FindTariffByName(user.tariff)<0) { list->Append("ERR\nUnknown tariff!\n\0"); WriteDebugLog("ParseUserAdd", -1); WriteServLog("ConfigProto >>> Пользователь не был добавлен!"); return; } Добавить user.tariffNum=FindTariffByName(user.tariff);
-
Гы, сразу видно кто на чем программит - переменные с $
-
ошибка хотя может это в хидере так функция названа, но спать на буржуйском - sleep, конечно разницы может и нет но порядок знает ли.... ещё похоже что предпоследняя " }" - лишняя
-
Проверить просто - не заврочаивать в туннель, а адрес внешнего интерфейса поставить реальный ип от ПС. Но думаю что 90% вероятности ничего не получиться... Так что придется пользовать ВПН
-
Я делал так: настраиваем роутинг: echo 100 dsl_table >> /etc/iproute2/rt_tables ip rule add fwmark 10 preference 200 table dsl_table ip route add default via "шлюз провайдера по земле" dev eth1 table dsl_table ip route flush cache (дефолтовый route в основной таблице роутинга при таких настройках должен идти на спутник) (ядро должно поддерживать FW mark(CONFIG_IP_ROUTE_FWMARK) и многотабличный роутинг(CONFIG_IP_MULTIPLE_TABLES) и возможно ещё чего-то чего я не помню) в скрипте OnConnect добавляем: INC="_dsl" EX=`echo $1 | grep "$INC"` if [ -n "$EX" ]; then iptables -t mangle -A PREROUTING -s $2 -d ! 192.168.1.0/24 -j MARK --set-mark 0x10 fi в скрипте OnDisconnect аналогичным образом удаляем правило теперь пользователи чье имя содержит строку "_dsl" пойдут по земле. В принципе можно это делать и по имени тарифа, но для этого нужно править код СГ чтоб в скрипт передавалось имя тарифа
-
вроде меньше минуты нелзья интервал делать
-
Ниже патч. Этот патч для sg версии 1.1.4.2 beta5 хотя вообщем для более поздних тоже 90% вероятности будет работать. PS: Я не программер так что прошу не ругать за кривость diff -Nur old/Common.cpp new/Common.cpp --- old/Common.cpp Tue Jul 22 18:03:14 2003 +++ new/Common.cpp Sat Aug 14 18:09:59 2004 @@ -353,6 +353,45 @@ return -1; } //----------------------------------------------------------------------------- +int FindUserByIPn(unsigned int ip,int pos) +{ +// Ищем кому принадлежит данный ИП +for (int i=pos; i<userNum; i++) + { + if (ip==users[i].IP) + { + return i; + } + } +return -1; +} +//----------------------------------------------------------------------------- +int FindUserByIPc(unsigned int ip) +{ +// Ищем кому принадлежит данный ИП +for (int i=0; i<userNum; i++) + { + if (ip==users[i].IP && users[i].connected==1) + { + return i; + } + } +return -1; +} +//----------------------------------------------------------------------------- +int FindUserByIPc2(unsigned int ip) +{ +// Ищем кому принадлежит данный ИП +for (int i=0; i<userNum; i++) + { + if (ip==users[i].IP && users[i].connecting==1) + { + return i; + } + } +return -1; +} +//----------------------------------------------------------------------------- int FindUserByName(char * login) { // Ищем кому принадлежит данный login diff -Nur old/Common.h new/Common.h --- old/Common.h Sat Jan 4 16:29:07 2003 +++ new/Common.h Sat Aug 14 18:10:28 2004 @@ -84,6 +84,9 @@ char * IPToStr(unsigned int ip); int a(); int FindUserByIP(unsigned int ip); +int FindUserByIPn(unsigned int ip,int pos); +int FindUserByIPc(unsigned int ip); +int FindUserByIPc2(unsigned int ip); int FindUserByName(char *); int ReadServerConf(); void CleanDebugLog(); diff -Nur old/ReciveCl.cpp new/ReciveCl.cpp --- old/ReciveCl.cpp Tue Jul 22 17:45:47 2003 +++ new/ReciveCl.cpp Sun Sep 5 00:25:04 2004 @@ -141,10 +141,11 @@ // Функция вернет 0, в t номер пакета, если он был успешно распознан // и текст пакета, уже расшифрованный, в buff // в случае неудачи функция вернет не 0 - WriteDebugLog("CheckPacket begin", +1); int pn,l; +int t1; +unsigned char buff1[256]; if (!((len==64) || (len==256))) { @@ -152,12 +153,26 @@ return EBADMSG; } +memcpy(buff1,buff,len); + +//WriteServLog("CheckPacket"); // Ищем пользователя с нужным ИП if ((un=FindUserByIP(ip))==-1) { WriteDebugLog("CheckPacket end", -1); return EBADMSG; } +if ((t1=FindUserByIPc(ip))!=-1) + { + un=t1; + } + else +if ((t1=FindUserByIPc2(ip))!=-1) + { + un=t1; + } + + //--------------------------------- // Расшифровать сообщение //--------------------------------- @@ -171,8 +186,23 @@ for (int i=0; i<len/8; i++) { DES_ecb_decrypt(context, (unsigned char *)buff+i*8, recovered+i*8); - } + } memcpy(buff, recovered, len); +if (t1==-1) +if (strncmp(buff+20,users[un].login,32)!=0) +while (strncmp(buff+20,users[un].login,32)!=0) + { + if ((un=FindUserByIPn(ip,un+1))==-1) return EBADMSG; + memset(key,0,8); + memcpy(buff,buff1,len); + strncpy((char *)key, users[un].password, 8); + DES_setkey(context, key); + for (int i=0; i<len/8; i++) + { + DES_ecb_decrypt(context, (unsigned char *)buff+i*8, recovered+i*8); + } + memcpy(buff,recovered,len); + } // Определяем тип пакета //и содержащиеся в нем данные for (int i=0; i<9; i++) @@ -190,6 +220,7 @@ case CONN_SYN_N: memcpy(&l,buff,sizeof(l)); t=pn; +// WriteServLog("CONN_SYN_N"); if (l!=64)// Сравниваем длину пакета, для CONN_SYN должно быть 64 { WriteDebugLog("CheckPacket end", -1); @@ -200,6 +231,11 @@ WriteDebugLog("CheckPacket end", -1); return EBADMSG; } + if (users[un].cash<=0) + { + return EBADMSG; + } + users[un].connecting=1; WriteDebugLog("CheckPacket end", -1); return 0; break; @@ -259,6 +295,7 @@ WriteDebugLog("CheckPacket end", -1); return 0; break; + users[un].connecting=0; //------------------------------------------ } t=0; diff -Nur old/SendCl.cpp new/SendCl.cpp --- old/SendCl.cpp Tue Jul 22 18:09:34 2003 +++ new/SendCl.cpp Sun Sep 5 00:24:51 2004 @@ -92,14 +92,17 @@ memcpy(buffer,mbuf.mtext+8,len); sendAddr.sin_family=AF_INET; - sendAddr.sin_addr.s_addr=ip;// IP пользователя + sendAddr.sin_addr.s_addr=ip;// IP пользователя sendAddr.sin_port=htons(settings.userPort);// IP пользователя - +if ((un=FindUserByIPc(ip))==-1) + if ((un=FindUserByIPc2(ip))==-1) if ((un=FindUserByIP(ip))==-1) { +// if ((un=FindUserByIPc2(ip))==-1) continue; //return EBADMSG; } +// WriteServLog("Sending"); //--------------------------------- // 3ашифровать сообщение //--------------------------------- diff -Nur old/user.h new/user.h --- old/user.h Sat Nov 23 17:41:02 2002 +++ new/user.h Sat Aug 14 18:04:13 2004 @@ -78,7 +78,7 @@ void OnConnect(); void OnDisconnect(int); int WriteUsersLog(int event); - + int connecting; private: int enabled; //ДЛя всяких отключений-подключений когда нет денег int phase;
-
2XoRe: знаю - Everquest, пытался даже поставить, но как-то не получилось и руковыпрямителя под руками не было Поставить сервак УО дело пяти минут(в нете валяется вагон и маленькая тележка эмуляторов игровых серверов с готовыми мирами), другое дело "сопровождать" его, те проводить квесты, делать интересной вообщем Я в сети ставил сервак(играло человек 25, одновременно 10 максимум), мне кажется было интересно(я сравниваю с drw на котором щас брат играет, где несмотря на толпы игроков геймплей бедноват) несмотря на количество играющих - потому что я как-то его поддерживал, потом у меня времени не стало хватать, ничего нового не появлялось и играть уже стало не интересно, вообщем снес его нафиг, так как без постоянных нововведений играть просто надоедает
-
Правкой кода я делал чтоб с одного ип адреса могли заходить несколько человек, но сделано это всё через место в народе называемое Ж, отсюда глюк - иногда пользователи просто не коннектятся (грит пароль не правильный) помогает только перезагрузка старгейзера, руки исправить это не дошли. Для пользователей которые сидят по одному на ип такого вроде не замечено, если надо могу выслать - разбирайся.
-
глюка никакого нет, просто вы похоже не поняли разницы между RETURN и ACCEPT Какую из этих целей использовать зависит от конкретного случая и от того как построена фильтрация пакетов. Вот например, если в UA_IX используется RETURN то правила могут выглядеть примерно так: iiptables -A FORWARD -j UA_IX iiptables -A FORWARD -j ACCEPT А вот если используется ACCEPT то правило: iptables -A FORWARD -j ACCEPT не нужно RETURN возвращает проверку в предыдующую цепочку(в данном случае пакет пойдет проверятся дальше по цепочке FORWARD) ACCEPT дает пакету зеленый свет и пакет уже не проверяется по другим правилам - идет в сеть
