Iptables 방화벽 규칙을 나열하고 삭제하는 방법


소개

Iptables는 대부분의 Linux 시스템에서 네트워크 보안에 필수적인 역할을 하는 방화벽입니다. 많은 iptables 튜토리얼이 서버를 보호하기 위해 방화벽 규칙을 생성하는 방법을 알려주는 반면, 이 튜토리얼은 방화벽 관리의 다른 측면인 규칙 나열 및 삭제에 중점을 둘 것입니다.

이 튜토리얼에서는 다음과 같은 iptables 작업을 수행하는 방법을 다룰 것입니다.

  • 목록 규칙
  • 패킷 및 바이트 카운터 지우기
  • 규칙 삭제
  • 플러시 체인(체인의 모든 규칙 삭제)
  • 모든 체인 및 테이블 플러시, 모든 체인 삭제 및 모든 트래픽 수락

참고: 방화벽으로 작업할 때 SSH 트래픽(기본적으로 포트 :22)을 차단하여 자신의 서버를 잠그지 않도록 주의하십시오. 방화벽 설정으로 인해 액세스 권한을 상실한 경우 대역 외 콘솔을 통해 연결하여 액세스 권한을 수정해야 할 수 있습니다.

전제 조건

이 자습서에서는 iptables 명령이 설치된 Linux 서버를 사용하고 있고 사용자에게 sudo 권한이 있다고 가정합니다.

이 초기 설정에 대한 도움이 필요하면 CentOS를 참조하십시오.

사양별 규칙 나열

먼저 규칙을 나열하는 방법을 살펴보겠습니다. 활성 iptables 규칙을 보는 방법에는 테이블 또는 규칙 사양 목록의 두 가지 방법이 있습니다. 두 방법 모두 서로 다른 형식으로 거의 동일한 정보를 제공합니다.

모든 활성 iptables 규칙을 사양별로 나열하려면 -S 옵션과 함께 iptables 명령을 실행합니다.

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N ICMP -N TCP -N UDP -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate INVALID -j DROP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable -A TCP -p tcp -m tcp --dport 22 -j ACCEPT ...

보시다시피 출력은 앞의 iptables 명령 없이 생성하는 데 사용된 명령과 같습니다. iptables-persistent 또는 iptables save를 사용한 적이 있다면 iptables 규칙 구성 파일과 유사하게 보일 것입니다.

특정 체인 나열

출력을 특정 체인(INPUT, OUTPUT, TCP 등)으로 제한하려는 경우 체인 이름을 직접 지정할 수 있습니다. -S 옵션 뒤에. 예를 들어 TCP 체인의 모든 규칙 사양을 표시하려면 다음 명령을 실행합니다.

  1. sudo iptables -S TCP
Output
-N TCP -A TCP -p tcp -m tcp --dport 22 -j ACCEPT

이제 활성 iptables 규칙을 보는 다른 방법인 규칙 테이블을 살펴보겠습니다.

규칙을 테이블로 나열

테이블 보기에 iptables 규칙을 나열하면 서로 다른 규칙을 비교하는 데 유용할 수 있습니다. 테이블의 모든 활성 iptables 규칙을 출력하려면 -L 옵션과 함께 iptables 명령을 실행합니다.

  1. sudo iptables -L

이렇게 하면 체인별로 정렬된 모든 현재 규칙이 출력됩니다.

출력을 특정 체인(INPUT, OUTPUT, TCP 등)으로 제한하려는 경우 체인 이름을 직접 지정할 수 있습니다. -L 옵션 뒤에.

INPUT 체인의 예를 살펴보겠습니다.

  1. sudo iptables -L INPUT
Output
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere DROP all -- anywhere anywhere ctstate INVALID UDP udp -- anywhere anywhere ctstate NEW TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW ICMP icmp -- anywhere anywhere ctstate NEW REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere reject-with tcp-reset REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable

출력의 첫 번째 줄은 체인 이름(이 경우 INPUT)과 기본 정책(DROP)을 나타냅니다. 다음 줄은 테이블에 있는 각 열의 헤더로 구성되며 체인의 규칙이 이어집니다. 각 헤더가 나타내는 내용을 살펴보겠습니다.

  • target: 패킷이 규칙과 일치하는 경우 대상은 패킷으로 수행해야 하는 작업을 지정합니다. 예를 들어, 더 많은 규칙과 비교하기 위해 패킷을 수락, 삭제, 기록하거나 다른 체인으로 보낼 수 있습니다.
  • prot: tcp, udp, icmp 또는 all<과 같은 프로토콜 /코드>
  • opt: 거의 사용되지 않음, 이 열은 IP 옵션을 나타냄
  • 소스: 트래픽의 소스 IP 주소 또는 서브넷 또는 어디서나
  • destination: 대상 IP 주소 또는 트래픽 서브넷 또는 어디서나

레이블이 지정되지 않은 마지막 열은 규칙의 옵션을 나타냅니다. 이것은 이전 열에 표시되지 않은 규칙의 일부입니다. 이것은 소스 및 대상 포트에서 패킷의 연결 상태에 이르기까지 무엇이든 될 수 있습니다.

패킷 수 및 집계 크기 표시

iptables 규칙을 나열할 때 각 특정 규칙과 일치하는 패킷 수와 패킷의 총 크기(바이트)를 표시할 수도 있습니다. 이것은 어떤 규칙이 패킷과 일치하는지에 대한 대략적인 아이디어를 얻으려고 할 때 종종 유용합니다. 이렇게 하려면 -L-v 옵션을 함께 사용하십시오.

예를 들어 -v 옵션을 사용하여 INPUT 체인을 다시 살펴보겠습니다.

  1. sudo iptables -L INPUT -v
Output
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 284K 42M ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED 0 0 ACCEPT all -- lo any anywhere anywhere 0 0 DROP all -- any any anywhere anywhere ctstate INVALID 396 63275 UDP udp -- any any anywhere anywhere ctstate NEW 17067 1005K TCP tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 2410 154K ICMP icmp -- any any anywhere anywhere ctstate NEW 396 63275 REJECT udp -- any any anywhere anywhere reject-with icmp-port-unreachable 2916 179K REJECT all -- any any anywhere anywhere reject-with icmp-proto-unreachable 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED

목록에는 이제 pktsbytes라는 두 개의 추가 열이 있습니다.

이제 다양한 방법으로 활성 방화벽 규칙을 나열하는 방법을 알았으므로 패킷 및 바이트 카운터를 재설정하는 방법을 살펴보겠습니다.

패킷 수 및 집계 크기 재설정

규칙에 대한 패킷 및 바이트 카운터를 지우거나 0으로 설정하려면 -Z 옵션을 사용하십시오. 또한 재부팅이 발생하면 재설정됩니다. 이는 서버가 기존 규칙과 일치하는 새 트래픽을 수신하고 있는지 확인하려는 경우에 유용합니다.

모든 체인 및 규칙에 대한 카운터를 지우려면 -Z 옵션을 단독으로 사용하십시오.

  1. sudo iptables -Z

특정 체인의 모든 규칙에 대한 카운터를 지우려면 -Z 옵션을 사용하고 체인을 지정합니다. 예를 들어 INPUT 체인 카운터를 지우려면 다음 명령을 실행합니다.

  1. sudo iptables -Z INPUT

특정 규칙에 대한 카운터를 지우려면 체인 이름과 규칙 번호를 지정하십시오. 예를 들어 INPUT 체인의 첫 번째 규칙에 대한 카운터를 0으로 설정하려면 다음을 실행합니다.

  1. sudo iptables -Z INPUT 1

이제 iptables 패킷 및 바이트 카운터를 재설정하는 방법을 알았으므로 이를 삭제하는 데 사용할 수 있는 두 가지 방법을 살펴보겠습니다.

사양별 규칙 삭제

iptables 규칙을 삭제하는 방법 중 하나는 규칙 지정입니다. 이렇게 하려면 -D 옵션 뒤에 규칙 사양을 지정하여 iptables 명령을 실행할 수 있습니다. 이 방법을 사용하여 규칙을 삭제하려는 경우 규칙 목록의 출력인 iptables -S를 사용하여 도움을 받을 수 있습니다.

예를 들어 잘못된 수신 패킷을 삭제하는 규칙(-A INPUT -m conntrack --ctstate INVALID -j DROP)을 삭제하려는 경우 다음 명령을 실행할 수 있습니다.

  1. sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

생성 시 규칙 위치를 나타내는 데 사용되는 -A 옵션은 여기에서 제외되어야 합니다.

체인 및 번호로 규칙 삭제

iptables 규칙을 삭제하는 다른 방법은 체인줄 번호를 사용하는 것입니다. 규칙의 줄 번호를 결정하려면 테이블 형식으로 규칙을 나열하고 --line-numbers 옵션을 추가합니다.

  1. sudo iptables -L --line-numbers
Output
Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 2 ACCEPT all -- anywhere anywhere 3 DROP all -- anywhere anywhere ctstate INVALID 4 UDP udp -- anywhere anywhere ctstate NEW 5 TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 6 ICMP icmp -- anywhere anywhere ctstate NEW 7 REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable 8 REJECT tcp -- anywhere anywhere reject-with tcp-reset 9 REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable 10 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED ...

이렇게 하면 num 헤더로 표시된 각 규칙 행에 줄 번호가 추가됩니다.

삭제하려는 규칙을 알고 있으면 규칙의 체인 및 줄 번호를 기록해 둡니다. 그런 다음 iptables -D 명령과 체인 및 규칙 번호를 차례로 실행합니다.

예를 들어 유효하지 않은 패킷을 삭제하는 입력 규칙을 삭제하려는 경우 INPUT 체인의 규칙 3임을 알 수 있습니다. 따라서 다음 명령을 실행해야 합니다.

  1. sudo iptables -D INPUT 3

개별 방화벽 규칙을 삭제하는 방법을 알았으니 이제 규칙 체인을 플러시하는 방법을 살펴보겠습니다.

플러싱 체인

Iptables는 체인의 모든 규칙을 삭제하거나 체인을 플러시하는 방법을 제공합니다. 이 섹션에서는 이를 수행하는 다양한 방법을 다룹니다.

경고: drop 또는 deny의 기본 정책으로 체인을 플러시하여 SSH를 통해 서버를 잠그지 않도록 주의하십시오. 그럴 경우 액세스 권한을 수정하기 위해 콘솔을 통해 연결해야 할 수 있습니다.

단일 체인 플러싱

체인의 모든 규칙을 삭제하는 특정 체인을 플러시하려면 -F 또는 동등한 --flush 옵션과 이름을 사용할 수 있습니다. 플러시 할 체인.

예를 들어 INPUT 체인의 모든 규칙을 삭제하려면 다음 명령을 실행합니다.

  1. sudo iptables -F INPUT

모든 체인 세척

모든 방화벽 규칙을 삭제하는 모든 체인을 플러시하려면 -F 또는 동등한 --flush 옵션을 단독으로 사용할 수 있습니다.

  1. sudo iptables -F

모든 규칙 플러시, 모든 체인 삭제 및 모두 수락

이 섹션에서는 모든 방화벽 규칙, 테이블 및 체인을 플러시하고 모든 네트워크 트래픽을 허용하는 방법을 보여줍니다.

경고: 이렇게 하면 방화벽이 효과적으로 비활성화됩니다. 방화벽 구성을 다시 시작하려는 경우에만 이 섹션을 따라야 합니다.

먼저 각 기본 제공 체인에 대한 기본 정책을 ACCEPT로 설정합니다. 이렇게 하는 주된 이유는 SSH를 통해 서버에서 잠기지 않도록 하기 위함입니다.

  1. sudo iptables -P INPUT ACCEPT
  2. sudo iptables -P FORWARD ACCEPT
  3. sudo iptables -P OUTPUT ACCEPT

그런 다음 natmangle 테이블을 플러시하고 모든 체인을 플러시하고(-F) 기본이 아닌 모든 체인을 삭제합니다(-X ):

  1. sudo iptables -t nat -F
  2. sudo iptables -t mangle -F
  3. sudo iptables -F
  4. sudo iptables -X

이제 방화벽이 모든 네트워크 트래픽을 허용합니다. 지금 규칙을 나열하면 규칙이 없고 세 개의 기본 체인(INPUT, FORWARDOUTPUT)만 표시됩니다. 유지하다.

결론

이 자습서를 진행한 후 iptables 방화벽 규칙을 나열하고 삭제하는 방법을 확인했습니다.

iptables 명령을 통한 모든 iptables 변경 사항은 일시적이며 서버 재부팅 후에도 지속되도록 저장해야 합니다. 이것은 공통 방화벽 규칙 및 명령 자습서의 규칙 저장 섹션에서 다룹니다.