
net.BlockList를 사용해 IP 차단 시스템 구현.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 시켜서 다른 파일에서도 참조할 수 있게 설정해주었다.
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에 등록시킨다.
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에 있는지 확인하여 여부에 따라 실행한다.