Iptables 방화벽 규칙을 나열하고 삭제하는 방법
소개
Iptables는 대부분의 Linux 시스템에서 네트워크 보안에 필수적인 역할을 하는 방화벽입니다. 많은 iptables 튜토리얼이 서버를 보호하기 위해 방화벽 규칙을 생성하는 방법을 알려주는 반면, 이 튜토리얼은 방화벽 관리의 다른 측면인 규칙 나열 및 삭제에 중점을 둘 것입니다.
이 튜토리얼에서는 다음과 같은 iptables 작업을 수행하는 방법을 다룰 것입니다.
- 목록 규칙
- 패킷 및 바이트 카운터 지우기
- 규칙 삭제
- 플러시 체인(체인의 모든 규칙 삭제)
- 모든 체인 및 테이블 플러시, 모든 체인 삭제 및 모든 트래픽 수락
참고: 방화벽으로 작업할 때 SSH 트래픽(기본적으로 포트 :22
)을 차단하여 자신의 서버를 잠그지 않도록 주의하십시오. 방화벽 설정으로 인해 액세스 권한을 상실한 경우 대역 외 콘솔을 통해 연결하여 액세스 권한을 수정해야 할 수 있습니다.
전제 조건
이 자습서에서는 iptables
명령이 설치된 Linux 서버를 사용하고 있고 사용자에게 sudo
권한이 있다고 가정합니다.
이 초기 설정에 대한 도움이 필요하면 CentOS를 참조하십시오.
사양별 규칙 나열
먼저 규칙을 나열하는 방법을 살펴보겠습니다. 활성 iptables 규칙을 보는 방법에는 테이블 또는 규칙 사양 목록의 두 가지 방법이 있습니다. 두 방법 모두 서로 다른 형식으로 거의 동일한 정보를 제공합니다.
모든 활성 iptables 규칙을 사양별로 나열하려면 -S
옵션과 함께 iptables
명령을 실행합니다.
- 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
체인의 모든 규칙 사양을 표시하려면 다음 명령을 실행합니다.
- sudo iptables -S TCP
Output-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
이제 활성 iptables 규칙을 보는 다른 방법인 규칙 테이블을 살펴보겠습니다.
규칙을 테이블로 나열
테이블 보기에 iptables 규칙을 나열하면 서로 다른 규칙을 비교하는 데 유용할 수 있습니다. 테이블의 모든 활성 iptables 규칙을 출력하려면 -L
옵션과 함께 iptables
명령을 실행합니다.
- sudo iptables -L
이렇게 하면 체인별로 정렬된 모든 현재 규칙이 출력됩니다.
출력을 특정 체인(INPUT
, OUTPUT
, TCP
등)으로 제한하려는 경우 체인 이름을 직접 지정할 수 있습니다. -L
옵션 뒤에.
INPUT
체인의 예를 살펴보겠습니다.
- sudo iptables -L INPUT
OutputChain 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
체인을 다시 살펴보겠습니다.
- sudo iptables -L INPUT -v
OutputChain 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
목록에는 이제 pkts
및 bytes
라는 두 개의 추가 열이 있습니다.
이제 다양한 방법으로 활성 방화벽 규칙을 나열하는 방법을 알았으므로 패킷 및 바이트 카운터를 재설정하는 방법을 살펴보겠습니다.
패킷 수 및 집계 크기 재설정
규칙에 대한 패킷 및 바이트 카운터를 지우거나 0으로 설정하려면 -Z
옵션을 사용하십시오. 또한 재부팅이 발생하면 재설정됩니다. 이는 서버가 기존 규칙과 일치하는 새 트래픽을 수신하고 있는지 확인하려는 경우에 유용합니다.
모든 체인 및 규칙에 대한 카운터를 지우려면 -Z
옵션을 단독으로 사용하십시오.
- sudo iptables -Z
특정 체인의 모든 규칙에 대한 카운터를 지우려면 -Z
옵션을 사용하고 체인을 지정합니다. 예를 들어 INPUT
체인 카운터를 지우려면 다음 명령을 실행합니다.
- sudo iptables -Z INPUT
특정 규칙에 대한 카운터를 지우려면 체인 이름과 규칙 번호를 지정하십시오. 예를 들어 INPUT
체인의 첫 번째 규칙에 대한 카운터를 0으로 설정하려면 다음을 실행합니다.
- sudo iptables -Z INPUT 1
이제 iptables 패킷 및 바이트 카운터를 재설정하는 방법을 알았으므로 이를 삭제하는 데 사용할 수 있는 두 가지 방법을 살펴보겠습니다.
사양별 규칙 삭제
iptables 규칙을 삭제하는 방법 중 하나는 규칙 지정입니다. 이렇게 하려면 -D
옵션 뒤에 규칙 사양을 지정하여 iptables
명령을 실행할 수 있습니다. 이 방법을 사용하여 규칙을 삭제하려는 경우 규칙 목록의 출력인 iptables -S
를 사용하여 도움을 받을 수 있습니다.
예를 들어 잘못된 수신 패킷을 삭제하는 규칙(-A INPUT -m conntrack --ctstate INVALID -j DROP
)을 삭제하려는 경우 다음 명령을 실행할 수 있습니다.
- sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
생성 시 규칙 위치를 나타내는 데 사용되는 -A
옵션은 여기에서 제외되어야 합니다.
체인 및 번호로 규칙 삭제
iptables 규칙을 삭제하는 다른 방법은 체인과 줄 번호를 사용하는 것입니다. 규칙의 줄 번호를 결정하려면 테이블 형식으로 규칙을 나열하고 --line-numbers
옵션을 추가합니다.
- sudo iptables -L --line-numbers
OutputChain 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
임을 알 수 있습니다. 따라서 다음 명령을 실행해야 합니다.
- sudo iptables -D INPUT 3
개별 방화벽 규칙을 삭제하는 방법을 알았으니 이제 규칙 체인을 플러시하는 방법을 살펴보겠습니다.
플러싱 체인
Iptables는 체인의 모든 규칙을 삭제하거나 체인을 플러시하는 방법을 제공합니다. 이 섹션에서는 이를 수행하는 다양한 방법을 다룹니다.
경고: drop
또는 deny
의 기본 정책으로 체인을 플러시하여 SSH를 통해 서버를 잠그지 않도록 주의하십시오. 그럴 경우 액세스 권한을 수정하기 위해 콘솔을 통해 연결해야 할 수 있습니다.
단일 체인 플러싱
체인의 모든 규칙을 삭제하는 특정 체인을 플러시하려면 -F
또는 동등한 --flush
옵션과 이름을 사용할 수 있습니다. 플러시 할 체인.
예를 들어 INPUT
체인의 모든 규칙을 삭제하려면 다음 명령을 실행합니다.
- sudo iptables -F INPUT
모든 체인 세척
모든 방화벽 규칙을 삭제하는 모든 체인을 플러시하려면 -F
또는 동등한 --flush
옵션을 단독으로 사용할 수 있습니다.
- sudo iptables -F
모든 규칙 플러시, 모든 체인 삭제 및 모두 수락
이 섹션에서는 모든 방화벽 규칙, 테이블 및 체인을 플러시하고 모든 네트워크 트래픽을 허용하는 방법을 보여줍니다.
경고: 이렇게 하면 방화벽이 효과적으로 비활성화됩니다. 방화벽 구성을 다시 시작하려는 경우에만 이 섹션을 따라야 합니다.
먼저 각 기본 제공 체인에 대한 기본 정책을 ACCEPT
로 설정합니다. 이렇게 하는 주된 이유는 SSH를 통해 서버에서 잠기지 않도록 하기 위함입니다.
- sudo iptables -P INPUT ACCEPT
- sudo iptables -P FORWARD ACCEPT
- sudo iptables -P OUTPUT ACCEPT
그런 다음 nat
및 mangle
테이블을 플러시하고 모든 체인을 플러시하고(-F
) 기본이 아닌 모든 체인을 삭제합니다(-X
):
- sudo iptables -t nat -F
- sudo iptables -t mangle -F
- sudo iptables -F
- sudo iptables -X
이제 방화벽이 모든 네트워크 트래픽을 허용합니다. 지금 규칙을 나열하면 규칙이 없고 세 개의 기본 체인(INPUT
, FORWARD
및 OUTPUT
)만 표시됩니다. 유지하다.
결론
이 자습서를 진행한 후 iptables 방화벽 규칙을 나열하고 삭제하는 방법을 확인했습니다.
iptables
명령을 통한 모든 iptables 변경 사항은 일시적이며 서버 재부팅 후에도 지속되도록 저장해야 합니다. 이것은 공통 방화벽 규칙 및 명령 자습서의 규칙 저장 섹션에서 다룹니다.