Thoughts, stories and ideas.

Ubuntu 방화벽 설정 / IP 차단

웹서비스를 운영할 때, 다양한 이유로 특정 IP 차단할 필요가 있음.
많은 사람들이 갑작스러운 트래픽 / 공격으로 당황하지 않도록 아래와 같이 기록.
아래 단계로 살펴볼 수 있으나, 시스템자원 및 인적리소스(스트레스..) 고려하여 3단계만 진행.

  • 1단계 Node.js (서비스) 단에서 IP 차단
  • 2단계 Nginx (웹서버) 단에서 IP 차단
  • 3단계 Ubuntu (운영체제/방화벽) 단에서 IP 차단

Ubuntu 방화벽 설정 / IP 차단

  • 우분투 기본 방화벽은 UFW.
  • 간단한 방화벽 구성이 가능하나, 수준 높은 구성을 원하면 iptables 룰을 직접 사용해야함.

Iptables 설치

sudo ufw disable // 기존 방화벽 중지
sudo apt-get install iptables-persistent // 설치

iptables -A INPUT -s 192.168.0.0 -j DROP // 특정 IP 차단

Iptables 기본 명령어

iptables -L
service iptables stop | start

Reference

  • UFW 세부 명령어 링크
  • 리눅스 방화벽 개념 링크
  • Iptables 고급 옵션 (동시 접속량 제한 및 자동 차단) 링크
  • Iptables 전반적인 내용 링크

Nginx 상에서 특정 IP 차단

단점 : nginx에서 접속 처리를 하기 때문에 로그에 계속 남고, 시스템 자원을 이용하게 됨

// sudo vi /etc/nginx/conf.d/ips.conf
deny 192.168.0.0;
deny ...

// sudo vi /etc/nginx/sites-available/default 
server {
    ...
    include /etc/nginx/conf.d/ips.conf;
    ...
    
// $ sudo service nginx restart 
// $ sudo systemctl reload nginx

IP Filter in Node.js

마찬가지로 시스템 자원을 이용하게되나, 해당 IP에 대한 다양한 처리 (알럿)가 가능함.

  1. express-filter 이용하기 (Node.js 버전 이슈 확인)
// Init dependencies
const express = require('express')
const ipfilter = require('express-ipfilter').IpFilter
 
// Blacklist the following IPs
const ips = ['127.0.0.1']
 
// Create the server
app.use(ipfilter(ips))
app.listen(3000)
  1. express-defend | express-blacklist
var expressDefend = require('express-defend');
var blacklist = require('express-blacklist');
 
app.use(blacklist.blockRequests('blacklist.txt'));
app.use(expressDefend.protect({ 
    maxAttempts: 5, 
    dropSuspiciousRequest: true, 
    logFile: 'suspicious.log', 
    onMaxAttemptsReached: function(ipAddress, url){
        blacklist.addAddress(ipAddress);
    } 
}));
  1. 단순 filter
app.get('/test', function(req, res){
       var trustedIps = ['123.123.123.123'];
       var requestIP = req.connection.remoteAddress;
       if(trustedIps.indexOf(requestIP) >= 0) {
           // do stuff
       } else {
           // handle unallowed ip
       }
})