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
       }
})

Subscribe to Keun's Story newsletter and stay updated.

Don't miss anything. Get all the latest posts delivered straight to your inbox. It's free!
Great! Check your inbox and click the link to confirm your subscription.
Error! Please enter a valid email address!