Iptables은 대부분의 Linux 배포판에 기본적으로 포함되어 있는 기본 방화벽입니다. 네트워크 보안을 처리하는 역할을 합니다. 데이터 패킷을 일련의 규칙과 비교하여 규칙에 따라 시스템이 연결을 수락, 거부 또는 전달하도록 지시하는 방식으로 작동합니다. 이 튜토리얼에서는 규칙을 나열 및 삭제하고, 패킷 및 바이트 카운터를 확인 및 지우고, 체인을 플러시하는 방법을 보여드리겠습니다. 준비되셨나요? 시작해 봅시다!
전제 조건
튜토리얼을 시작하기 전에 한 가지 분명히 해두겠습니다. 이 가이드에서 보여주는 모든 팁과 요령은 별도의 가상 머신에서 수행됩니다. 시스템이 완전히 엉망이 될 가능성을 배제할 수 있으므로 여러분도 그렇게 하는 것이 좋습니다. 이러한 프로세스를 완전히 마스터한 후에만 실제 상황에 적용해 보아야 합니다.
이 튜토리얼에서는 모든 단계를 보여주기 위해 Ubuntu를 사용합니다. 하지만 배포판에 관계없이 유사한 방식으로 작동할 것입니다.
규칙 나열
사양별 규칙 나열
먼저 사양별로 활성화된 모든 규칙을 확인해 보겠습니다. 다음 명령을 실행하세요:
|
1 |
sudo iptables -S |

이전에 iptables 규칙 생성 작업을 해본 적이 있다면 유사점을 발견하셨을 것입니다. 출력 결과는 “iptables” 부분을 제외하고 규칙을 생성하는 데 사용된 명령과 유사합니다. 또한 iptables 규칙 구성 파일과 유사한 구조를 공유합니다.
특정 체인 나열
좀 더 구체적인 작업을 해보겠습니다. 모든 iptables 규칙을 보고하는 대신, iptables가 특정 체인의 규칙을 보고하도록 합니다. 예를 들어 TCP, INPUT, OUTPUT 등입니다. 그렇게 하려면 “-S” 플래그 뒤에 체인 이름을 지정합니다:
|
1 |
sudo iptables -S <chain> |

규칙을 표로 나열
표 보기는 서로 다른 규칙을 비교할 때 유용합니다. “-L” 플래그를 사용하여 iptables가 활성화된 모든 규칙을 표 형식으로 보고하도록 합니다:
|
1 |
sudo iptables -L |

출력에는 체인별로 정렬된 모든 현재 규칙이 포함됩니다. 이전 섹션과 마찬가지로 INPUT, TCP, OUTPUT 등과 같은 특정 체인으로 목록 출력을 필터링할 수도 있습니다. 그렇게 하려면 “-L” 플래그 뒤에 체인을 지정합니다:
|
1 |
sudo iptables -L <chain> |

출력 내용을 조금 분석해 보겠습니다. 우리의 경우, 규칙 때문에 출력이 약간 지저분해 보일 수 있습니다. 출력의 첫 번째 줄은 기본 정책(DROP)과 함께 체인 이름(INPUT)을 선언합니다. 다음 줄은 표 열의 헤더를 지정합니다. 나머지는 체인의 규칙입니다. 헤더가 무엇을 나타내는지 살펴보겠습니다:
- target: 패킷이 규칙과 일치하는 경우 이 섹션은 수행해야 할 작업을 정의합니다. 패킷 수락, 드롭, 로깅 또는 다른 체인으로 전송 등이 될 수 있습니다.
- prot: 프로토콜을 정의합니다. 예를 들어 udp, tcp, icmp 또는 all입니다.
- opt: 이 열은 IP 옵션을 나타냅니다. 거의 사용되지 않습니다.
- source: 패킷의 출발지(IP 주소 또는 서브넷)입니다. 값은 특정 주소이거나 anywhere(모든 곳)일 수 있습니다.
- destination: 패킷의 목적지(IP 주소 또는 서브넷)입니다. 값은 특정 주소이거나 anywhere(모든 곳)일 수 있습니다.
눈치채셨겠지만, 마지막 열에는 레이블이 없습니다. 이는 규칙의 옵션을 나타내는 데 사용되기 때문입니다. 이전 필드에 맞지 않는 규칙의 모든 부분이 여기에 포함됩니다. 출발지/목적지 포트부터 패킷 연결 상태 등에 이르기까지 무엇이든 포함될 수 있습니다.
패킷 수 및 총 크기
패킷 및 바이트 카운터 지우기
iptables 규칙을 나열할 때 각 특정 규칙과 일치하는 패킷 수와 패킷의 총 크기(바이트)도 확인할 수 있습니다. 이는 어떤 규칙이 패킷과 일치하는지 대략적인 그림을 파악해야 할 때 유용한 지표입니다.
이 예제에서는 INPUT 체인을 사용합니다. 이번에는 상세 모드(verbose mode)를 나타내는 “-v” 플래그를 추가합니다:
|
1 |
sudo iptables -L INPUT -v |

이제 표 출력에 pkts와 bytes라는 두 개의 추가 필드가 포함된 것을 확인할 수 있습니다.
패킷 수 및 총 크기 재설정
일부 상황에서는 이전에 보여드린 카운터를 초기화하고 싶을 수 있습니다. 시스템이 재부팅되면 카운터는 자동으로 초기화됩니다. 수동으로 강제 초기화할 수도 있습니다. 패킷 수와 총 크기를 초기화하기 위해 “-Z” 플래그를 사용합니다:
|
1 |
sudo iptables -v -Z |

이 명령은 모든 체인의 카운터를 초기화합니다. 다른 명령과 마찬가지로 특정 체인의 카운터만 초기화할 수도 있습니다. 예를 들어, 다음 명령은 INPUT 체인의 카운터를 초기화합니다:
|
1 |
sudo iptables -v -Z <chain> |

카운터 초기화 작업을 더 정밀하게 수행할 수 있습니다. 특정 체인 아래의 특정 규칙에 대한 카운터를 초기화할 수 있습니다. 그렇게 하려면 체인 이름 뒤에 규칙 번호를 추가하십시오:
|
1 |
sudo iptables -v -Z <chain> <rule_number> |
규칙 삭제
지정된 조건으로 규칙 삭제
iptables 규칙을 삭제하는 방법에는 여러 가지가 있습니다. 첫 번째 방법은 규칙 사양(조건)을 지정하여 삭제하는 것입니다. 삭제를 위해 “-D” 플래그 뒤에 규칙 사양을 입력합니다:
|
1 |
sudo iptables -v -D INPUT -s 172.217.194.113 -j DROP |

이전에 iptables 규칙을 추가해 본 적이 있다면 유사점을 발견하실 것입니다. 여기서 변경된 유일한 부분은 “-A” 플래그 대신 “-D” 플래그를 사용했다는 점입니다.
체인 및 번호로 규칙 삭제
규칙 사양을 지정하여 삭제하는 것은 조금 더 번거롭죠? 규칙 사양을 기억할 필요 없이 삭제할 수 있다면 어떨까요? 체인과 번호로 규칙을 삭제해 봅시다! 첫 번째 방법(사양별 삭제)에 비해 전체 사양을 파악하고 있을 필요가 없으므로 상대적으로 더 쉽습니다.
이 방법은 대상 규칙의 체인과 줄 번호가 필요합니다. 줄 번호는 어디서 얻을 수 있을까요? 이를 확인하려면 다음 명령을 실행하십시오:
|
1 |
sudo iptables -L --line-numbers |

모든 규칙과 해당 줄 번호가 포함된 긴 출력이 표시됩니다. 출력을 좁히려면 “-L” 플래그 뒤에 체인 이름을 사용하십시오:
|
1 |
sudo iptables -L <chain> --line-numbers |

출력에서 추가된 num 열을 볼 수 있습니다. 이는 각 규칙의 줄 번호를 나타냅니다. 대상 번호를 확인했다면 삭제를 수행합니다:
|
1 |
sudo iptables -v -D <chain> <line_number> |
체인 비우기(Flush)
iptables에서 체인을 비운다(flushing)는 것은 무엇을 의미할까요? 이는 특정 체인 아래의 모든 규칙을 삭제하는 과정입니다. 규칙을 대량으로 삭제해야 하는 경우 이 방법을 사용할 수 있습니다. 체인을 비우기 전에 iptables-save를 사용하여 기존 규칙의 백업을 생성할 것을 강력히 권장합니다. 이는 현재의 모든 체인과 규칙을 출력하는 내장 iptables 도구입니다. 출력 결과는 텍스트 파일로 내보낼 수 있습니다:
|
1 |
sudo iptables-save > ~/Desktop/iptables-backup.txt |
![]()
단일 체인 비우기
체인을 비우는 방법을 알아보겠습니다. “-F” 플래그 뒤에 대상 체인을 지정하여 사용합니다:
|
1 |
sudo iptables -v -F <chain> |

모든 체인 비우기
모든 체인을 비우기 전에 자신이 무엇을 하고 있는지 확실히 이해해야 합니다. 이 작업은 iptables 방화벽의 모든 규칙을 삭제합니다. 사전에 반드시 iptables 규칙 백업을 생성해 두어야 합니다.
준비되셨나요? 다음 명령을 실행하여 모든 iptables 체인을 비우십시오:
|
1 |
sudo iptables -v -F |

규칙 비우기, 체인 삭제 및 모두 허용
이 섹션에 설명된 단계를 수행하면 방화벽이 실질적으로 비활성화되어 제한 없는 네트워크 트래픽이 허용됩니다. 이전 섹션과 마찬가지로 진행하기 전에 iptables 백업을 받아두는 것을 권장합니다. 먼저, 내장된 각 체인의 기본 정책을 ACCEPT로 변경합니다. 이는 iptables가 SSH를 통해 서버에서 사용자를 차단하지 않도록 하기 위함입니다:
|
1 |
sudo iptables -v -P INPUT ACCEPT && sudo iptables -v -P FORWARD ACCEPT && sudo iptables -v -P OUTPUT ACCEPT |

이제 nat 및 mangle 테이블을 비웁니다:
|
1 2 |
sudo iptables -v -t nat -F sudo iptables -v -t mangle -F |


모든 체인을 비우고 기본값이 아닌 체인을 모두 삭제합니다:
|
1 2 |
sudo iptables -v -F sudo iptables -v -X |


다음으로 결과를 확인해 보겠습니다:
|
1 |
sudo iptables -L --line-numbers |
맺음말
Iptables는 강력한 방화벽입니다. 이 가이드가 iptables 방화벽 규칙을 조회하고 삭제하는 방법을 배우는 데 도움이 되었기를 바랍니다. 그리고 실제 환경에 적용하기 전에 반드시 연습해 보는 것을 잊지 마세요.
즐거운 컴퓨팅 되세요!



댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.