iptables를 사용하여 넷필터 설정하기 Iptables 사용의 예. 대중교통 패키지의 이동 순서

강철, 밍크, 쇠고기, 종이 2010년 9월 28일 오후 7시 47분

데비안을 예로 들어 아기의 눈으로 본 iptables의 기본

우리는 무엇에 대해 이야기할까요?

모든 것이 매우 간단합니다. 포럼에서 Linux 세계를 처음 접하는 사람들에게 다시 한 번 설명합니다. 제가 이해하는 바에 따르면 인터넷에서는 iptables 설정뿐만 아니라 일부 네트워크 기본 사항을 설명하는 종합 기사를 찾을 수 없습니다.
그래서 저는 Linux에서 방화벽을 설정하는 방법에 대한 간략한 설명을 여러분께 소개합니다. netfilter/iptables 설정에 대해 자세히 살펴보겠습니다. 질문에 대한 포괄적인 답변이 부족하기 때문에 의심할 여지 없이 다른 적용 문제도 다룰 것입니다... 그리고 여기서는 모든 것을 가능한 한 명확하게 제시하려고 노력할 것입니다.

그것은 어떻게 생겼나요?

우리는 사무실과 아파트, 예, 아파트에 대한 일반적인 계획을 고려할 것입니다! 집에 테이블 아래에 작은 서버를 가지고 있는 사람은 거의 없지만 집에 있는 대부분의 인터넷은 라우터를 통해 배포되며 대부분 Linux 펌웨어도 있습니다.
전형적인 소규모 사무실 레이아웃입니다. 1대의 컴퓨터(서버)가 인터넷에 연결되어 있고 나머지는 이 서버를 통해 인터넷에 연결된 경우입니다.

가자, 천천히...

그래서 우리는 무엇을 가지고 있습니까?
  • 2개의 네트워크 카드와 Debian Lenny가 설치된 서버
  • Debian Lenny 방화벽의 기본값 - netfilter/iptables
  • 서버를 포함하여 스위치를 통해 모두 연결된 N개 컴퓨터의 로컬 네트워크
NAT가 무엇인가요?
먼저 가장 일반적인 NAT(Network Address Translation)를 설정한다는 점을 이해해야 합니다. 목이 마르신 분들을 위해 마지막에는 오징어를 예로 들어 프록시 서버에 대해서도 언급하겠습니다. 이미 말했듯이 우리는 거의 모든 것을 씹을 것입니다.
NAT란 무엇입니까? 실제로 모든 것이 간단합니다. 모든 컴퓨터에는 물리적(MAC) 주소와 네트워크(IP) 주소가 있습니다. 우리는 현재 IP 주소에 관심이 있습니다. 동일한 네트워크 내에서 IP 주소는 고유해야 합니다! 그리고 현재 IPv4 표준에서는 4,294,967,296(2 32)만 고유할 수 있는데 이는 전혀 많지 않으며 거의 ​​사라졌습니다. 하지만 걱정하지 마세요. IPv6는 곧 널리 보급될 예정이며 거기에는 수많은 주소가 있습니다!
그러나 여기에는 IPv4가 허용하는 것보다 훨씬 더 많은 컴퓨터가 있다는 것을 알 수 있거나 집에 있는 친구가 귀하와 동일한 주소를 가지고 있다고 말할 수 있습니다! 여기서 NAT에 대해 이야기합니다. 이를 통해 단일 IP 주소를 사용하여 컴퓨터 네트워크를 서로 연결할 수 있으며 방화벽 작업을 SNAT(소스 NAT 또는 소스 주소 대체)라고 합니다. 저것들. 99%의 경우 사무실 전체가 하나의 IP 주소로 인터넷에 액세스하는 반면, 사무실 내부의 모든 사람은 자신만의 IP 주소를 가지고 있습니다. 인터넷에서 IP 주소 클래스에 대해 읽을 수 있습니다.

이제 NAT가 무엇이고 무엇이 필요한지 알았으므로 서버 설정을 직접 진행할 수 있습니다.

대중교통
모든 명령은 루트(수퍼유저)로 실행됩니다. 데비안에서는 소위 전송 트래픽이 기본적으로 비활성화되어 있습니다. 기본적으로 작업은 단일 머신으로만 제공됩니다. 짐작할 수 있듯이 전송 트래픽이 없으면 NAT가 없습니다. 활성화하려면 숫자 하나만 변경하면 됩니다. $ 에코 1 > /proc/sys/net/ipv4/ip_forward, 하지만 이 설정은 재부팅 후에 사라지므로 구성을 수정하는 것이 좋습니다 - $ 나노 /etc/sysctl.conf다음으로 우리는 선을 찾습니다 #net.ipv4.ip_forward=1줄 시작 부분의 해시(주석 기호)를 제거하고 값이 1인지 확인하세요! 이제 iptables 구성을 직접 진행할 수 있습니다.
iptable 설정
iptables에 규칙을 작성하는 방법과 그 도움으로 무엇을 할 수 있는지에 대한 많은 기사가 인터넷에 있습니다. 나는 이것이 가장 완벽하고 읽기에 즐겁다는 것을 알았습니다.
그럼 시작해 보겠습니다. 먼저, 불필요한 규칙이 있을 경우를 대비해 불필요한 규칙의 표를 정리하겠습니다...
$ iptables -F
$ iptables -t nat -F
$ iptables -t 맹글 -F

초과분은 청소되었습니다. iptables의 규칙은 계층적으로 적용된다는 점을 이해하고 기억하는 것이 매우 중요합니다. 위의 규칙은 더 일찍 충족됩니다. 모든 체인에는 기본적으로 ACCEPT 정책이 있습니다. 즉, 모든 것을 허용합니다. 이는 이 체인의 규칙에 속하지 않습니다.
로컬 네트워크에 대한 인터페이스는 eth0이고 인터넷에 대한 인터페이스는 eth1이며 로컬 네트워크의 주소는 192.168.0.0/24이며 공급자는 고정 주소 10.188.106.33을 제공했습니다("흰색"은 아니지만 - 인터넷에서 찾아볼 수 있는 IP 주소 유형에 대해서도 이야기할 수 있습니다. 그래서 우리는 다음과 같이 씁니다:
$ iptables -A 앞으로 -i eth0 -o eth1 -s 192.168.0.0/24 -j 수락
$ iptables -A 앞으로 -i eth1 -o eth0 -d 192.168.0.0/24 -j 수락
$ iptables -P 앞으로 드롭

따라서 우리는 전송 패킷이 우리의 IP 주소 범위에 대해 방화벽을 통과하도록 허용하고 다른 모든 것을 금지했습니다.
이제 NAT 자체는 다음과 같습니다.
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.188.106.33
NAT가 작동하도록 하려면 이것으로 충분합니다.
작은 것들...
클라이언트에서는 선택한 범위의 IP를 표시하고 서버의 IP 주소를 게이트웨이로 표시합니다(일반적으로 서브넷에서 먼저 할당됩니다. 이를 귀하의 재량에 맡기겠습니다). 서버의 모든 네트워크 설정은 다음과 같이 수행할 수 있습니다.
$ 나노 /etc/네트워크/인터페이스네트워크 인터페이스의 설정을 지정합니다.
게이트웨이 또는 DNAT를 통해 네트워크 깊이에 액세스
그러다가 네트워크에 RDP를 통해 항상 쉽게 액세스할 수 있는 Windows Server가 있다는 것을 깨달았고, 이 짜증나는 데비안 게이트웨이가 나타났습니다! 모든 것이 매우 간단합니다. iptables에 DNAT 규칙을 추가하기만 하면 됩니다.
DNAT는 어떤 짐승인가? DNAT(대상 NAT 또는 수신자 주소 대체) - 네트워크 카드는 자신에게 특별히 주소가 지정된 패킷만 허용하는 모드에서 작동하지만 인터넷에 액세스하는 IP가 12개의 다른 시스템인 경우 서버로 이동할 수 있습니까? 네 사무실에 있어? 요청이 그에게 어떻게 전달되나요? 실제로 이런 종류의 모든 요청은 우리 게이트웨이에 반대됩니다. 그리고 우리가 해야 할 일은 그러한 패키지를 사용하기 위한 규칙을 설정하는 것뿐입니다.
$ iptables -A 사전 라우팅 -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --대상 192.168.0.2
이 간단한 규칙은 인터넷에서 TCP 포트 3389(RDP 프로토콜이 사용하는 포트)를 통해 게이트웨이로 들어오는 모든 패킷을 내부 Windows Server로 리디렉션합니다. 그리고 짜잔, 모든 것이 당신에게 도움이 됩니다.
그럼 네가 가장 좋아하는 오징어는 어때?
이제 모든 것이 작동하지만 모든 사람이 인터넷을 사용할 수 있고 모든 것이 작동하지만 일부는 여전히 프록시 서버가 필요합니다. 나는 오징어 설정에 대해 이야기하지 않고 "투명"하게 만드는 규칙을 보여줄 것입니다. Squid에서는 올바른 위치에 transparent라는 마법의 단어를 쓰기만 하면 해당 요청을 올바르게 처리하기 시작합니다.
우리는 쓴다 $ iptables -A 사전 라우팅 중 -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 3128.
그리고 이것이 우리에게 무엇을 주는가? 이제 http((80) 및 https(443) 프로토콜을 통해 워크스테이션에서 웹 페이지에 대한 모든 요청이 squid가 수신하는 포트로 리디렉션됩니다. 콘텐츠 필터링, 누가 인터넷에서 어디에 있었고 무엇을 했는지에 대한 정보, 사용자는 이전처럼 작동하는지 의심하지 않고 아무것도 하지 않습니다.
약간의 안전
최소한 게이트웨이를 최소한으로 보호해야 하므로 몇 가지 규칙을 더 추가해 보겠습니다.
$ iptables -A 입력 -i lo -j 수락
$ iptables -A 입력 -i eth0 -s 192.168.0.0/24 -j 수락
$ iptables -A 입력 -i eth1 -m conntrack --ctstate 관련, 설정됨 -j 수락
$ iptables -P 입력 삭제

따라서 이미 설정된 연결을 제외하고 게이트웨이와의 직접 통신은 금지되었습니다. 당신이 시작한 것들은 당신이 그들에 대한 응답을 받을 뿐입니다. 두려워하지 마십시오. 우리의 DNAT는 이러한 규칙에 도달하지 않습니다...
왜 이렇게 소수야?
기사는 고무적이지 않으며 여전히 모든 것을 말할 수는 없습니다 ... 내가 가져 왔습니다 최저한의 Linux에서 게이트웨이와 같은 거물을 마스터할 수 있도록 일련의 작업과 개념을 제공합니다. 여기에서는 넷필터의 다양한 측면과 기능에 대해 매우 오랫동안 이야기할 수 있습니다.

보시다시피 모든 것이 정말 간단합니다! 가장 중요한 것은 네트워크의 작동 원리를 이해하고 큰 매뉴얼을 설정하고 읽는 것을 두려워하지 않는 것입니다.
Linux 기반 소프트웨어 라우터와 친분을 쌓기에 충분한 정보를 모을 수 있었으면 좋겠습니다.

태그: iptables, 넷필터, NAT

이번 글에서는 리눅스에서 iptables를 설정하는 방법을 알려드리겠습니다. 이것이 무엇인지, 이 기능을 구성해야 하는 이유를 배우게 됩니다. Linux에서 iptables 설정아주 간단합니다.

Linux에서 iptables 설정: iptables란 무엇입니까?

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

Iptables는 거의 항상 모든 Linux 배포판에 사전 설치되어 제공됩니다. 업데이트/설치하려면 iptables 패키지를 다운로드하세요.

sudo apt-get iptables 설치

Firestarter와 같은 iptables에 대한 GUI 대안이 있지만 몇 가지 명령만 실행하면 iptables는 그렇게 복잡하지 않습니다. iptables 규칙을 설정할 때, 특히 서버에서 SSH를 사용하는 경우 매우 주의하십시오. 잘못된 명령 하나가 물리적 시스템에 수동으로 커밋될 때까지 오랫동안 잠길 수 있기 때문입니다.

초보자용 Linux에서 iptables 설정

그건 그렇고, 우리는 이미 이것에 대해 전에 이야기했습니다. 아마도 이것은 당신에게도 흥미로울 것입니다. 링크는 위에서 확인하실 수 있습니다.

위에서 말했듯이 Linux에서 iptables를 설정하는 것은 매우 간단합니다. 하지만 설정을 시작하기 전에 옵션의 일반적인 개념을 숙지해야 합니다.

회로 유형

Iptables는 입력, 전달 및 출력의 세 가지 회로를 사용합니다.

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

앞으로- 이 체인은 실제로 로컬로 전달되지 않는 들어오는 연결에 사용됩니다. 라우터에 대해 생각해 보십시오. 데이터는 항상 라우터로 전송되지만 실제로 라우터 자체로 향하는 경우는 거의 없습니다. 데이터는 단순히 랜딩 페이지로 리디렉션됩니다. 시스템에서 라우팅, NAT 또는 전달이 필요한 기타 작업을 수행하지 않는 한 이 체인을 사용하지도 않습니다.

시스템이 순방향 체인을 사용하는지 또는 필요한지를 확인하는 한 가지 신뢰할 수 있는 방법이 있습니다.

이 스크린샷은 몇 주 동안 실행되었으며 들어오거나 나가는 연결에 제한이 없는 서버를 보여줍니다. 보시다시피 입력 체인은 11GB의 패킷을 처리했고 출력 체인은 17GB를 처리했습니다. 반면에 순방향 연결은 단일 패킷을 처리할 필요가 없습니다. 이는 서버가 어떠한 포워딩도 수행하지 않거나 End-to-End 장치로 사용되지 않기 때문입니다.

출력 - 이 체인은 나가는 연결에 사용됩니다. 예를 들어, linuxinsider 사이트에 ping을 시도하면 iptables는 연결 시도를 허용할지 거부할지 결정하기 전에 출력 체인을 확인하여 ping 및 linuxinsider에 어떤 규칙이 적용되는지 확인합니다.

경고

외부 호스트 검사가 출력 체인만 통과하면 되는 것처럼 보이지만 입력 체인도 데이터를 반환하는 데 사용된다는 점을 명심하세요. iptables를 사용하여 시스템을 잠글 때 많은 프로토콜에는 양방향 통신이 필요하므로 입력 및 출력 체인 모두 올바르게 구성되어야 한다는 점을 기억하십시오. SSH는 사람들이 두 체인 모두에서 활성화하는 것을 잊어버리는 공통 프로토콜입니다.

기본 정책 동작

특정 규칙 구성을 시작하기 전에 이러한 세 체인의 기본 동작을 결정해야 합니다. 즉, 연결이 기존 규칙과 일치하지 않는 경우 iptables가 무엇을 하도록 하시겠습니까?

일치하지 않는 트래픽을 처리하도록 구성된 정책 체인을 확인하려면 iptables -L 명령을 실행하세요.

보시다시피, 더 깔끔한 결과를 얻기 위해 grep 명령도 사용했습니다. 이 스크린샷에서 우리 체인은 현재 트래픽을 허용하도록 구성되어 있습니다.

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

iptables --policy 입력 수락
iptables --policy 출력 수락
iptables --policy FORWARD ACCEPT

기본적으로 수락 규칙에서는 iptables를 사용하여 다른 모든 연결을 계속 수락하면서 특정 IP 주소나 포트 번호를 거부할 수 있습니다. 잠시 후에 해당 명령을 살펴보겠습니다.

모든 연결을 거부하고 연결을 허용할 연결을 수동으로 지정하려면 회로의 기본 정책을 거부하도록 변경해야 합니다. 이는 아마도 민감한 정보가 포함된 서버에만 유용할 것이며 동일한 IP 주소로만 연결될 것입니다.

iptables --policy INPUT DROP
iptables --policy 출력 삭제
iptables --policy FORWARD DROP

연결 응답

기본 연결 정책이 구성되면 iptables에 규칙을 추가하여 특정 IP 주소나 포트에 대한 연결이 발견될 때 수행할 작업을 알 수 있습니다. 이 가이드에서는 가장 일반적이고 자주 사용되는 "답변" 세 가지를 살펴보겠습니다.

수용하다— 연결을 허용합니다.

떨어지다- 연결을 끊고 아무 일도 일어나지 않은 것처럼 행동하십시오. 이는 소스가 시스템이 존재한다는 사실을 인식하지 못하게 하려는 경우에 가장 좋습니다.

거부하다— 연결을 거부하지만 오류 메시지를 보냅니다. 이는 특정 소스가 시스템에 연결되는 것을 원하지 않지만 방화벽이 해당 소스를 차단했다는 사실을 알리고 싶은 경우에 가장 좋습니다.

이 세 가지 규칙의 차이점을 보여주는 가장 좋은 방법은 PC가 각 옵션에 대해 구성된 iptables를 사용하여 Linux 시스템에 ping을 시도할 때 나타나는 모습을 보여주는 것입니다.

연결 권한:

연결 제거:

연결 거부:

IP 주소 범위를 나타내는 넷마스크 또는 특성입니다.

Linux에서 iptables 설정: 연결 방법

"Linux에서 iptables 설정"이라는 주제에 대해 이야기한다면 연결 방법에 대해 이야기해야 합니다.

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

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

동일한 IP 주소의 연결

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

iptables -A 입력 -s 10.10.10.10 -j DROP

다양한 IP 주소로부터의 연결

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

iptables -A 입력 -s 10.10.10.0/24 -j DROP

iptables -A 입력 -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 서비스가 다시 시작될 때 삭제됩니다. 이 명령은 배포판에 따라 다를 수 있습니다.

sudo /sbin/iptables-저장

레드햇/CentOS:

/sbin/service iptables 저장

/etc/init.d/iptables 저장

기타 명령

현재 구성된 iptables 규칙 목록:

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

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

훌륭한 영어 자료의 번역 HowToGeek.

"인형을 위한 Linux에서 iptables 설정"이라는 주제에 대해 여전히 질문이 있는 경우 당사 웹 사이트의 댓글 양식에 질문을 작성할 수 있습니다.

오류를 발견하면 텍스트 부분을 강조 표시하고 다음을 클릭하세요. Ctrl+Enter.

IPTables는 Linux에서 방화벽을 관리하는 데 사용되는 유틸리티입니다. 원치 않는 연결을 위한 강력하고 편리한 도구입니다. 전체 프로세스는 편집하고 볼 수 있는 iptables 규칙에 포함되어 있습니다. 자세한 내용은 기사에 나와 있습니다.

창조의 역사

전에 Linux의 IPTables는 BSD에서 빌린 IPFW 방화벽을 사용했습니다. 그런 다음 Linux 커널 버전 2.4부터 Netfilter 방화벽과 이를 관리하기 위한 IPTables 유틸리티가 함께 제공되기 시작했습니다. 작업 방법론에서는 모든 측면이 보존되고 기능적으로 약간 확장되었습니다.

IPTable의 구조와 디자인

방화벽에 진입하면 패킷은 여러 검사를 거칩니다. 이는 체크섬일 수도 있고 다른 커널 수준 분석일 수도 있습니다. 그런 다음 PREROUTING 체인을 통과할 시간입니다. 다음으로 다음 체인으로의 리디렉션이 발생하는지 확인됩니다. 예를 들어 TCP와 같이 패킷에 주소가 없으면 FORWARD 체인으로 전송됩니다. 특정 주소가 있는 경우 INPUT 체인은 의도된 데몬이나 서비스를 따릅니다. 이들로부터의 응답은 OUTPUT과 같은 여러 체인을 거쳐야 합니다. 이 프로세스의 마지막 링크는 POSTROUTING 체인입니다.

이제 체인에 대해 조금 설명합니다. 각각에는 여러 개의 테이블이 포함되어 있습니다. 이름은 반복될 수 있지만 서로 연결되어 있지 않기 때문에 작업에 어떤 영향도 미치지 않습니다.

테이블에는 여러 규칙이 포함되어 있습니다. 기본적으로 규칙은 검사 중인 패키지가 충족해야 하는 특정 조건입니다. 결과에 따라 패키지에 특정 작업이 수행됩니다.

따라서 네트워크의 모든 단계를 통과하는 패킷은 순차적으로 모든 체인을 방문하고 각 체인에서 특정 규칙의 조건을 준수하는지 확인됩니다. 사용자가 테이블을 생성하지 않은 경우 기본 작업인 ACCEPT(앞으로 계속 이동할 수 있음) 또는 DROP(패킷 중지)이 수행됩니다.

사전 설정 체인은 다음 범주로 나뉩니다.

  • 사전 경로 지정. 들어오는 모든 패키지의 초기 처리입니다.
  • 입력. 여기에는 로컬 컴퓨터로 직접 전송되는 패킷이 포함됩니다.
  • 앞으로. 라우팅 테이블을 따르는 "전송 패킷"에 사용됩니다.
  • 산출. 나가는 패킷에 사용됩니다.
  • 포스트라우팅. 모든 체인을 통해 나가는 패킷이 통과하는 마지막 단계입니다.

내장된 체인 외에도 사용자는 자신만의 체인을 생성하거나 삭제할 수 있습니다.

IPTables 규칙 보기 및 관리

앞서 언급했듯이 모든 체인에는 패키지에 대한 특정 조건이 포함되어 있습니다. IPTables 유틸리티는 IPTables 규칙을 보고 관리하는 데 사용됩니다. 각 개별 규칙은 패킷에 대한 일련의 조건과 결과에 따른 그에 대한 조치가 포함된 행입니다.

명령 형식은 다음과 같습니다: iptables [-t 처리 중인 테이블 이름] [기준] [수행된 작업]이라는 명령.

에 포함된 내용은 모두 생략할 수 있습니다. 테이블을 지정하는 매개변수인 경우 필터가 사용됩니다. 특정 이름을 사용하려면 -t 스위치를 추가해야 합니다. 호출된 명령을 사용하면 필요한 작업(예: IPTables 규칙 추가 또는 제거)을 트리거할 수 있습니다. "기준"은 선택이 이루어지는 매개변수를 나타냅니다. 그리고 "action"에는 조건이 만족되면 수행해야 하는 액션이 ​​있습니다.

IPTables 규칙을 생성하고 보기 위한 명령

  • 추가(-A).명령을 사용할 때 필요한 규칙을 추가할 체인과 테이블을 지정합니다. 팀의 가치는 목록의 끝에서 이 작업을 수행한다는 것입니다.
  • 삭제(-D).이름에서 알 수 있듯이 규칙을 삭제합니다. 매개변수로 전체 이름과 할당된 번호를 모두 지정할 수 있습니다.
  • 체인 이름 바꾸기(-E).체인의 이름을 변경합니다. 이 명령은 이전 이름을 지정한 다음 새 이름을 지정합니다.
  • 플러시(-F).특정 테이블의 모든 규칙을 완전히 삭제합니다.
  • 삽입(-I).이 명령은 숫자가 나타내는 위치에 필요한 규칙을 삽입합니다.
  • 목록(-L). Iptables 규칙을 봅니다. 테이블을 지정하지 않으면 기본 필터가 사용됩니다.
  • 정책(-P).지정된 체인의 기본 정책이 사용됩니다.
  • (-R)을 바꿉니다.지정된 번호의 규칙을 필수 규칙으로 변경합니다.
  • 체인 삭제(-X).이 명령은 생성된 모든 체인을 삭제합니다. 사전 설치된 것만 남습니다.
  • 0(-Z).지정된 체인에서 전송된 데이터의 카운터를 재설정합니다.

패킷 선택 매개변수에 대해 조금

세 가지 유형으로 나눌 수 있습니다.

  • 일반 기준. 모든 규칙에 대해 지정할 수 있습니다. 특별한 확장과 모듈의 연결이 필요하지 않으며 어떤 프로토콜이 사용될 것인지에 의존하지 않습니다.
  • 일반적인 기준은 아닙니다.일반 기준을 사용할 때 사용할 수 있습니다.
  • 명백한.이 유형을 사용하려면 넷필터용 특수 플러그인을 연결해야 합니다. 또한 명령에 -m 스위치를 사용해야 합니다.

패킷을 분석할 때 자주 사용되는 매개변수에 대해 조금 이야기해 볼 가치가 있습니다.

  • 프로토콜(-p).프로토콜을 나타냅니다.
  • 소스(-들).이 매개변수는 패킷이 시작된 소스의 IP 주소를 결정합니다. 여러 가지 방법으로 지정할 수 있습니다. 특정 호스트, 주소 또는 전체 서브넷.
  • 대상(-d).패키지 대상 주소. 이전과 마찬가지로 여러 가지 방법으로 설명할 수 있습니다.
  • 인터페이스 내(-i).패키지의 수신 인터페이스를 지정합니다. 주로 NAT 또는 다중 인터페이스가 있는 시스템에 사용됩니다.
  • 외부 인터페이스(-o).나가는 인터페이스.

몇 가지 예

IPTables nat 규칙을 보려면? "iptables -L -t nat" 명령을 사용해야 합니다. 방화벽의 일반 상태("iptables -L -n -v")를 확인하세요. 또한 이 명령을 사용하면 시스템 전체에서 사용 가능한 IPTables 규칙을 볼 수 있습니다. 예를 들어 첫 번째 줄과 두 번째 줄 사이에 "iptables -I INPUT 2 -s 202.54.1.2 -j DROP"과 같이 테이블의 특정 위치에 규칙을 삽입합니다. 그런 다음 "iptables -L INPUT -n --line-numbers"가 추가되었는지 확인하세요.

특정 주소를 차단하려면(예: 12.12.12.12 - "iptables -A INPUT -s 12.12.12.12 -j DROP")

iptables 도움말 - "man iptables". 특정 명령어에 대한 정보가 필요한 경우 “iptables -j DROP -h”를 사용하세요.

마지막으로

잘못된 구성(무시로 인해)으로 인해 네트워크 오류나 전체 오류가 발생할 수 있으므로 IPTables 명령을 주의해서 사용해야 합니다. 따라서 구성하기 전에 설명서와 지침을 자세히 연구하는 것이 좋습니다. 숙련된 사람의 손에 IPTable은 네트워크 연결의 안정적인 보호 장치로 바뀔 수 있습니다. 시스템 관리자는 이 유틸리티를 적극적으로 사용하여 무단 액세스로부터 격리된 연결을 생성합니다.

iptables의 주요 개념은 다음과 같습니다.

    규칙 - 기준, 작업 및 카운터로 구성됩니다. 패킷이 기준을 충족하면 이에 대한 작업이 수행되고 카운터에 계산됩니다. 기준이 없을 수도 있습니다. 그러면 "모든 패킷"이라는 기준이 암시적으로 가정됩니다. 또한 작업을 지정할 필요도 없습니다. 작업이 없으면 규칙은 카운터로만 작동합니다. 각 체인의 규칙은 나타나는 순서대로 실행되므로 순서가 중요합니다.

    • 기준 - 패킷 및/또는 연결의 속성을 분석하고 이 특정 패킷이 현재 규칙의 적용을 받는지 여부를 결정하는 논리적 표현입니다. 기준은 논리적 "AND"로 연결됩니다.

      작업 - 이 규칙의 범위에 해당하는 경우 패킷 및/또는 연결에 대해 수행해야 하는 작업에 대한 설명입니다. 해당 작업은 아래에서 더 자세히 설명됩니다.

      카운터는 특정 규칙의 기준에 속하는 패킷 수를 계산하는 규칙의 구성 요소입니다. 또한 카운터는 해당 패킷의 총 볼륨(바이트)을 고려합니다.

    체인은 순서가 지정된 규칙의 순서입니다. 체인은 커스텀과 베이직으로 나눌 수 있습니다.

    • 베이스 체인은 테이블 초기화 시 기본적으로 생성되는 체인입니다. 각 패킷은 호스트 자체를 위한 것인지, 생성된 것인지 또는 전송 중인 것인지에 따라 할당된 다양한 테이블의 기본 체인 세트를 통과해야 합니다. 또한 기본 체인은 "기본 정책"이 있는 경우 사용자 체인과 다릅니다. 이 작업은 이 체인과 이 체인에서 호출된 체인의 다른 규칙에 의해 처리되지 않은 패킷에 적용됩니다. 베이스 체인 이름은 항상 대문자로 작성됩니다(PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).

      사용자 체인 - 사용자가 생성한 체인입니다. 자체 테이블 내에서만 사용할 수 있습니다. 기본 체인 및 내장 작업과의 혼동을 피하기 위해 이러한 체인에는 대문자 이름을 사용하지 않는 것이 좋습니다.

    테이블은 공통된 기능적 목적으로 통합된 기본 및 사용자 체인의 모음입니다. 테이블 이름(기준 모듈 포함)은 원칙적으로 사용자 체인 이름과 충돌할 수 없으므로 소문자로 작성됩니다. iptables 명령을 호출하면 테이블은 -t table_name 형식으로 지정됩니다. 명시적으로 지정하지 않으면 필터 테이블이 사용됩니다.

구문 분석:

# 덤프 필터 테이블 규칙$ sudo iptables-save -c -t 필터 # 테이블 필터 * 필터 # INPUT, FORWARD, OUTPUT 체인, 해당 정책 및 카운터:입력 승인 [ 19302 :9473669 ] :앞으로 승인 [ 0 :0 ] :출력 승인 [ 5462736 :4247599532 ] # 규칙: "" - 규칙 카운터, "-A INPUT" - 체인, "-i em1 -p tcp -m tcp --dport 22" - 기준, "-j ACCEPT" - 작업[ 17 :1020 ] -A 입력 -i em1 -p tcp -m tcp --dport 22 -j 수락 커밋

건축학

netfilter 시스템에서 패킷은 체인을 통해 전달됩니다. 체인은 순서가 지정된 규칙 목록이며 각 규칙에는 기준과 작업 또는 전환이 포함될 수 있습니다. 패킷이 체인을 통과하면 netfilter 시스템은 패킷이 다음 규칙의 기준을 모두 만족하는지 하나씩 확인하고, 만족할 경우 조치를 수행합니다(규칙에 기준이 없으면 조치를 수행합니다). 규칙을 통과하는 모든 패킷에 대해). 가능한 기준 옵션이 많이 있습니다. 예를 들어, 패킷 헤더가 소스가 192.168.1.1임을 나타내는 경우 패킷은 –source 192.168.1.1 기준과 일치합니다. 가장 간단한 유형의 점프인 –jump는 단순히 패킷을 다른 체인의 시작 부분으로 전달합니다. –jump를 사용하여 작업을 지정할 수도 있습니다. 모든 체인에서 사용할 수 있는 표준 작업은 ACCEPT(건너뛰기), DROP(삭제), QUEUE(분석을 위해 외부 프로그램으로 보내기) 및 RETURN(분석을 위해 이전 체인으로 돌아가기)입니다. 예를 들어, 명령

Iptables -A INPUT --source 192.168.1.1 --jump ACCEPT iptables -A INPUT --jump other_chain

"입력 체인 끝에 다음 규칙을 추가합니다. 192.168.1.1에서 패킷을 건너뛰고 분석을 위해 남은 모든 것을 other_chain으로 보냅니다."를 의미합니다.

쇠사슬

시스템에는 5가지 유형의 표준 체인이 내장되어 있습니다.

    PREROUTING - 들어오는 패킷의 초기 처리용입니다.

    INPUT - 로컬 프로세스(클라이언트 또는 서버)로 직접 주소가 지정된 수신 패킷용입니다.

    FORWARD - 출력으로 전달되는 수신 패킷용(전달된 패킷은 먼저 PREROUTING 체인을 통과한 다음 FORWARD 및 POSTROUTING을 통과합니다).

    OUTPUT - 로컬 프로세스에 의해 생성된 패킷용입니다.

    POSTROUTING - 나가는 패킷의 최종 처리를 위한 것입니다.

iptables 유틸리티를 사용하여 자신만의 체인을 생성하고 삭제할 수도 있습니다.

테이블

체인은 4개의 테이블로 구성됩니다.

    원시(Raw) - 패킷을 상태 감지 시스템으로 전송하기 전에 봅니다. 예를 들어 상태 감지 시스템에서 처리하면 안 되는 패킷을 표시하는 데에는 거의 사용되지 않습니다. 이를 위해 규칙은 NOTRACK 작업을 지정합니다. PREROUTING 및 OUTPUT 체인을 포함합니다.

    Mangle - IP 패킷(일반적으로 헤더)을 수정하기 위한 규칙이 포함되어 있습니다. 무엇보다도 TTL(Time to Live), TOS(서비스 유형) 및 MARK 작업(TTL 및 TOS 필드 변경 및 패킷 마커 변경)을 지원합니다. 거의 필요하지 않으며 위험할 수 있습니다. 5개의 표준 체인이 모두 포함되어 있습니다.

    Nat - 상태 감지 시스템에 따라 새 연결을 생성하는 패킷만 봅니다. DNAT, SNAT, MASQUERADE, REDIRECT 작업을 지원합니다. PREROUTING, OUTPUT 및 POSTROUTING 체인을 포함합니다.

    필터 - 테이블 이름이 지정되지 않은 경우 기본적으로 사용되는 기본 테이블입니다. INPUT, FORWARD 및 OUTPUT 체인을 포함합니다.

이름은 같지만 테이블이 다른 체인은 완전히 독립적인 개체입니다. 예를 들어 원시 PREROUTING 및 맹글 PREROUTING에는 일반적으로 다른 규칙 세트가 포함됩니다. 패킷은 먼저 원시 PREROUTING 체인을 통과한 다음 맹글 PREROUTING 체인을 통과합니다.

상태

netfilter 시스템에서 상태 메커니즘을 통과하는 각 패킷은 네 가지 가능한 상태 중 하나를 가질 수 있습니다.

    NEW - 패키지가 새 세션을 엽니다. 전형적인 예는 SYN 플래그가 있는 TCP 패킷입니다.

    ESTABLISHED - 패킷이 이미 존재하는 세션의 일부입니다.

    RELATED - 패키지가 이미 열려 있는 세션과 연결된 새 세션을 엽니다. 예를 들어, 수동 FTP 세션 중에 클라이언트는 서버의 포트 21에 연결하고, 서버는 클라이언트에게 무작위로 선택된 두 번째 포트의 번호를 클라이언트에게 알려줍니다. 그런 다음 클라이언트는 두 번째 포트에 연결하여 파일을 전송합니다. 이 경우 두 번째 세션(두 번째 포트의 파일 전송)은 기존 세션(포트 21에 대한 원래 연결)과 연결됩니다.

    INVALID - 기타 모든 패키지.

테이블과 체인의 통과 다이어그램

테이블과 체인의 통과에 대한 단순화된 다이어그램:

세부 다이어그램:

기본 구성

다음은 기본 정적 iptables 구성의 예입니다. 이러한 구성을 저장하고 로드할 때 Fail2ban과 같은 다른 서비스에서 해당 구성이 변경될 가능성을 고려해야 합니다. 또한 IPv6 주소 지정을 사용하는 경우 IPv6에 대한 구성은 IPv4와 독립적으로 수행되어야 합니다.

IPv4

sudo iptables-저장

iptables 규칙 덤프를 사용하여 스크립트를 만듭니다.

sudo nano /etc/network/if-up.d/iptables-rules

다음 코드를 복사하세요.

#!/sbin/iptables-restore -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m conntrack -- ctstate 관련, 설정됨 -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited #-A OUTPUT -p icmp -j ACCEPT #-A OUTPUT -o lo - j 수락 #-A OUTPUT -j REJECT --icmp-host-금지와 함께 거부저지르다

iptables-save를 고려하여 필요한 규칙을 보완합니다.

sudo chmod +x / etc/ network/ if-up.d/ iptables-rules sudo / etc/ network/ if-up.d/ iptables-rules

IPv6

현재 구성 보기:

sudo ip6tables-저장

ip6tables 규칙 덤프를 사용하여 스크립트를 만듭니다.

sudo nano /etc/network/if-up.d/ip6tables-rules

다음 코드를 복사하세요.

#!/sbin/ip6tables-복원 # 필터 테이블과 그 체인* 필터:INPUT ACCEPT [ 0:0 ] :FORWARD ACCEPT [ 0:0 ] :OUTPUT ACCEPT [ 0:0 ] # 연결되고 설정된 연결을 허용합니다.-A 입력 -m conntrack --ctstate 관련, 설정됨 -j 수락 # 서비스 ICMP 트래픽 허용-A 입력 -p ipv6-icmp -j 수락 # 루프백 인터페이스에 신뢰할 수 있는 트래픽을 허용합니다.-A 입력 -i lo -j 수락 # INPUT 체인에 대한 추가 규칙을 여기에 삽입할 수 있습니다. # INPUT에 대한 다른 모든 것을 비활성화합니다.-A 입력 -j REJECT --icmp6-adm-금지된 거부 # FORWARD 및 OUTPUT 체인 규칙의 순서와 의미는 INPUT과 유사합니다.-A FORWARD -m conntrack --ctstate 관련, 설정됨 -j ACCEPT -A FORWARD -p ipv6-icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited # OUTPUT 체인을 필터링하는 것은 강력히 권장되지 않습니다. #-A 출력 -m conntrack --ctstate 관련, 설정됨 -j 수락 #-A 출력 -p ipv6-icmp -j 수락#-A 출력 -o lo -j 수락 #-A OUTPUT -j REJECT --icmp6-adm-금지와 함께 거부저지르다

ip6tables-save를 고려하여 필요한 규칙을 보완합니다.

저장 및 닫기: Ctrl + O, Enter, Ctrl + X

스크립트를 실행 가능하게 만들고 iptables 규칙을 로드합니다.

sudo chmod +x / etc/ network/ if-up.d/ ip6tables-rules sudo / etc/ network/ if-up.d/ ip6tables-rules

추가 규칙

다음은 비교적 일반적으로 사용되는 몇 가지 규칙입니다. INPUT/OUTPUT 체인은 로컬 트래픽을 필터링하는 데 사용됩니다. 대중교통 트래픽의 경우 FORWARD 체인을 사용해야 합니다.

원격 액세스

# 원격.ssh -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT # 원격.rdp -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 3389 -j 승인 # 원격.vnc -A 입력 -p tcp -m conntrack --ctstate NEW -m tcp --dport 5900 -j 승인

웹 및 파일 서비스

# web.http, web.https -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 21 -j ACCEPT

메일 및 인스턴트 메시지

# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 110,995 -j ACCEPT # mail.imap, mail.imaps -A INPUT -p tcp -m conntrack -- ctstate NEW -m multiport --dports 143 ,993 -j ACCEPT # mail.smtp, mail.smtps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 25 ,465 -j ACCEPT # im. xmpp -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 5222 ,5223 -j ACCEPT # im.icq.oscar -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp -- dport 5190 -j 수락

네트워크 서비스

# network.openvpn.vpn -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 1194 -j ACCEPT # network.squid.proxy -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 3128 -j ACCEPT # network.dns -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 53 -j ACCEPT -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 53 -j ACCEPT # network.ntp -A INPUT -p udp -m conntrack --ctstate NEW -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 69 -j ACCEPT # network.dhserver.dhcp.discover-요청-A 입력 -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j ACCEPT # network.dhclient.dhcp.discover-요청 #-A 출력 -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j 수락 # 네트워크.dhserver.dhcp.offer-ack #-A 출력 -p udp -m conntrack --ctstate NEW -m udp --sport 67 --dport 68 -j 수락

테스트 및 디버깅

IPv4 및 IPv6의 현재 구성을 확인합니다.

sudo iptables-저장 sudo ip6tables-저장

벌채 반출

트레이싱

커널 모듈

로드된 모듈 보기:

lsmod | grep -E "^ip|^nf" | 종류

추가 모듈을 로드하려면 자동 완성 기능을 사용하는 것이 편리합니다. 2x Tab

sudo modprobe nf sudo modprobe 모듈-로드.d

Linux에 방화벽을 설정하기 위한 솔루션은 여러 가지가 있지만 그 중 대부분은 실제로 iptables 설정을 위한 프런트엔드일 뿐이며 일부는 완전히 성공하지 못했습니다. 원칙적으로는 방화벽을 빠르게 설정할 수 있는 것이 좋지만, 일단 iptables에 익숙해지면 더 빠르고 세밀하게 설정할 수 있게 됩니다. iptables 미세 조정은 일반적으로 프런트엔드에서 사용할 수 없습니다.

시작하자. 간단한 것부터 시작해 구성을 복잡하게 만들어 보겠습니다. 여기 사이트에는 iptables 규칙 자동 로딩에 대한 기사가 이미 있으므로 지금은 규칙 로딩을 고려하지 않고 규칙 자체에 중점을 둘 것입니다. 방화벽은 항상 루트 계정으로 구성됩니다.

네트워크 연결 시나리오

방화벽을 설정하기 전에 시스템 운영 시 어떤 네트워크 연결이 어떻게 이루어져야 하는지 정확하게 이해해야 모든 서비스가 정상적으로 작동할 수 있습니다. 당사 서버와 다른 서버 모두에서 실행되는 네트워크 서비스 운영에 대한 그림이 더 정확할수록 시스템을 더 세밀하게 구성할 수 있습니다. 따라서 항상 모든 것이 어떻게 작동해야 하는지에 대한 시나리오를 먼저 설명한 다음 방화벽 설정을 시작하는 것이 좋습니다. 스크립트는 모든 텍스트 편집기에서 작성할 수 있습니다. 먼저 서버와 함께 작동하는 모든 외부 서비스를 설명한 다음 서버에서 실행되는 모든 서비스를 설명합니다. 이것이 왜 필요한가요? 기술적 부분을 탐구하지 않고 작업 프로세스 자체를 정확하게 표현합니다. 가장 정확한 스크립트를 작성한 후 방화벽 설정을 시작할 수 있습니다. 스크립트 설명은 다음과 같아야 합니다.

1) 모든 사용자가 사이트를 볼 수 있습니다. 기본적으로 사이트는 러시아어로 되어 있습니다.
2) 사용자가 주소에서 온 경우<список-адресов-или-маска-подсети>, 그러면 사이트가 우크라이나어로 표시되어야 합니다. 예를 들어, 이는 도메인 이름이 하나이고 러시아어 또는 우크라이나어로 표시되고 러시아 및 우크라이나에 대한 자체 판매 세트가 있는 온라인 상점이 될 것입니다. 우리는 단순히 두 개의 사이트를 갖게 될 것입니다. 하나는 러시아어로, 다른 하나는 우크라이나어로, 클라이언트가 온 주소에 따라 그가 갈 사이트가 결정됩니다. 물론 실제로는 이러한 문제가 다르게 해결됩니다. 또한 중국어 댓글의 지속적인 스팸으로 인해 중국 주소에서 사이트를 보는 것을 허용할 수 없습니다.
3) 우편물은 사무실에서 접근할 수 있어야 하며, 다른 곳에서는 접근할 수 없어야 합니다.
4) 외부에서 VPN 연결이 가능해야 합니다.
5) 우리는 신뢰할 수 있는 몇 개의 DNS 서버만 사용할 수 있습니다. 다른 모든 DNS 서버는 사용할 수 없습니다.
6) …..

등등. 간단한 예시로는 이 정도면 충분하다고 생각합니다. 요점은 네트워크 상호 작용의 그림을 최대한 정확하게 파악하는 것입니다. 모든 스크립트에는 각 연결에 대한 포트, 프로토콜, 소스 주소, 대상 주소를 포함하여 연결 설명을 작성하기 전에 사용자 및 서비스와의 상호 작용을 공식화하는 단 하나의 목표가 있습니다.

iptables 설정: 가장 간단한 구성

전투 서버에 관해 이야기하면 두 서버의 방화벽 설정은 해당 서버가 수행하는 작업에 따라 크게 달라질 수 있습니다. 따라서 모든 서버에 방화벽을 설정할 때 사용할 수 있는 일반적인 원칙을 설명하려고 합니다. 이는 추가 사용자 정의를 위한 기초일 뿐입니다.

우선 로드된 규칙을 지워야 합니다.

iptables -F 입력 iptables -F 출력 iptables -F 앞으로

INPUT, OUTPUT, FORWARD - 패킷이 인터페이스에서 인터페이스로 흐르고, 들어오고, 나가고 전달되는 세 가지 주요 체인입니다.

그런 다음 기본 정책을 설정해야 합니다. ACCEPT와 DROP, 패킷 수락 여부 중 두 가지만 있습니다. 프로덕션 서버의 경우 항상 DROP을 선택한 다음 필요한 모든 항목을 열어야 합니다.

이러한 정책을 설정하려면 먼저 SSH를 통한 연결을 허용해야 합니다. 표준 포트를 변경하지 않았다고 가정합니다(일반적으로 SSH 서버 설치 직후 프로덕션 서버에서 수행해야 함).

Iptables -t 필터 -A 입력 -p tcp -m tcp --dport 22 -j 수락

그런 다음 기본 정책 변경을 시작할 수 있습니다.

Iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP

OUTPUT 체인의 경우 현재는 나가는 연결을 허용하는 기본 ACCEPT 정책을 그대로 둘 수 있습니다. 들어오는 연결을 금지하는 경우 INPUT 체인을 설정한 후 이 정책으로 전환할 수 있습니다. 많은 서버에서는 INPUT 체인을 올바르게 구성하는 것만으로도 충분하지만 나중에 보다 엄격한 구성을 위해 OUTPUT 구성도 살펴보겠습니다.

그래서. 현재로서는 들어오는 연결을 위해 SSH 서버 포트만 열려 있습니다. 다른 모든 포트에서는 연결이 허용되지 않습니다. 이제 다른 서비스가 서버에서 실행 중인 경우 해당 포트에 대한 수신 연결을 추가해야 합니다.

Iptables -t 필터 -A 입력 -p tcp -m tcp --dport 25 -j 수락

DNS(일반적으로 UDP를 허용하는 것으로 충분하지만 TCP를 추가할 수도 있음):

Iptables -t 필터 -A INPUT -p udp -m udp --dport 53 -j ACCEPT

Iptables -t 필터 -A 입력 -p tcp -m tcp --dport 80 -j 수락

Iptables -t 필터 -A 입력 -p tcp -m tcp --dport 110 -j 수락

Iptables -t 필터 -A 입력 -p tcp -m tcp --dport 443 -j 수락

그러나 그것이 전부는 아닙니다. 포트가 열려 있고 외부에서 서비스에 액세스할 수 있지만 메일이 작동하지 않고 도메인 이름이 확인되지 않습니다. 사실 DNS 서버에 쿼리할 때 요청은 다른 메일 서버에 대한 연결과 마찬가지로 권한이 없는 포트 중에서 임의의 사용 가능한 포트에서 전송됩니다. 그리고 이러한 서비스는 동일한 포트로 응답을 보냅니다. 그리고 아시다시피 이 항구는 우리에게 폐쇄되었습니다. 이 포트를 열 수 있지만 나가는 연결이 어느 포트에서 나올지 알 수 없습니다. 따라서 가능한 가장 간단한 작업을 수행할 수 있습니다. 즉, 원격 컴퓨터의 특정 포트로부터의 연결을 허용하는 것입니다.

Iptables -t 필터 -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT

Iptables -t 필터 -A INPUT -p udp -m udp --sport 53 -j ACCEPT

이 두 규칙은 포트 25/tcp 및 53/udp에서 들어오는 연결을 허용하므로 적절한 프로토콜이 있는 패킷이 이 포트에서 도착하면 허용됩니다. 작동에 필요한 시스템, 소프트웨어 또는 설치 패키지를 업데이트하려는 경우 원격 시스템의 포트 80에서의 연결을 허용해야 합니다.

이제 가장 간단한 iptables 구성이 준비되었습니다.

테이블에 규칙을 입력한 후에는 저장해야 합니다. 이를 위해 예를 들어 스크립트를 사용할 수 있습니다.

연결 소스 처리

계속하세요. 전체 인터넷이 아닌 특정 IP 주소를 사용하는 특정 시스템과의 특정 포트에 대한 연결이 필요합니다. 따라서 패킷 소스 주소를 규칙에 추가하면 규칙을 약간 복잡하게 만들 수 있습니다.

Iptables -t 필터 -A INPUT -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

이 규칙을 사용하면 주소가 123.123.123.123인 소스에서만 TCP를 통해 포트 22에서 패킷을 수신할 수 있습니다. 이는 "-s" 매개변수(소스, 소스)로 표시됩니다. 이렇게 하면 SSH를 통한 서버 연결을 하나의 특정 IP 주소로 제한하거나, 특정 IP 주소 대신 연결이 허용되는 서브넷 마스크를 지정하는 경우 특정 서브넷으로 제한할 수 있습니다.

서버가 메일을 보내는 데 항상 동일한 메일 게이트웨이를 사용하는 경우, 예를 들어 이 게이트웨이를 소스로 지정하여 포트 25/tcp로부터의 연결을 제한할 수 있습니다.

특정 네트워크 인터페이스 또는 IP 주소에 대한 규칙

서버에는 여러 개의 네트워크 인터페이스가 있을 수 있습니다. 일반적으로 외부 네트워크 인터페이스와 적절한 패킷 리디렉션이 없으면 외부에서 액세스할 수 없는 소위 루프백 인터페이스 127.0.0.1이라는 두 가지 이상이 있습니다. 또한 네트워크 인터페이스 별칭이나 다른 물리적 네트워크 인터페이스와 공유되는 다른 IP 주소가 하나 이상 있을 수도 있습니다. 그리고 각 IP 주소 또는 네트워크 인터페이스는 특정 서비스를 실행할 수 있습니다. 예를 들어, 하나에는 Apache 웹 서버가 있고 다른 하나에는 바인딩9 도메인 이름 서비스 서버가 있습니다. 그리고 해당 네트워크 인터페이스를 지정하지 않고 특정 포트에 대한 연결을 허용하면 모든 인터페이스에서 해당 포트에 대한 액세스가 허용됩니다. 따라서 권한 범위를 좁히는 방법에는 두 가지가 있습니다.

첫 번째 방법은 액세스를 허용할 IP 주소를 지정하는 것입니다.

Iptables -t 필터 -A 입력 -d 234.234.234.234 -p tcp -m tcp --dport 22 -j 수락

이 예에서는 iptables 규칙에서 대상 주소를 사용하는 방법을 보여줍니다. 소스 주소를 사용할 수도 있습니다.

Iptables -t 필터 -A INPUT -s 123.123.123.123 -d 234.234.234.234 -p tcp -m tcp --dport 22 -j 수락

이 예에서는 이미 두 개의 주소에 대한 액세스를 제한했습니다. 이를 통해 주소 123.123.123.123에서 SSH를 통해 234.234.234.234의 서버에 액세스할 수 있으며 다른 주소에서는 액세스할 수 없습니다.

두 번째 방법은 네트워크 인터페이스의 이름을 지정하는 것입니다. 이 방법은 외부 주소가 변경될 수 있는 경우에도 적용 가능합니다. 네트워크 인터페이스의 주소가 변경되면 이전 옵션을 사용하면 서버에 액세스할 수 없게 됩니다. 인터페이스 이름은 다음과 같이 지정됩니다.

Iptables -t 필터 -A INPUT -i eth0 -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

이 옵션은 eth0 네트워크 인터페이스에서 SSH 액세스를 허용합니다. 다른 네트워크 인터페이스에서는 SSH 액세스를 사용할 수 없습니다.

방금 살펴본 모든 내용은 시작에 불과하며 다음 부분은 계속됩니다...



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: