> 시스템 튜토리얼 > 리눅스 > CentOS에서 iptables를 사용하는 방법에 대한 심층 분석

CentOS에서 iptables를 사용하는 방법에 대한 심층 분석

WBOY
풀어 주다: 2024-01-11 17:27:13
앞으로
720명이 탐색했습니다.

1: 서문

방화벽은 솔직하게 말하면 Linux에서 액세스 제어 기능을 구현하는 데 사용되며 하드웨어 방화벽과 소프트웨어 방화벽의 두 가지 유형으로 나뉩니다. 어떤 네트워크에 있든 방화벽이 작동하는 장소는 네트워크 가장자리에 있어야 합니다. 우리의 임무는 방화벽의 작동 방식을 정의하여 네트워크에 들어오고 나가는 IP와 데이터를 감지할 수 있는 방화벽의 정책 및 규칙입니다.

현재 시장에 나와 있는 더 일반적인 방화벽에는 네트워크 계층 방화벽이라고 하는 계층 3 및 계층 4 방화벽과 실제로 프록시 계층의 게이트웨이인 계층 7 방화벽이 포함됩니다.

TCP/IP의 7계층 모델의 경우 세 번째 계층이 네트워크 계층이고 3계층 방화벽이 이 계층에서 소스 주소와 대상 주소를 감지한다는 것을 알고 있습니다. 그러나 7계층 방화벽의 경우 소스 포트나 대상 포트, 소스 주소 또는 대상 주소가 무엇이든 상관없이 모든 사항이 확인됩니다. 따라서 설계 원칙상 7계층 방화벽이 더 안전하지만 효율성이 떨어지는 결과를 낳습니다. 따라서 시중에 나와 있는 일반적인 방화벽 솔루션은 이 두 가지를 조합한 것입니다. 그리고 우리 모두는 방화벽에 의해 제어되는 포트를 통해 액세스해야 하기 때문에 방화벽의 효율성은 사용자가 액세스할 수 있는 데이터 양에 대한 가장 중요한 제어가 되었습니다. 구성이 잘못되면 트래픽에 병목 현상이 발생할 수도 있습니다.

2: iptables의 역사와 작동 원리

1. iptables 개발:

iptables의 전신은 ipfirewall(커널 1.x 시대)이라고 합니다. 이는 저자가 freeBSD에서 이식한 간단한 액세스 제어 도구이며 커널에서 작업하여 데이터 패킷을 감지할 수 있습니다. 그러나 ipfirewall의 작동 기능은 극히 제한적입니다(규칙이 실행될 수 있으려면 모든 규칙을 커널에 넣어야 하며, 일반적으로 커널에 넣는 것은 매우 어렵습니다). 커널이 2. 접근 제어 기능으로 개발되었을 때.

사용자 공간에서 작동하고 규칙을 정의하는 도구이며 방화벽 자체는 아닙니다. 그들이 정의한 규칙은 커널 공간의 netfilter로 읽을 수 있으며 방화벽이 작동하도록 허용합니다. 커널에 삽입되는 위치는 tcp/ip 프로토콜 스택이 통과하는 특정 위치여야 합니다. 이 tcp/ip 프로토콜 스택이 통과해야 하고 읽기 규칙을 구현할 수 있는 곳을 netfilter(네트워크 필터)

라고 합니다.

저자는 커널 공간에서 총 5개의 위치를 ​​선택했으며,

1. 커널 공간에서: 하나의 네트워크 인터페이스에서 들어오고 다른 네트워크 인터페이스로 이동

2. 데이터 패킷은 커널에서 사용자 공간으로 흐릅니다.

3. 데이터 패킷은 사용자 공간에서 흘러나옵니다

4. 이 머신의 외부 네트워크 인터페이스에 들어가거나 나가세요

5. 로컬 네트워크 인터페이스에 들어가거나 나가세요

2. iptables의 작동 메커니즘

위 전개를 통해 작성자가 통제 장소로 5곳을 선택한 것으로 알고 있는데, 실제로 처음 3곳은 기본적으로 경로를 완전히 차단할 수 있는데 왜 입구와 출구에 설정해 두었는지 아시나요? 레벨을 통과한 후에도 여전히 안에 갇혀 있다면? 데이터 패킷에 대한 라우팅 결정이 아직 이루어지지 않았고 데이터가 어디로 가는지 알 수 없기 때문에 가져오기 및 내보내기 시 데이터 필터링을 구현할 방법이 없습니다. 따라서 커널 공간에서의 포워딩 레벨, 사용자 공간에 들어가기 위한 레벨, 사용자 공간에서 나가기 위한 레벨을 설정하는 것이 필요하다. 그렇다면 쓸모가 없다면 왜 배치합니까? NAT 및 DNAT를 수행할 때 라우팅 전에 대상 주소 변환이 변환되어야 하기 때문입니다. 따라서 외부 네트워크의 인터페이스에 체크포인트를 설정한 다음 내부 네트워크의 인터페이스에 체크포인트를 설정해야 합니다. ​ ​

이 5가지 위치는 5가지 후크 기능, 5가지 규칙 체인이라고도 합니다.

1.라우팅 전(라우팅 전)

2.INPUT(패킷 흐름 항목)

3.FORWARD (전방관리카드)

4.OUTPUT(데이터 패킷 내보내기)

5.포스트라우팅(라우팅 후)

이것은 NetFilter가 지정한 5개의 규칙 체인입니다. 이 시스템을 통과하는 모든 데이터 패킷은 반드시 이 5개의 체인 중 하나를 통과합니다. ​

3. 방화벽 전략

방화벽 정책은 일반적으로 두 가지 유형으로 나뉘는데, 하나는 "통과" 정책이라고 하고, 다른 하나는 "차단" 정책이라고 합니다. 통과 정책에서는 기본적으로 문이 닫혀 있으며, 누가 할 수 있는지 정의해야 합니다. 입력하다. 차단 전략은 문은 열려 있지만 신원 인증이 있어야 하고, 그렇지 않으면 들어갈 수 없다는 것입니다. 그래서 우리는 들어오는 사람은 들어오게 하고 나가는 사람은 나가게 한다는 것을 정의해야 합니다. 따라서 열린다는 것은 모두를 허용하는 것을 의미하고 차단하는 것은 선택하는 것을 의미합니다. 정책을 정의할 때 데이터 패킷에서 허용되거나 허용되지 않는 정책 정의, 필터 기능 및 주소 변환 기능을 정의하는 nat 옵션을 포함하여 여러 기능을 각각 정의해야 합니다. 이러한 기능이 교대로 작동할 수 있도록 다양한 작동 기능과 처리 방법을 정의하고 구별하기 위해 "테이블"의 정의를 공식화했습니다.

현재 다음 세 가지 기능을 사용합니다:

1.filter는 허용되는 것과 허용되지 않는 것을 정의합니다

2.nat는 주소 변환을 정의합니다

3.mangle 기능: 메시지의 원본 데이터를 수정합니다

TTL을 수정하기 위해 메시지의 원본 데이터를 수정합니다. 데이터 패킷의 메타데이터를 분해하고 내부 내용을 표시/수정하는 것이 가능합니다. 방화벽 태그는 실제로 mangle로 구현됩니다.

작은 확장:

필터의 경우 일반적으로 INPUT, FORWARD, OUTPUT의 3개 체인에서만 수행할 수 있습니다

NAT의 경우 일반적으로 3개 체인에서만 수행할 수 있습니다: PREROUTING, OUTPUT, POSTROUTING

Mangle은 5가지 체인을 모두 수행할 수 있습니다: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

iptables/netfilter(이 소프트웨어)는 사용자 공간에서 작동하며 규칙을 적용할 수 있습니다. 이는 서비스 자체가 아니며 규칙이 즉시 적용됩니다. 그리고 우리의 iptables는 이제 시작하고 중지할 수 있는 서비스로 만들어졌습니다. 시작되면 규칙이 즉시 적용되고, 중지되면 규칙이 취소됩니다.

iptables는 자신만의 체인 정의도 지원합니다. 그러나 정의한 체인은 특정 체인과 연결되어야 합니다. 레벨 설정에서 데이터가 있을 때 특정 체인으로 이동하여 처리하고, 해당 체인이 처리된 후 돌아오도록 지정합니다. 그런 다음 특정 체인을 계속해서 확인하세요.

참고: 규칙의 순서는 매우 중요합니다. 규칙이 엄격할수록 규칙을 확인할 때 위에서 아래로 확인해야 합니다.

셋. 규칙 작성 방법:

iptables가 규칙을 정의하는 방식은 더 복잡합니다.

형식: iptables [-t table] COMMAND chain CRETIRIA -j ACTION

-t 테이블: 3필터 nat mangle

COMMAND: 규칙 관리 방법 정의

체인: 다음 규칙이 작동할 체인을 지정합니다. 이는 전략을 정의할 때 생략할 수 있습니다

CRETIRIA:일치 기준 지정

-j 액션: 처리 방법을 지정하세요

예: 172.16.0.0/24에는 접근이 허용되지 않습니다.

iptables -t 필터 -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

물론, 더 철저하게 거절하고 싶다면:

iptables -t 필터 -R 입력 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

iptables -L -n -v #정의된 규칙의 자세한 정보 보기

4: 자세한 설명 COMMAND:

1.체인 관리 명령(즉시 적용)

-P: 기본 정책을 설정합니다(기본 문이 닫혀 있는지 열려 있는지 설정)

일반적으로 기본 전략은 두 가지뿐입니다

iptables -P INPUT (DROP|ACCEPT) 기본값은 꺼짐/기본값은 켜짐

예:

iptables -P INPUT DROP 기본 규칙을 거부합니다. 그리고 어떤 동작도 정의되어 있지 않으므로 Xshell 연결을 포함한 외부 연결 및 원격 연결에 대한 모든 규칙이 거부됩니다.

-F: FLASH, 룰 체인 클리어(각 체인의 관리 권한 참고)

iptables -t nat -F 사전 예약 중

iptables -t nat -F는 nat 테이블의 모든 체인을 지웁니다

-N:NEW는 사용자가 새로운 체인을 생성할 수 있도록 지원합니다

iptables -N inbound_tcp_web은 웹 확인을 위해 tcp 테이블에 연결되어 있음을 나타냅니다.

-X: 사용자 정의 빈 링크를 삭제하는 데 사용됩니다

사용방법은 -N과 동일하지만, 삭제 전 내부 링크를 지워야 합니다

-E: 체인 이름을 바꾸는 데 사용되며 주로 사용자 정의 체인의 이름을 바꾸는 데 사용됩니다

-E 옛이름 새이름

-Z: 체인과 체인의 기본 규칙 카운터를 지웁니다(두 개의 카운터가 있으며 일치하는 패킷과 바이트 수)

iptables -Z : 지우기

2. 규칙 관리 명령

-A: 추가, 현재 체인 끝에 규칙 추가

-I num : 삽입, 현재 규칙을 어떤 숫자에 삽입합니다.

-I 3: 세 번째 항목으로 삽입

-R num: 대체/수정할 규칙을 재생합니다

형식: iptables -R 3…………

-D 번호: 삭제, 삭제할 규칙을 명확하게 지정

3. 관리 명령어 “-L” 보기

하위 명령 추가

-n: IP를 숫자 형식으로 표시합니다. -n을 추가하지 않으면 IP가 호스트 이름으로 역분석됩니다.

-v: 자세한 정보 표시

-vv

-vvv: 더 자세히, 더 자세히

-x: 단위 변환 없이 카운터에 정확한 값을 표시합니다

--line-numbers: 규칙의 줄 번호를 표시합니다

-t nat: 모든 레벨에 대한 정보를 표시합니다

다섯: 매칭기준에 대한 자세한 설명

1. 범용 매칭: 소스 주소와 타겟 주소 매칭

-s: 일치시킬 소스 주소를 지정하세요. 호스트 이름은 여기서 지정할 수 없습니다. IP

여야 합니다.

IP/마스크 0.0.0.0/0.0.0.0

주소는 반전될 수 있습니다. 어떤 IP를 제외하는지 표시하려면 "!"를 추가하세요

-d: 일치하는 대상 주소를 나타냅니다

-p: 프로토콜을 일치시키는 데 사용됩니다(여기에는 일반적으로 TCP/UDP/ICMP의 3가지 프로토콜이 있습니다)

-i eth0: 이 네트워크 카드에서 들어오는 데이터

Inflow는 일반적으로 INPUT 및 PREROUTING에 사용됩니다

-o eth0: 이 네트워크 카드에서 흘러나오는 데이터

아웃플로우는 일반적으로 OUTPUT 및 POSTROUTING에 있습니다.

2.확장 매칭

2.1 암시적 확장: 프로토콜 확장

-p tcp: TCP 프로토콜의 확장입니다. 확장 프로그램에는 일반적으로 세 가지 유형이 있습니다

--dport XX-XX: 대상 포트를 지정합니다. 연속되지 않은 여러 포트는 지정할 수 없습니다(예:

).

--dport 21 또는 --dport 21-23(21,22,23을 의미)

--스포츠: 소스 포트 지정

--tcp-fiags: TCP 플래그(SYN, ACK, FIN, PSH, RST, URG)

이를 위해서는 일반적으로 두 가지 매개변수가 따라야 합니다:

1. 플래그 확인

2. 1이어야 하는 플래그 비트

--tcpflags syn,ack,fin,rst syn = --syn

이 4비트를 확인한다는 의미이며, syn은 이 4비트 중 1이어야 하고 나머지는 0이어야 합니다. 따라서 이는 3방향 핸드셰이크의 첫 번째 패킷을 감지하는 데 사용된다는 의미입니다. SYN이 1인 첫 번째 패킷과 구체적으로 일치하는 이러한 종류의 패킷에는 --syn

이라는 약어도 있습니다.

-p udp: UDP 프로토콜의 확장

-dport-

-스포츠-

-p icmp: icmp 데이터 메시지 확장

            --icmp 유형:

echo-request(에코 요청), 일반적으로 8로 표시

그래서 --icmp-type 8은 요청 에코 패킷과 일치합니다

echo-reply(응답 데이터 패킷)는 일반적으로 0

으로 표시됩니다.

2.2 명시적 확장(-m)

다양한 모듈 확장

-m multiport: 다중 포트 확장 활성화를 나타냅니다

그 후에는 --dports 21,23,80

등을 활성화할 수 있습니다.

Six:자세한 설명-j ACTION 일반적으로 사용되는 액션:

DROP: 조용히 폐기

일반적으로 우리는 신원을 숨기고 연결 목록을 숨기기 위해 DROP을 사용합니다

REJECT: 명시적으로 거부

수락: 수락

custom_chain: 맞춤형 체인으로 전환

DNAT

SNAT

MASQUERADE: 소스 주소 위장

REDIRECT: 리디렉션: 주로 포트 리디렉션을 구현하는 데 사용됩니다

MARK: 방화벽 표시

RETURN:반품

원래 규칙 체인으로 돌아가려면 커스텀 체인이 실행된 후 return을 사용하세요.

연습 문제 1:

172.16.0.0/16 네트워크 세그먼트에서 오는 한, 내 로컬 172.16.100.1

의 SSHD 서비스에 액세스하는 것이 허용됩니다.

분석: 우선 허용 테이블에 정의해야 합니다. NAT 주소 변환 등을 수행할 필요가 없으므로 SSHD 서비스를 확인하십시오. 포트 22에서 처리 메커니즘은 허용 여부에 따라 두 가지 규칙이 필요합니다. 또는 거부합니다. 로컬 서비스에 액세스하려면 INPUT 체인에서 정의한 다음 OUTPUT을 정의하는 것이 가장 좋습니다. (세션의 초기 종료가 먼저 정의됩니다.) 따라서 추가된 규칙은 다음과 같습니다.

정의 제공: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT

정의됨: iptables -t 필터 -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT

기본 정책을 DROP으로 변경:

iptables -P INPUT DROP

iptables -P 출력 드롭

iptables -P FORWARD DROP

세븐: 상태 감지: 은 세션 간 연결 관계를 감지하는 데 사용되는 명시적 확장으로, 감지를 통해 세션 간 기능 확장을 구현할 수 있습니다.

상태 감지란 무엇인가요? 전체 TCP 프로토콜에 대해 3방향 핸드셰이크에서는 첫 번째 핸드셰이크를 NEW 연결이라고 합니다. 두 번째 핸드셰이크부터는 ack가 1이 되며 두 번째는 정상적인 데이터 전송입니다. tcp의 세 번째 핸드셰이크를 확립된 연결(ESTABLISHED)이라고 합니다. 또한 SYN=1 ACK=1 RST=1과 같은 매우 이상한 상태도 있습니다. 우리가 인식할 수 없는 이런 종류의 경우에는 모두 INVALID라고 부릅니다. 인식할 수 없습니다. 네 번째 유형도 있는데, 이는 FTP의 고대 기능입니다. 포트 21과 20은 둘 다 연결되어 있습니다.

총 4개의 상태가 있습니다:

새로운

설립됨

관련

잘못되었습니다

이제 방금 연습 질문에 상태 감지를 추가할 수 있습니다. 예를 들어 NEW 및 ESTABLISHED 상태의 항목만 들어올 수 있고 ESTABLISHED 상태의 항목만 나갈 수 있습니다. 이는 보다 일반적인 리바운드 트로이 목마에 대한 좋은 제어 메커니즘을 제공할 수 있습니다.​

연습 문제 확장:

들어오는 사람은 외출 허가를 거부하고, 들어오는 사람은 ESTABLISHED만 들어오도록 허용하고, 나가는 사람은 ESTABLISHED만 외출을 허용합니다. 기본 규칙은 모두 거부를 사용합니다

iptables -L -n --line-number: 이전 규칙이 위치한 줄 보기

입력 다시 쓰기

iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW, ESTABLISHED -j ACCEPT

iptables -R 출력 1 -m state --state ESTABLISHED -j ACCEPT

이번에 또 다른 포트 80을 해제하고 싶다면 어떻게 해제하면 되나요?

iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW, ESTABLISHED -j ACCEPT

iptables -R 입력 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT

연습 문제 2:

우리가 다른 사람에게 핑을 허용하는데 다른 사람이 우리에게 핑을 할 수 없다면 어떻게 될까요?

분석: 핑 프로토콜의 경우 들어오는 것은 8(핑)이고 나가는 것은 0(응답)입니다. 우리의 목표를 달성하려면 나가는 데 8이 필요하고 0이 들어오도록 허용해야 합니다

발신 포트에서: iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

수신 포트에서: iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

작은 확장자: 127.0.0.1은 특별하므로 명확하게 정의해야 합니다

iptables -A 입력 -s 127.0.0.1 -d 127.0.0.1 -j 수락

iptables -A 출력 -s 127.0.0.1 -d 127.0.0.1 -j 수락

Eight: SNAT 및 DNAT 구현

현재 IP 주소가 부족하고 할당되었으므로 남은 IP 자원을 절약하려면 주소 변환을 수행해야 합니다. 그렇다면 iptables를 통해 NAT 주소 변환을 구현하는 방법은 무엇입니까?

1. 원래 주소를 기준으로 SNAT 변환

원래 주소를 기반으로 한 변환은 일반적으로 당사 내부 네트워크 사용자 중 다수가 외부 네트워크 포트를 통해 인터넷에 접속할 때 사용됩니다. 이때 내부 네트워크 주소를 외부 네트워크 IP로 변환하여 다른 외부 네트워크에 연결할 수 있습니다. .IP 기능.

따라서 iptables에서 변환하는 방법을 정의해야 합니다.

정의된 스타일:

예를 들어 이제 192.168.10.0 네트워크 세그먼트의 모든 IP 주소를 가정된 외부 네트워크 주소 172.16.100.1로 변환해야 합니다.

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

이렇게 하면 로컬 네트워크에서 네트워크 카드를 통해 네트워크에 액세스하려는 모든 사람이 IP 172.16.100.1.

로 변환됩니다.

그럼 172.16.100.1이 고쳐지지 않는다면 어떨까요?

우리 모두는 China Unicom 또는 China Telecom을 사용하여 인터넷에 액세스할 때 일반적으로 컴퓨터를 켤 때마다 외부 IP 주소가 무작위로 생성된다는 것을 알고 있습니다. 이는 외부 네트워크 주소가 동적으로 변경된다는 것을 의미합니다. 이때 외부 네트워크 주소를 MASQUERADE(동적 위장)로 변경해야 합니다. 자동으로 외부 네트워크 주소를 찾아 올바른 외부 네트워크 주소로 자동 변경할 수 있습니다. 따라서 다음과 같이 설정해야 합니다.

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

참고: 주소 위장은 모든 장소에 적용되지 않습니다.

2.DNAT 대상 주소 변환

대상 주소 변환의 경우 데이터 흐름 방향은 외부가 클라이언트이고 내부가 서버입니다. 대상 주소 변환을 통해 외부 IP가 외부 네트워크를 통해 서버의 다른 서버에 액세스할 수 있습니다. IP이지만 당사 서비스는 인트라넷 서버의 다른 서버에 배치됩니다.

대상 주소 변환은 어떻게 하나요? :

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2

대상 주소 변환은 네트워크 카드에 도달하기 전에 이루어져야 하므로 PREROUTING 위치에서 이루어져야 합니다

9: 규칙 저장 및 열기 제어

참고: 다시 시작하면 정의한 모든 콘텐츠가 유효하지 않게 됩니다. 적용하려면 명령을 사용하여 저장해야 합니다.

1.service iptables 저장 명령

/etc/sysconfig/iptables 파일에 저장됩니다

2.iptables-저장 명령

iptables-저장 > /etc/sysconfig/iptables

3.iptables-복원 명령

부팅할 때 /etc/sysconfig/iptabels가 자동으로 로드됩니다

로드할 수 없거나 부팅 시 로드되지 않고 직접 작성한 구성 파일(iptables.2로 가정)을 수동으로 적용하려는 경우:

iptables-복원 /etc/sysconfig/iptables.2

그런 다음 iptables에 정의된 규칙을 수동으로 적용하는 작업을 완료했습니다

10: 요약

Iptables는 모든 방화벽에 거의 필요한 설정이며, 대규모 네트워크를 구축할 때 여러 가지 이유로 설정해야 하는 항목이기도 합니다. Iptables를 잘 배우면 전체 네트워크의 구조에 대한 더 깊은 이해를 얻을 수 있으며 동시에 커널 공간의 데이터 방향과 Linux의 보안에 대해서도 철저하게 파악할 수 있습니다. 우리는 학습할 때 다양한 프로젝트와 실험을 결합하여 이를 완성하려고 노력합니다. 이는 iptables 및 다양한 기술의 구성을 심화하는 데 매우 도움이 될 것입니다.

위 내용은 CentOS에서 iptables를 사용하는 방법에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:jb51.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿