Advertisement
Guest User

Untitled

a guest
May 28th, 2015
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.79 KB | None | 0 0
  1. /**
  2. * Конфигурация
  3. */
  4. var config = {
  5. local: {
  6. host: '0.0.0.0',
  7. port: 1973
  8. },
  9. remote: {
  10. host: '123.123.123.123',
  11. port: 1973
  12. },
  13. realip: false, // Добавлять реальный ip-адрес к mac-адресу (true) или нет (false)
  14. }
  15.  
  16. /**
  17. * Подгрузка необходимых модулей
  18. */
  19. var net = require('net');
  20. var log4js = require('log4js');
  21.  
  22. /**
  23. * Логгер
  24. */
  25. log4js.configure({
  26. appenders: [
  27. { type: 'console' },
  28. { type: 'dateFile', filename: 'log/proxy.log', pattern: '-yyyy-MM-dd', category: '[PROXY]' }
  29. ]
  30. });
  31. var logger = log4js.getLogger('[PROXY]');
  32.  
  33. /**
  34. * Вывод ошибок в консоль
  35. */
  36. process.on('uncaughtException', function(e) {
  37. logger.error(e.toString());
  38. });
  39.  
  40. /**
  41. * Запуск сервера
  42. */
  43. var server = net.createServer(function (socket) {
  44.  
  45. /**
  46. * Инициализируем объект клиента
  47. */
  48. var client = {
  49. addr: socket.remoteAddress,
  50. port: socket.remotePort,
  51. packets: {
  52. amount: {},
  53. speed: {},
  54. actions: {}
  55. },
  56. badscounter: 0
  57. }
  58.  
  59. /**
  60. * Инициализируем соединение с GateServer-ом
  61. */
  62.  
  63. var remote = new net.Socket();
  64.  
  65. remote.connect(config.remote.port, config.remote.host);
  66.  
  67. /**
  68. * Обрабатываем входящие пакеты
  69. */
  70.  
  71. socket.on('data', function(data) {
  72.  
  73. /**
  74. * Регистрируем таймеры
  75. */
  76. var MSEC = new Date().getTime(); // UNIXTIME в миллисекундах
  77. var FSEC = Math.round(MSEC / 1000); // UNIXTIME в секундах
  78.  
  79. /**
  80. * Разбираем входящий пакет
  81. */
  82. var buf = new Buffer(data);
  83. var hex = buf.toString('hex');
  84. var info = getPacketInfo(hex);
  85.  
  86. /**
  87. * Проверяем общую частоту передачи пакетов в сек
  88. */
  89. if(client.packets.amount[FSEC]) {
  90. client.packets.amount[FSEC] += 1;
  91. } else {
  92. client.packets.amount = {};
  93. client.packets.amount[FSEC] = 1;
  94. }
  95. if(client.packets.amount[FSEC] > 256) {
  96. return sendMessage(client, 'MANY_PACKETS', 'WARN');
  97. }
  98.  
  99. /**
  100. * Проверяем объем передаваемых данных в сек
  101. */
  102. var packet_size = data.length;
  103. if(client.packets.speed[FSEC]) {
  104. client.packets.speed[FSEC] += packet_size;
  105. } else {
  106. client.packets.speed = {};
  107. client.packets.speed[FSEC] = packet_size;
  108. }
  109. if(client.packets.speed[FSEC] > 5120) {
  110. logger.info('PACKET_DUMP', info.body);
  111. if(client.badscounter >= 5) {
  112. return closeConnection(socket, remote, client, 'BIG_SPEED', 'ERROR');
  113. } else {
  114. client.badscounter += 1;
  115. return sendMessage(client, 'BIG_SPEED', 'WARN');
  116. }
  117. }
  118.  
  119. switch(info.code) {
  120.  
  121. /**
  122. * Пакет авторизации
  123. * xxxx xxxx 0051 8000 0000 01af 0007 6e6f .@V..Q........no
  124. * 6269 6c6c 0000 0661 646d 696e 0000 182b bill...admin...+
  125. * 58e2 83be 8c88 0197 b4b7 9c98 3fb7 6739 X...........?.g9
  126. * a48c c18b cd16 bb00 1830 302d 3235 2d32 .........00-25-2
  127. * 322d 4446 2d41 432d 3739 2d30 302d 3030 2-DF-AC-79-00-00
  128. * 0003 8f00 88
  129. */
  130. case 431:
  131.  
  132. // Разбор пакета
  133. var shift = 34;
  134. var pkt = {
  135. lsize: parseInt(hex.substring(shift, shift + 4), 16) * 2 };
  136. shift += 4;
  137. pkt.login = hex2str(hex.substring(shift, shift + pkt.lsize - 2));
  138. shift += pkt.lsize ;
  139. pkt.psize = parseInt(hex.substring(shift, shift + 4), 16) * 2;
  140. shift += 4;
  141. pkt.passw = hex.substring(shift, shift + pkt.psize);
  142. shift += pkt.psize;
  143. pkt.msize = parseInt(hex.substring(shift, shift + 4), 16) * 2;
  144. shift += 4;
  145. pkt.mac = hex2str(hex.substring(shift, shift + pkt.msize - 2));
  146.  
  147. client.login = pkt.login;
  148. client.mac = pkt.mac;
  149.  
  150. // Проверка заявленных длин реальным
  151. if (pkt.psize !== 48 || pkt.msize !== 48 ||
  152. pkt.passw.length !== 48 || pkt.mac.length !== 23 || pkt.login.length > 20 ||
  153. pkt.lsize/2-1 !== pkt.login.length) {
  154. return closeConnection(socket, remote, client, 'INVALID_LOGIN_SIZES', 'ERROR');
  155. }
  156.  
  157. // Проверка формата мак-адреса
  158. var re = /^([0-9A-Z]{2}-){7}[0-9A-Z]{2}$/; // 00-25-22-DF-AC-79-00-00
  159. if (!re.test(client.mac)) {
  160. return closeConnection(socket, remote, client, 'INVALID_MAC_FORMAT', 'ERROR');
  161. }
  162.  
  163. // Проверка формата логина
  164. var re = /^[0-9a-zA-Z]{5,20}$/;
  165. if (!re.test(client.login)) {
  166. return closeConnection(socket, remote, client, 'INVALID_LOGIN_FORMAT', 'ERROR');
  167. }
  168.  
  169. sendMessage(client, 'LOGIN');
  170.  
  171. // Модифицируем пакет, добавляя к мак-адресу ip клиента
  172. if(config.realip) {
  173. var find = int2hex(pkt.msize / 2) + str2hex(client.mac);
  174. var replace = str2hex(';' + client.addr);
  175. var new_pkt = '8000000001af' +
  176. info.body.replace(new RegExp(find), int2hex((pkt.msize + replace.length) / 2) + find.substring(4) + replace);
  177. new_pkt = int2hex(new_pkt.length / 2 + 2) + new_pkt;
  178. data = new Buffer(new_pkt, 'hex');
  179. }
  180.  
  181. remote.write(data);
  182.  
  183. break;
  184.  
  185. default:
  186.  
  187. remote.write(data);
  188.  
  189. break;
  190.  
  191. }
  192.  
  193. });
  194.  
  195. socket.on('error', function (e) {
  196. remote.end();
  197. });
  198.  
  199. remote.on('error', function (e) {
  200. logger.error(e.toString());
  201. socket.end();
  202. });
  203.  
  204. remote.on('data', function(data) {
  205. socket.write(data);
  206. });
  207.  
  208. socket.on('close', function(had_error) {
  209. remote.end();
  210. });
  211.  
  212. remote.on('close', function(had_error) {
  213. socket.end();
  214. });
  215.  
  216. }).listen(config.local.port, config.local.host, function(){
  217.  
  218. logger.info('ProxyServer accepting connection on %s:%d', config.local.host, config.local.port);
  219.  
  220. });
  221.  
  222. /**
  223. * Возвращает базовую информацию о hex-пакете
  224. */
  225. /*function getPacketInfo(hex) {
  226. return {
  227. size: parseInt(hex.substring(0, 4), 16),
  228. signature: hex.substring(4, 12),
  229. code: parseInt(hex.substring(12, 16), 16),
  230. realsize: hex.length/2,
  231. body: hex.substring(16)
  232. }
  233. }*/
  234.  
  235. /**
  236. * Возвращает базовую информацию о hex-пакете
  237. * Если содержится несколько логических пакетов, берем только первый
  238. */
  239. function getPacketInfo(hex) {
  240. var packet = {
  241. size: parseInt(hex.substring(0, 4), 16),
  242. signature: hex.substring(4, 12),
  243. code: parseInt(hex.substring(12, 16), 16)
  244. }
  245. packet.body = hex.substring(16,packet.size * 2);
  246. packet.realsize = packet.body.length / 2 + 8;
  247. return packet;
  248. }
  249.  
  250. /**
  251. * Закрывает все соединения с сообщением в консоль
  252. */
  253. function closeConnection(socket, remote, client, message, level) {
  254. remote.end();
  255. socket.end();
  256. return sendMessage(client, message, level ? level : 'WARN');
  257. }
  258.  
  259. /**
  260. * Логирует сообщения
  261. */
  262. function sendMessage(client, message, level) {
  263. switch (level) {
  264. case 'WARN':
  265. logger.warn(message, client.login, client.addr, client.port, client.mac);
  266. break;
  267. case 'ERROR':
  268. logger.error(message, client.login, client.addr, client.port, client.mac);
  269. break;
  270. default:
  271. logger.info(message, client.login, client.addr, client.port, client.mac);
  272. break;
  273. }
  274. return true;
  275. }
  276.  
  277. /**
  278. * Конвертирует число в int32 hex
  279. */
  280. function int2hex(int) {
  281. return String('0000' + (int).toString(16)).slice(-4);
  282. }
  283.  
  284. /**
  285. * Конвертирует hex-строку в utf
  286. */
  287. function hex2str(hex) {
  288. return new Buffer(hex, 'hex').toString();
  289. }
  290.  
  291. /**
  292. * Конвертирует utf в hex-строку
  293. */
  294. function str2hex(str) {
  295. return new Buffer(str).toString('hex');
  296. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement