본문 바로가기
Engineering/Network

iptables 로 일부 문자(string)가 포함된 packet만 차단하기 (string match)

by 알탱2 2022. 3. 28.
반응형

 Application 구동 환경에서 특정 시점에 network 이슈가 발생으로 packet 전송이 늦어지는 경우를 대비하여 종종 response timeout을 두어 exception 처리를 해달라고 개발 요구사항을 내는 경우가 있다. 그런 경우 특정 설정값 또는 default 설정값대로 동작을 잘 하는지 확인을 해야하는데, 간단한 연동 구조인 경우 dummy server를 만들어서 특정 api의 response 전 sleep을 길게 주는 형태로 테스트를 한다. 하지만 dummy server를 만들기 좀 까다롭거나 좀 더 테스트를 빠르게 하기 위해서 iptables의 string pattern match filtering을 사용하면 어떨까? 하는 생각이 들어 string match에 대한 단위 테스트를 해보았다.

 


* 테스트 환경 : CentOS7

* 참고 man 페이지 : 

man iptables

man iptables-extensions


 

서버 준비 

server.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/ping")
def read_root():
    return {"pong"}

@app.get("/myname")
def read_root():
    return {"jinakim"}
Request Response
GET http://localhost:9090/ping ["pong"]
GET http://localhost:9090/myname ["jinakim"]

 

 

Request URL에 포함된 string으로 차단

1. "name"이 포함된 9090 port로 인입되는 packet을 차단하도록 설정

iptables -I INPUT -p tcp --dport 9090 -m string --string "name" --algo bm -j DROP

2. GET http://localhost:9090/ping 요청 -> 성공

3. GET http://localhost:9090/myname 요청 -> 응답 대기 상태로 멈춰있음

4. 설정한 방화벽을 해제하고 다시 GET http://localhost:9090/myname 요청 -> 성공

iptables -D INPUT -p tcp --dport 9090 -m string --string "name" --algo bm -j DROP

 

Response Body에 포함된 string으로 차단

1. "pong"이 포함된 9090 port에서 인입되는 packet을 차단하도록 설정

iptables -I INPUT -p tcp --sport 9090 -m string --string "pong" --algo bm -j DROP

2. GET http://localhost:9090/ping 요청 -> 응답 대기 상태로 멈춰있음

3. GET http://localhost:9090/myname 요청 -> 성공

4. 설정한 방화벽을 해제하고 다시 GET http://localhost:9090/ping 요청 -> 성공

iptables -D INPUT -p tcp --sport 9090 -m string --string "pong" --algo bm -j DROP

 

반응형

댓글