웹서비스를 운영할 때, 다양한 이유로 특정 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
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에 대한 다양한 처리 (알럿)가 가능함.
- 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)
- 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);
}
}));
- 단순 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
}
})