문제 개요

image.png

원인 분석

해결

server.js에서 blockList 인스턴스 생성

import net from 'net';
import { onConnection } from './events/onConnection.js';
import { initServer } from './init/initServer.js';
import { config } from './config/config.js';

export const blockList = new net.BlockList();

const server = net.createServer(onConnection);

initServer().then(() => {
  server.listen(config.server.port, config.server.host, () => {
    console.log(`SERVER ON - ${config.server.host} : ${config.server.port}`);
  });
});

export 시켜서 다른 파일에서도 참조할 수 있게 설정해주었다.

initServer에서 구동되는 loadBanList

export function readBanList() {
  try {
    const data = fs.readFileSync(filePath, 'utf8');
    return JSON.parse(data);
  } catch (error) {
    logger.error('Error reading the ban list:', error);
    return null;
  }
}

export const loadBanList = async () => {
  const banList = await readBanList();
  banList.banned_ips.forEach((ban) => {
    blockList.addAddress(ban.ip);
  });
};

서버가 실행될 때 banned_ips.json에서 차단된 IP를 읽어 blockList에 등록시킨다.

onConnection 부분

export const onConnection = (socket) => {
  const remoteAddress = socket.remoteAddress;

  if (blockList.check(remoteAddress)) {
    console.log('Blocked connection from', remoteAddress);
    handleErr(socket, { code: ERR_CODES.SOCKET_ERR, message: 'Your IP is banned' });
    socket.end();
  } else {
    console.log('Allowed connection from', remoteAddress);
    socket.buffer = Buffer.alloc(0);
    socket.clientId = uuidV4();
    socket.sequence = 0;

    socket.on('data', onData(socket));
    socket.on('end', onEnd(socket));
    socket.on('error', onError(socket));
  }
};

연결 시 소켓의 IP주소를 확인하고 blockList에 있는지 확인하여 여부에 따라 실행한다.