Linux 방화벽 인 iptables 초보자 가이드

Iptables는 Linux 운영 체제 용으로 구축 된 매우 유연한 방화벽 유틸리티입니다. Linux 초보자이든 시스템 관리자이든 iptables를 유용하게 사용할 수있는 방법이있을 것입니다. 가장 다재다능한 Linux 방화벽을 구성하는 방법을 보여 주면서 계속 읽으십시오.

ezioman의 사진 .

iptables 정보

iptables는 정책 체인을 사용하여 트래픽을 허용하거나 차단하는 명령 줄 방화벽 유틸리티입니다. 연결이 시스템에서 자체적으로 설정을 시도하면 iptables는 목록에서 일치 할 규칙을 찾습니다. 찾을 수없는 경우 기본 작업을 사용합니다.

iptables는 거의 모든 Linux 배포판에 사전 설치되어 제공됩니다. 업데이트 / 설치하려면 iptables 패키지를 검색하십시오.

sudo apt-get install iptables

Firestarter와 같은 iptables에 대한 GUI 대안이 있지만 몇 가지 명령을 내리면 iptables는 그렇게 어렵지 않습니다. iptables 규칙을 구성 할 때 특히 서버에 SSH를 사용하는 경우에는 매우 조심해야합니다. 하나의 잘못된 명령이 물리적 시스템에서 수동으로 수정 될 때까지 영구적으로 잠길 수 있기 때문입니다.

체인의 종류

iptables는 입력, 전달 및 출력의 세 가지 체인을 사용합니다.

입력 –이 체인은 들어오는 연결의 동작을 제어하는 ​​데 사용됩니다. 예를 들어 사용자가 PC / 서버에 SSH를 시도하면 iptables는 IP 주소와 포트를 입력 체인의 규칙에 일치 시키려고 시도합니다.

전달 –이 체인은 실제로 로컬로 전달되지 않는 수신 연결에 사용됩니다. 라우터를 생각해보십시오. 데이터는 항상 전송되지만 실제로 라우터 자체로 전송되는 경우는 거의 없습니다. 데이터는 대상으로 전달됩니다. 시스템에서 일종의 라우팅, NATing 또는 전달이 필요한 다른 작업을 수행하지 않는 한이 체인을 사용하지도 않을 것입니다.

시스템이 포워드 체인을 사용 / 필요로하는지 여부를 확인하는 확실한 방법이 있습니다.

iptables -L -v

위의 스크린 샷은 몇 주 동안 실행되고 들어 오거나 나가는 연결에 제한이없는 서버입니다. 보시다시피 입력 체인은 11GB의 패킷을 처리하고 출력 체인은 17GB를 처리했습니다. 반면에 포워드 체인은 단일 패킷을 처리 할 필요가 없습니다. 이는 서버가 어떤 종류의 전달을 수행하지 않거나 통과 장치로 사용되지 않기 때문입니다.

출력 –이 체인은 나가는 연결에 사용됩니다. 예를 들어 howtogeek.com에 ping을 시도하면 iptables는 연결 시도를 허용하거나 거부하기 전에 ping 및 howtogeek.com에 관한 규칙이 무엇인지 확인하기 위해 출력 체인을 확인합니다.

주의 사항

외부 호스트를 ping하는 것은 출력 체인을 통과하기 만하면되는 것처럼 보이지만 데이터를 반환하려면 입력 체인도 사용됩니다. iptables를 사용하여 시스템을 잠그는 경우 많은 프로토콜에 양방향 통신이 필요하므로 입력 및 출력 체인을 모두 올바르게 구성해야합니다. SSH는 사람들이 두 체인 모두에서 허용하는 것을 잊어 버리는 공통 프로토콜입니다.

정책 체인 기본 동작

들어가서 특정 규칙을 구성하기 전에 세 체인의 기본 동작을 원하는대로 결정해야합니다. 즉, 연결이 기존 규칙과 일치하지 않는 경우 iptables가 수행하기를 원하는 것은 무엇입니까?

일치하지 않는 트래픽에 대해 수행하도록 현재 구성된 정책 체인을 보려면 iptables -L명령을 실행하십시오 .

보시다시피 grep 명령을 사용하여 더 깨끗한 출력을 제공했습니다. 이 스크린 샷에서 우리 체인은 현재 트래픽을 수용하는 것으로 보입니다.

대부분의 경우 시스템이 기본적으로 연결을 수락하기를 원할 것입니다. 이전에 정책 체인 규칙을 변경하지 않았다면이 설정이 이미 구성되어 있어야합니다. 어느 쪽이든 기본적으로 연결을 수락하는 명령은 다음과 같습니다.

iptables --policy INPUT ACCEPT


iptables --policy OUTPUT ACCEPT


iptables --policy FORWARD ACCEPT

기본적으로 수락 규칙을 사용하면 iptables를 사용하여 특정 IP 주소 또는 포트 번호를 거부하는 동시에 다른 모든 연결을 계속 수락 할 수 있습니다. 잠시 후에 이러한 명령에 대해 설명하겠습니다.

모든 연결을 거부하고 연결을 허용 할 연결을 수동으로 지정하려면 드롭 할 체인의 기본 정책을 변경해야합니다. 이렇게하면 민감한 정보를 포함하고 동일한 IP 주소 만 연결된 서버에만 유용 할 것입니다.

iptables --policy INPUT DROP


iptables --policy OUTPUT DROP


iptables --policy FORWARD DROP

연결 별 응답

기본 체인 정책을 구성하면 iptables에 규칙 추가를 시작할 수 있으므로 특정 IP 주소 또는 포트와의 연결이 발생할 때 수행 할 작업을 알 수 있습니다. 이 가이드에서는 가장 기본적이고 일반적으로 사용되는 세 가지 "응답"에 대해 살펴 보겠습니다.

수락 – 연결을 허용합니다.

끊기 – 연결을 끊고 발생하지 않은 것처럼 행동합니다. 소스가 시스템이 존재한다는 것을 인식하지 못하게하는 것이 가장 좋습니다.

거부 – 연결을 허용하지 않고 오류를 반환합니다. 특정 소스가 시스템에 연결되는 것을 원하지 않지만 방화벽이 해당 소스를 차단했음을 알리려는 경우에 가장 좋습니다.

이 세 가지 규칙의 차이점을 보여주는 가장 좋은 방법은 PC가 이러한 설정 각각에 대해 구성된 iptables를 사용하여 Linux 시스템에 ping을 시도 할 때 어떻게 보이는지 보여주는 것입니다.

연결 허용 :

연결 끊기 :

연결 거부 :

특정 연결 허용 또는 차단

정책 체인을 구성하면 이제 특정 주소, 주소 범위 및 포트를 허용하거나 차단하도록 iptables를 구성 할 수 있습니다. 이 예에서는 연결을로 설정 DROP하지만 필요와 정책 체인을 구성한 방법에 따라 ACCEPT또는로 전환 할 수 있습니다 REJECT.

참고 :이 예제에서는 iptables -A기존 체인에 규칙을 추가하는 데 사용 합니다. iptables는 목록의 맨 위에서 시작하여 일치하는 규칙을 찾을 때까지 각 규칙을 살펴 봅니다. 다른 규칙 위에 규칙을 삽입해야하는 경우을 사용 iptables -I [chain] [number]하여 목록에 있어야하는 번호를 지정할 수 있습니다 .

단일 IP 주소에서 연결

이 예에서는 IP 주소 10.10.10.10의 모든 연결을 차단하는 방법을 보여줍니다.

iptables -A INPUT -s 10.10.10.10 -j DROP

다양한 IP 주소에서 연결

이 예에서는 10.10.10.0/24 네트워크 범위의 모든 IP 주소를 차단하는 방법을 보여줍니다. 넷 마스크 또는 표준 슬래시 표기법을 사용하여 IP 주소 범위를 지정할 수 있습니다.

iptables -A INPUT -s 10.10.10.0/24 -j DROP

또는

iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

특정 포트에 연결

이 예에서는 10.10.10.10에서 SSH 연결을 차단하는 방법을 보여줍니다.

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

"ssh"를 프로토콜 또는 포트 번호로 바꿀 수 있습니다. -p tcp코드 의 일부는 프로토콜이 사용하는 연결 종류를 iptables에 알려줍니다. TCP가 아닌 UDP를 사용하는 프로토콜을 차단하는 -p udp경우 대신 필요합니다.

이 예는 모든 IP 주소에서 SSH 연결을 차단하는 방법을 보여줍니다.

iptables -A INPUT -p tcp --dport ssh -j DROP

연결 상태

앞서 언급했듯이 많은 프로토콜에는 양방향 통신이 필요합니다. 예를 들어 시스템에 대한 SSH 연결을 허용하려면 입력 및 출력 체인에 규칙을 추가해야합니다. 그러나 SSH 만 시스템에 들어오는 것을 허용하려면 어떻게해야합니까? 출력 체인에 규칙을 추가해도 나가는 SSH 시도도 허용되지 않습니까?

여기에서 연결 상태가 나타나고 양방향 통신을 허용하는 데 필요한 기능을 제공하지만 단방향 연결 만 설정할 수 있습니다. 10.10.10.10의 SSH 연결은 허용되지만 10.10.10.10에 대한 SSH 연결은 허용되지 않는이 예를 살펴보십시오. 그러나 세션이 이미 설정되어있는 한 시스템은 SSH를 통해 정보를 다시 보낼 수 있으므로이 두 호스트간에 SSH 통신이 가능합니다.

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT

변경 사항 저장

iptables 규칙에 대한 변경 사항은 변경 사항을 저장하는 명령을 실행하지 않는 한 다음에 iptables 서비스가 다시 시작될 때 스크랩됩니다. 이 명령은 배포에 따라 다를 수 있습니다.

Ubuntu :

sudo /sbin/iptables-save

Red Hat / CentOS :

/sbin/service iptables save

또는

/etc/init.d/iptables save

기타 명령

현재 구성된 iptables 규칙을 나열합니다.

iptables -L

-v옵션을 추가 하면 패킷 및 바이트 정보가 제공되고 추가 -n하면 모든 항목이 숫자로 나열됩니다. 즉, 호스트 이름, 프로토콜 및 네트워크가 숫자로 나열됩니다.

현재 구성된 모든 규칙을 지우려면 flush 명령을 실행할 수 있습니다.

iptables -F