본문 바로가기
Engineering/Network

iptables 활용하여 Connection timeout, Response timeout 테스트 하기

by 알탱2 2022. 4. 4.
반응형

Linux 환경에서 iptables를 활용하여 방화벽 설정하는 방법에 대한 내용을 공유하고, connection timeout 과 response timeout(a.k.a. read timeout) 테스트에 활용하는 방법에 대해 소개합니다.

 

< 목차 >

1. iptables Command 배워보기

   1-1. Basic Command 구조 알아보기

   1-2. INPUT / OUTPUT Chain 에 policy 추가

   1-3. DOCKER-USER Chain 에 policy 추가

2. Connection timeout과 Response(=Read) timeout 테스트에 iptables 활용하기

   2-1. TCP Protocol의 3-way handshake 이해하기 (배경 지식)

   2-2. Connection timeout

   2-3. Response timeout (Read timeout)


 

1. iptables Command 배워보기

들어가며..

  • docker 환경이 아닌 Host OS에서 구동되는 Application이 주고받는 Packet에 대한 차단은 일반적으로 INPUT 또는 OUTPUT Chain 에 설정하면 되지만, docker container 내에서 구동되는 Application이 주고받는 Packet에 대한 차단은 DOCKER-USER Chain이 먼저 적용되므로 DOCKER-USER Chain에 설정해야 합니다. 
  • Command 예시는 실제 가장 자주 활용하는 Command Sample로 내용 전달을 목표로 하며, 보다 더 다양한 Command 활용 방법은 man iptables 를 통해 별도로 학습하길 바랍니다.

1-1. Basic Command 구조 알아보기

목록 조회하기

iptables -nL

 

policy 추가하기

iptables -I INPUT -p tcp --dport 9090 -j DROP
  • -I INPUT :
    • -I : INSERT. policy 추가 입니다. INSERT의 경우 목록의 가장 위에(1번으로) 추가됩니다.
    • -A : APPEND. policy 추가 입니다. APPEND의 경우 목록의 가장 아래로 추가됩니다.
      • tip) 여기서 잠깐!! 추가되는 순서가 중요한 이유는 동일 Chain안에서 policy 적용은 위에서 아래로 적용됩니다. 
    • INPUT : 어떤 Chain에 추가하겠다는 의미입니다. INPUT, OUTPUT, DOCKER-USER 중에 추가하고자 하는 Chain을 넣어주면 됩니다.
  • -p tcp : protocol은 tcp protocol로 지정하겠다는 의미입니다. 필요에 따라 udp도 가능합니다.
  • --dport 9090 : destination port 9090 에 대한 packet을 차단하겠다는 의미입니다. source port 기준으로 차단하고 싶은 경우 --sport 9090 으로 변경할 수 있습니다.
    • tip) port가 아닌 ip로 policy를 적용하고 싶다면, source ip 기준일 때는 -s 10.120.0.11 형태로, destination ip 기준일 때는 -d 10.120.0.11 형태로도 추가할 수 있습니다.
    • iptables -A INPUT -p tcp -d 10.120.0.11 -j DROP
  • -j DROP : packet을 DROP. 즉, 차단 하겠다는 의미입니다. 이는 기본적인 전체 정책이 ACCEPT일때, 특정 policy에 대한 packet만 차단할때 사용되며, 반대로 전체 정책이 DROP일 때는 특정 policy에 대한 packet만 허용하기 위해 -j ACCEPT 로 policy 생성을 할 수 있습니다.

policy 삭제하기

방법 1.

iptables -D INPUT -p tcp --dport 9090 -j DROP
  • policy 추가하기에서 -I 를 -D 로만 변경하면 됩니다. 단, 나머지 명령어가 완전 동일하지 않으면 해당하는 규칙을 찾을 수 없어서 에러 발생할 수 있습니다.

방법 2.

iptables -D INPUT 1
  • INPUT Chain에서 1번째 policy를 삭제하겠다는 의미로 숫자를 변경해주면 그에 해당하는 N번째 policy를 삭제할 수 있습니다.

 

1-2. INPUT / OUTPUT Chain 에 policy 추가

위 상황에서 Msg A를 차단하고 싶다면

(1) Server에 추가할 때

iptables -I INPUT -p tcp --dport 9090 -j DROP

(2) Client에 추가할 때

iptables -I OUTPUT -p tcp --dport 9090 -j DROP

 

위 상황에서 Msg B를 차단하고 싶다면

(1) Server에 추가할 때

iptables -I OUTPUT -p tcp --sport 9090 -j DROP

(2) Client에 추가할 때

iptables -I INPUT -p tcp --sport 9090 -j DROP

 

1-3. DOCKER-USER Chain 에 policy 추가

위 1-2에서 Server 또는 Client Application이 Docker Container 내의 Application 인 경우

iptables -I DOCKER-USER -p tcp --sport 9090 -j DROP
  • 단, 이 경우는 INPUT이냐 OUTPUT이냐의 Msg 방향이 중요하진 않고, 차단하고자 하는 Msg의 source port가 9090인지, destination port가 9090인지만 잘 판단하여 설정하면 됩니다.

 


2. Connection timeout과 Response(=Read) timeout 테스트에 iptables 활용하기

2-1. TCP Protocol의 3-way handshake 이해하기 (배경 지식)

  • TCP 통신에서 실제 Msg를 전송하고 응답을 받으려면 앞뒤로 Socket 생성과 종료의 과정을 거치게 됩니다.
  • 실제 해당 Socket 생성이나 Socket 종료 시점에도 SYN, ACK, FIN packet을 주고받는 과정이 있다고 보시면 됩니다.

 

 

2-2. Connection timeout

  • 접속하고자 하는 Server가 다운되어 있을 때(= 그 IP:Port로 LISTEN 중인게 없는 경우)는 connection timeout 시간이 의미가 없습니다. tcp layer에서 그런 경우에는 바로 감지가 가능하여 connection fail이 발생합니다.
  • Network 상황이 좋지 않아 Socket 연결 자체가 너무 오래걸리거나 packet이 어떤 이유에서건 전달이 잘 되지 않는 경우 socket hangup 이슈를 막기위해 connection timeout 지정을 application에 구현 요청을 하는 경우가 있습니다.
  • 그런 경우에는 IP:Port로 LISTEN은 하되, Socket 생성 과정에서 SYN 또는 SYN에 대한 ACK를 서로 주고받지 못하는 상황이 필요합니다.
  • 이런 경우 Chapter 1에서 소개한 port 기반으로 INPUT, OUTPUT, DOCKER-USER Chain에 Msg 차단 설정을 해주고 timeout이 지나서 connection fail이 발생하는지 확인해보면 됩니다.

 

 

2-3. Response timeout (Read timeout)

  • 여기에서 표현한 Response 또는 Read 라고 표현한 것은 Request Msg에 대한 Response Msg를 수신하기까지의 시간의 의미라고 정의를 하였습니다.
  • 이 경우에는 2-1번의 그림에서 Socket 생성은 되어야 하고, Msg 전송/응답의 응답 부분이 전송되지 않아야 확인 가능합니다.
  • 그러기 위해서는 2-2번의 port 전체 차단은 사용할 수 없습니다. Socket 생성부터 실패되기 때문입니다.
  • 이런 경우 dummy-server를 만들어서 response msg를 전송하기 전에 충분한 sleep time을 줘도 됩니다. 하지만, 매번 이런 경우를 위해 dummy-server를 만들기 싫다면 iptables로 일부 string match되는 packet만 차단하는 방법을 사용할 수 있습니다.

string match되는 msg만 차단하기

iptables -I INPUT -p tcp --sport 9090 **-m string --string "test" --algo bm** -j DROP
  • test 라는 msg가 source port 9090에서 들어오는(INPUIT) packet을 차단하겠다는 의미입니다.
반응형

댓글