iptables 및 일반적인 방화벽 함정 디버깅?


18

이것은 Linux 시스템에서 소프트웨어 방화벽을 이해하고 디버깅 하는 것에 대한 제안 된 정식 질문 입니다.

에 대한 응답으로 EEAA의 대답 과 쇼그의 코멘트 @ 우리는 iptables에 대한 일반적인 비교적 간단한 질문을 폐쇄에 적합한 표준 Q & A가 필요하다고.

Linux 소프트웨어 방화벽, netfilter 패킷 필터링 프레임 워크, 일반적으로 userland 인터페이스 iptables 에 의해 참조되는 문제점을 디버그하는 구조화 된 방법은 무엇입니까 ?

방화벽 관리자가 간과하거나 알면 이익을 얻을 수 있는지 확인하기 위해 일반적인 함정, 반복되는 질문 및 간단하거나 약간 더 모호한 사항은 무엇입니까?

UFW , FirewallD (일명 firewall-cmd), Shorewall 등과 같은 툴링을 사용하더라도 툴이 제공하는 추상화 계층이없는 후드를 살펴 보는 것이 좋습니다.

이 질문은 방화벽을 구축하기위한 방법에 관해서는 것은 아니다 : 체크 제품 설명서를 해당과 인스턴스에 조리법을 기여 iptables에 여행 & 트릭 또는 검색 태그가 달린 기존 질문을 자주 하고 잘 간주 높은 점수를 Q & A


1
성능 향상 및 보안 강화를 위해 체인의 초기에 배치 할 수있는 NAT 및 상태 저장 규칙은 어떻습니까?
Matt

1
@ 매트 : 방화벽 규칙 최적화는 그 자체로 완전한 Q & A이며,이 Q & A에서 내가 여기에
HBruijn

1
IPtables에서 규칙에 도달하지 않으면 유사한 LOG 규칙을 추가하고 LOG 메시지를 수신 할 때까지 체인을 더 위로 이동하십시오. 그런 다음 아래 규칙 중 하나가 패킷에서 일치하지 않는 규칙이됩니다.
Matthew Ife

1
아, net.netfilter.nf_conntrack_log_invalid255로 설정 하면 유효하지 않은 패킷을 아주 잘 캡처 할 수 있습니다. 넷 필터의 상태 저장 부분이 나쁜 동작을 일으키는 경우 도움이 될 수 있습니다.
Matthew Ife

답변:


14

일반적으로 :

방화벽 구성을보고 수정하려면 root제한된 포트 번호 범위에서 서비스를 여는 것처럼 관리자 권한 ( )이 필요 합니다. 즉 , 루트로 로그인하거나 명령을 루트로 실행하는 데 root사용해야 sudo합니다. 이러한 명령을 optional으로 표시하려고합니다 [sudo].

내용:

  1. 주문 문제 나 사이의 차이 -I-A
  2. 현재 방화벽 구성 표시
  3. 출력 해석 iptables -L -v -n
  4. 환경을 알고
  5. INPUT 및 FORWARD 체인
  6. 커널 모듈

1. 주문 문제 나 사이의 차이 -I-A

기억해야 할 것은 방화벽 규칙이 나열된 순서대로 확인된다는 것입니다. 패킷이나 연결을 허용하거나 허용하지 않는 규칙이 트리거되면 커널은 체인 처리를 중지합니다.

내가 생각하는 가장 일반적인 실수 초보자 방화벽 관리자들이는 아래와 같은 새로운 포트를 열어 올바른 지침을 따르이다 :

[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT

그런 다음 적용되지 않습니다.

그 이유는 기존의 모든 규칙 뒤에-A 옵션이 새 규칙을 추가 하고 기존 방화벽의 최종 규칙이 종종 허용되지 않는 모든 트래픽을 차단 하는 규칙 이었기 때문에

...
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
8        0  0    ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080

또는 iptables-save와 동일합니다.

...
iptables -A INPUT  -j REJECT
iptables -A INPUT  -p tcp --dport 8080 -j ACCEPT

TCP 포트 8080을 여는 새로운 규칙에 도달하지 않습니다. (카운터가 0 패킷과 0 바이트로 완고하게 남는 것으로 입증 됨).

-I새 규칙으로 규칙을 삽입하면 체인에서 첫 번째 규칙이되어 작동합니다.

2. 현재 방화벽 구성을 표시합니다

방화벽 관리자는 사용자 친화적 인 도구로 방화벽 문제를 진단하는 대신 Linux 커널이 실행중인 실제 구성을 살펴 보는 것이 좋습니다. 기본 문제를 이해 한 후에는 해당 도구가 지원하는 문제로 쉽게 해결할 수 있습니다.

명령 [sudo] iptables -L -v -n은 당신의 친구입니다 (그러나 어떤 사람들은 iptables-save더 좋아합니다). 구성을 논의 할 때 종종 --line-numbers번호 줄뿐만 아니라 옵션 을 사용하는 것이 유용합니다 . 규칙 #X를 참조하면 다소 토론하기가 쉽습니다.
참고 : NAT 규칙은 iptables-save출력에 포함 되지만 -t nat옵션 을 추가하여 별도로 나열해야합니다 ( 예 :) [sudo] iptables -L -v -n -t nat --line-numbers.

명령을 여러 번 실행하고 카운터 증가를 확인하면 새 규칙이 실제로 트리거되는지 확인하는 데 유용한 도구가 될 수 있습니다.

[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     784K   65M fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
2    2789K  866M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3       15  1384 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain fail2ban-SSH (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       117.239.37.150       0.0.0.0/0           reject-with icmp-port-unreachable
2        4   412 REJECT     all  --  *      *       117.253.208.237      0.0.0.0/0           reject-with icmp-port-unreachable

또는의 출력은 iptables-save위의 방화벽 구성을 재생성 할 수있는 스크립트를 제공합니다.

[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT

이해하기 쉬운 것을 선호하는 것이 중요합니다.

3. 출력의 해석 iptables -L -v -n

정책 기본 동작을 체인 사용하는 명시적인 규칙 일치를 설정합니다. 에서 INPUT모든 트래픽을 허용하도록 설정되어 체인.

INPUT 체인의 첫 번째 규칙은 즉시 흥미로운 규칙이며 TCP 포트 22로 향하는 모든 트래픽 (소스 0.0.0.0/0 및 대상 0.0.0.0/0) tcp dpt:22을 SSH의 기본 포트로 사용자 지정 대상 ( fail2ban-SSH)으로 보냅니다. . 이름에서 알 수 있듯이이 규칙은 fail2ban (시스템 로그 파일에서 남용 가능성이 있는지 검사하고 남용자의 IP 주소를 차단하는 보안 제품)에 의해 유지됩니다.

이 규칙은 iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSHiptables-save의 출력 과 비슷 하거나 유사한 iptables 명령 행에 의해 작성되었을 것 -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH입니다. 종종 문서에서 이러한 표기법 중 하나를 찾을 수 있습니다.

카운터는이 규칙이 784'000 개의 패킷 및 65MB의 데이터와 일치했음을 나타냅니다.

이 첫 번째 규칙과 일치하는 트래픽은 fail2ban-SSH체인에 의해 처리되며 체인은 비표준 체인으로 OUTPUT 체인 아래에 나열됩니다.

이 체인은 차단 된 (가있는 reject-with icm-port-unreachable) 각 가해자 (소스 ip- 주소 117.253.221.166 또는 58.218.211.166)에 대해 하나씩 두 가지 규칙으로 구성됩니다 .

 -A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
 -A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable

차단 된 호스트에서 얻지 않은 SSH 패킷은 아직 허용되거나 허용되지 않으며 이제 사용자 지정 체인이 완료되었으므로 INPUT 체인의 두 번째 규칙에 따라 검사됩니다.

포트 22로 향하지 않은 모든 패킷은 INPUT 체인의 첫 번째 규칙을 통과했으며 INPUT 규칙 # 2에서도 평가됩니다.

입력 규칙 번호 2는 연결을 추적 하는 상태 전체 방화벽 이되도록 합니다. 이는 몇 가지 장점이 있지만, 새로운 연결에 대한 패킷 만 전체 규칙 세트에 대해 검사해야하지만 일단 허용 된 연결이나 관련 연결에 속하는 추가 패킷은 추가 확인없이 허용됩니다.

입력 규칙 # 2는 열려있는 모든 관련 연결 및 해당 규칙과 일치하는 패킷을 더 이상 평가할 필요가 없습니다.

참고 : 상태 저장 방화벽 구성의 규칙 변경은 기존 연결이 아닌 새 연결에만 영향을 미칩니다.

반대로 간단한 패킷 필터는 연결 상태를 추적하지 않고 모든 규칙 집합에 대해 모든 패킷을 테스트합니다. 이러한 방화벽에서는 상태 키워드가 사용 되지 않습니다 .

입력 규칙 # 3은 상당히 지루하며 루프백 ( lo또는 127.0.0.1) 인터페이스에 연결하는 모든 트래픽 이 허용됩니다.

입력 규칙 4, 5 및 6은 새 연결에 대한 액세스 권한을 부여하여 TCP 포트 22, 80 및 443 (SSH, HTTP 및 HTTPS의 기본 포트)을 여는 데 사용됩니다 (기존 연결은 이미 입력 규칙 2에서 허용됨).

상태 비 저장 방화벽에서 이러한 규칙은 상태 속성없이 나타납니다.

4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0

또는

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

마지막 INPUT 규칙 # 7은 INPUT 규칙 1-7에서 액세스 권한이 부여되지 않은 모든 트래픽을 차단하는 규칙입니다. 상당히 일반적인 관습 : 허용되지 않는 모든 것은 거부됩니다. 이론적으로이 규칙은 기본 POLICY를 REJECT로 설정하여 생략 할 수 있습니다.

항상 전체 체인을 조사하십시오.

4. 환경을 알고

4.1. 소프트웨어 방화벽의 설정은 네트워크의 다른 곳에서 유지되는 보안 설정에 영향을 미치지 않습니다. 즉 iptables라우터의 수정되지 않은 액세스 제어 목록을 사용 하여 네트워크 서비스를 열었더라도 네트워크의 다른 방화벽은 여전히 ​​트래픽을 차단할 수 있습니다 ...

4.2. 수신 대기중인 서비스가 없으면 방화벽 설정에 관계없이 연결할 수 없으며 연결 거부 오류가 발생 합니다. 따라서:

  • 서비스가 올바른 네트워크 인터페이스 / ip 주소를 수신하고 있고 원하는 포트 번호를 [sudo] netstat -plnut사용 하고 있거나 다른 방법으로 사용 중인지 확인하십시오 ss -tnlp.
  • 서비스가 아직 실행되고 있지 않은 경우 netcat과 같은 간단한 리스너를 에뮬레이트 [sudo] nc -l -p 123하거나 openssl s_server -accept 1234 [options] TLS / SSL 리스너가 필요한 경우 ( man s_server옵션 확인 ).
  • 당신은 그 자체, 즉 서버에서 연결할 수 있는지 확인 telnet <IP of Server> 123하거나 echo "Hello" | nc <IP of Server> 123TLS / SSL 보안 서비스를 테스트 할 때 또는 openssl s_client -connect <IP of Server>:1234원격 호스트에서 동일한 작업을 시도하기 전에.

4.3. 서비스에서 사용하는 프로토콜을 이해하십시오. 충분히 이해하지 못하는 서비스를 제대로 활성화 / 비활성화 할 수 없습니다. 예를 들어 :

  • TCP와 UDP 중 어느 것을 사용합니까 (DNS와 같이)?
  • 서비스가 고정 기본 포트를 사용합니까 (예 : 웹 서버의 TCP 포트 80과 같은 것)?
  • 또는 다이나믹 포트 번호를 선택할 수 있습니까 (예 : 포트 맵에 등록하는 기본 NFS와 같은 RPC 서비스)?
  • 악명 높은 FTP는 수동 모드를 사용하도록 구성된 경우 고정 및 동적 포트 번호의 두 포트 를 사용합니다.
  • 서비스, ​​포트 및 프로토콜 설명이 /etc/services반드시 포트를 사용하는 실제 서비스와 일치하지는 않습니다.

4.4. 커널 패킷 필터 만이 네트워크 연결을 제한 할 수있는 것은 아닙니다.

  • SELinux는 네트워크 서비스를 제한 할 수도 있습니다. getenforceSELinux가 실행 중인지 확인합니다.
  • 약간 불분명 한 TCP Wrappers는 여전히 네트워크 보안을 강화하는 강력한 도구입니다. 확인 ldd /path/to/service |grep libwrap/hosts.[allow|deny]제어 파일.

5. INPUT또는 FORWARD사슬

체인의 개념은 여기에 더 자세히 설명되어 있지만 그 단점은 다음과 같습니다.

INPUT열려 및 / 또는 당신이 iptables 명령을 발행 할 경우 서비스를위한 주변 네트워크 포트가 호스트에 로컬로 실행 곳에 체인입니다.

FORWARD당신이 당신의 리눅스 머신은 브리지, 라우터, 하이퍼 바이저의 역할 및 / 또는 네트워크 주소를 수행되어 다른 시스템에 커널에 의해 전달됩니다 필터 트래픽 규칙, 실제 시스템뿐만 아니라 도커 용기 및 가상 게스트 서버 서버를 적용 할 경우 체인입니다 번역 및 포트 포워딩.

일반적인 오해는 도커 컨테이너 또는 KVM 게스트가 로컬에서 실행되므로 적용되는 필터 규칙은 INPUT 체인에 있어야하지만 일반적으로 그렇지 않습니다.

6. 커널 모듈

패킷 필터는 Linux 커널 내에서 실행되므로 실제로 여러 모듈 인 동적 모듈로 컴파일 할 수도 있습니다. 대부분의 배포에는 netfilter가 모듈로 포함되며 필요한 netfilter 모듈은 필요에 따라 커널에로드되지만 일부 모듈의 경우 방화벽 관리자가 수동으로로드해야합니다. 이는 주로 nf_conntrack_ftp로로드 할 수있는 연결 추적 모듈과 관련 이 있습니다 insmod.

현재 실행중인 커널에로드 된 모듈은로 표시 될 수 있습니다 lsmod.

재부팅시 모듈이 지속적으로로드되도록하는 방법은 Linux 배포판에 따라 다릅니다.


1
증가 패킷 / 바이트 카운터를 찾을 때. 유용한 도구는 차이 모드에서 시계를 사용하는 것입니다. 따라서 이와 같은 것 : watch --difference -n 1 iptables -L FORWARD -v -n. 도구가 주기적으로 명령을 실행하고 변경 사항을 강조 표시하면 훨씬 쉬워집니다.
Zoredache

1
난 당신의 느슨한 의견을 보았다. 이것은 좋은 대답이며, 많이 추가 할 수 있는지 확실하지 않습니다. TRACE 기능 사용에 대한 언급을 포함 할 수 있습니다 .
Zoredache

이 두려운 (다양한 인수가있는) 출력에 대해 매번 iptables-save출력 (바람직하게는 -c)을 취할 것 iptables -L입니다.
0xC0000022L

7

다른 프로토콜의 일반적인 문제

DNS : DNS는 기본적으로 포트 53 UDP를 사용하지만 단일 UDP 데이터 그램에 맞지 않는 메시지는 이름 서버를 실행할 때 포트 53 TCP를 열어야하는 대신 TCP (일반적으로 영역 전송 등)를 사용하여 전송됩니다. .

이메일 : 많은 소비자 ISP가 SMTP 트래픽 (또는 최소한 기본 포트 TCP 25)을 차단하여 이메일을 직접 받거나 보낼 수 없으며 고객이 ISP의 SMTP 릴레이를 모든 발신 이메일과 때로는 수신 이메일에 사용해야합니다. . §1.1과 관련이 있습니다.

FTP : FTP는 두 개의 연결이 사용되는 점에서 이상한 프로토콜입니다 . 첫 번째는 제어 연결이며 기본적으로 FTP 서버는 TCP 포트 21에서 수신 대기합니다. 제어 연결은 인증 및 명령 발행에 사용됩니다. 실제 파일 전송 및 디렉토리 목록 출력과 같은 것은 두 번째 TCP 연결 인 DATA 연결을 통해 전달됩니다.. 활성 FTP에서 해당 데이터 연결은 TCP 포트 20의 FTP 서버에서 시작되고 FTP 클라이언트에 연결됩니다. 방화벽 및 NAT 게이트웨이를 사용하는 사용자에게는 활성 FTP가 제대로 작동하지 않으므로 대부분 사용이 중단되었습니다. 대부분의 FTP 서버는 수동 FTP를 지원합니다. 수동 FTP를 사용하면 FTP 서버는 FTP 클라이언트가 연결할 수있는 두 번째 포트에서 DATA 연결에 대한 리스너를 엽니 다. 방화벽의 문제점은 DATA 포트가 1024-65536 사이의 사용 가능한 권한이없는 포트 일 수 있다는 것입니다.

상태 비 저장 방화벽에서는 일반적으로 FTP 서버가 할당 할 수있는 수동 포트의 수를 제한 한 다음 명시 적으로 해당 포트를 열어 해결합니다. 즉

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT

상태 저장 방화벽에서는 DATA 포트를 명시 적으로 열 필요가 없습니다. netfilter 도우미 모듈은 할당 된 동적 포트를 인식하고 DATA 연결을 RELATED일반 규칙과 일치하도록 표시하여 올바른 클라이언트에 대해 해당 포트를 동적으로 엽니 다. :

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT

예를 들어 FTP 케이스에서 수동으로 올바른 커널 모듈 을로드해야합니다. 예를 들어 insmod nf_conntrack_ftp재부팅에 따라 지속적으로 부팅하려면 배포에 따라 달라집니다.

참고 : 제어 연결이 암호화되고 nf_conntrack_ftp는 더 이상 PASV 응답을 읽을 수 없으므로 SSL을 FTP와 함께 사용하면 FTP 연결 추적 모듈이 실패합니다.

NFS 및 유사한 RPC 서비스 : RPC 서비스 의 문제점은 설계 상 특정 고정 포트를 사용하지 않는다는 것입니다. 사용 가능한 포트를 임의로 선택할 수 있으며 RPC Portmap 데몬에 등록됩니다. 연결을 시도하는 클라이언트는 Portmap 데몬을 쿼리 한 다음 올바른 포트에 직접 연결합니다. 예약 된 포트가 부족한 문제를 해결했습니다.

방화벽 관점에서 TCP / UDP 포트 111과 RPC 서비스가 현재 사용중인 실제 포트를 열어야합니다. 방화벽에서 이러한 임의의 포트를 여는 문제는 일반적으로 미리 정의 된 고정 포트를 사용하도록 NFS 서버와 같은 RPC 서비스를 제한하여 해결됩니다.


7

iptables / 방화벽 "소개"

방화벽은 기본적으로 정책 기반 네트워크 필터입니다. Linux 방화벽은 Netfilter를 중심으로 구축됩니다. 특정 작업을 수행하는 여러 커널 모듈로 구성된 커널의 네트워크 패킷 처리 프레임 워크 :

  1. FILTER 모듈 (기본적으로 항상로드 됨)을 통해 특정 일치 기준에 따라 IP 패킷을 수락하거나 DROP 할 수 있습니다.
  2. NAT 모듈 세트를 사용하면 네트워크 주소 변환 (SNAT, DNAT, MASQUERADE)을 수행 할 수 있습니다.
  3. MANGLE 모듈을 사용하면 특정 IP 패킷 필드 (TOS, TTL)를 변경할 수 있습니다.

사용자는 명령 줄에서 iptables를 사용하여 방화벽 요구에 맞게 Netfilter 프레임 워크를 구성합니다. iptables를 사용하여 커널이 IP 패킷이 Linux 상자에 도착하거나 통과하거나 떠날 때 수행 할 작업을 커널에 지시하는 규칙을 정의합니다. 각 Netfilter 기본 프로세스는 iptables lingo에서 TABLE (FILTER, NAT, MANGLE)로 표시됩니다. 네트워크 패킷 흐름 맵에는 커널이 작업을 수행하기 위해 호출하는 몇 가지 특정 후크 지점이 있습니다. 구체적으로 위치 된 특정 테이블 호출 시퀀스는 일반적으로 PREROUTING, INPUT, FORWARD, OUTPUT 및 POSTROUTING의 이름을 수신하는 내장 체인이라고합니다. 테이블을 "프로세스 유형"과 연관시키고 CHAIN을 해당 프로세스 인스턴스가 호출되는 네트워크 패킷 플로우 맵의 "위치"와 연관시키는 경우 쉽게 기억할 수 있습니다.

여기에 이미지 설명을 입력하십시오

IP 패킷은 네트워크 인터페이스에서 수신되거나 로컬 프로세스에 의해 생성되므로 최종적으로 전달되거나 폐기 될 때까지 Netfilter 엔진은 네트워크 패킷 흐름 맵을 따라 포함 된 규칙을 순차적으로 테스트하고 적용합니다. TABLE @ CHAIN ​​쌍에 의해 식별 된 각 블록에서, 사용자는 IP 패킷 매칭 기준 및 대응하는 행동 과정을 포함하는 이들 연속 규칙 중 하나 이상을 추가 할 수있다. 하나 이상의 TABLE에서 수행 할 수있는 작업 (예 : ACCEPT, DROP 등)과 테이블 특정 작업 (예 : SNAT, DNAT 등)이 있습니다.

즉, IP 패킷이 네트워크 인터페이스에서 도착하면 MANGLE 테이블 사용자 정의 규칙 (있는 경우)을 호출하는 PREROUTING 체인에 의해 먼저 처리됩니다. 현재 패킷과 일치하는 규칙이없는 경우 해당 MANGLE @ PREROUTING 기본 조치 또는 "정책"이 ​​적용됩니다. 이 시점에서 패킷이 삭제되지 않으면 프로세스는 계속해서 PREROUTING 체인 (지도 참조)에서 NAT 테이블의 규칙을 호출합니다. 규칙 레이아웃을 용이하게하기 위해 사용자는 원하는대로 맞춤형 체인을 만들어 맵의 다른 지점에서 "점프"할 수 있습니다.

여기에 이미지 설명을 입력하십시오

기본 제공 체인에는 ACCEPT 또는 DROP 패킷에 대한 사용자 정의 정책이있을 수 있지만, 사용자 정의 체인에는 프로세스를 계속하기 위해 호출자에게 변경 불가능한 기본 정책 인 RETURN이 항상 있습니다.

iptables 명령

iptables 기본 명령은 네트워크 패킷 흐름 맵을 필수 처리 규칙으로 채 웁니다.

일반 iptables 규칙은 다음과 같이 작성할 수 있습니다.

# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>

다음과 같이 읽을 수 있습니다.

Netfilter (kernel module) please <Add/Insert/Delete> this rule for <table> at <CHAIN> where packets matching <PKT_MATCHING_CRITERIA> have to be <ACTION>ed

<table>
  -t filter       (the filter table is assumed when omitted)
  -t nat
  -t mangle 

<Add/Insert/Delete>
  -A              (append rule at the end of the chain list)
  -I              (insert rule at the begining of the chain list)
  -D              (Delete rule)

<CHAIN>
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING
  USER_DEFINED_CHAIN

<PKT_MATCHING_CRITERIA>
ISO Level-2 matching:
  -i [!] <if_name>    or --in-interface [!] <if_name>
          (OUTPUT and POSTROUTING chains cannot match on input  interfaces)
  -o [!] <if_name>    or --out-interface [!] <if_name>
          (INPUT  and PREROUTING  chains cannot match on output interfaces) 
    -mac-source [!] <xx-xx-xx-xx-xx-xx>
            (OUTPUT and POSTROUTING chains cannot match on input  interfaces)

ISO Level-3 matching:
  -s [!] <src_ip>     or --src [!] <src_ip>   or --source [!] <src_ip>
  -d [!] <dst_ip>     or --src [!] <dst_ip>   or --destination [!] <dst_ip>

ISO Level-4 matching:
  -p [!] <prot_name>    or --protocol [!] <prot_name>  (udp|tcp|icmp)

  Also available when ICMP protocol is defined
  --icmp-type [!] <icmp_type>

  Also available when UDP protocol is defined
  --source-port [!] <udp_src_port>      or --sport [!] <udp_src_port>
  --destination-port [!] <udp_dst_port> or --dport [!] <udp_dst_port>

  Also available when TCP protocol is defined
  --source-port [!] <tcp_src_port>      or --sport [!] <tcp_src_port>
  --destination-port [!] <tcp_dst_port> or --dport [!] <tcp_dst_port>
  --tcp-flags [!] <tcp_flags>   (SYN|ACK|FIN|RST|URG|PSH|ALL|NONE)
    --syn
  --tcp-option [!] <tcp_option#>

  --state [!] <state>
  -m <match> [options]

    note: [!] = negation operator

<ACTION>                (also called TARGET)
  -j ACCEPT             (process continues with rules of the next table in map)
  -j DROP               (discard current packet)
  -j REJECT             (discard current packet with ICMP notification)
      option:
      --reject-with <reject_type>
  -j USER_DEFINED_CHAIN   (start traversing USER_DEFINED_CHAIN rules)
  -j RETURN               (return from USER_DEFINED_CHAIN)
  -j LOG                  (log to syslog, then process next rule in table)
      options:
      --log-level <level>
      --log-prefix <prefix>
      --log-tcp-sequence
      --log-tcp-options
      --log-ip-options
      --log-uid

nat table specific
  -j SNAT             (rewrite the source IP address of the packet)
      option:
      --to <ip_address>
  -j SAME             (idem SNAT; used when more than one source address)
      options:
      --nodst 
      --to <a1-a2>
  -j MASQUERADE       (idem SNAT; used when the replace IP is dynamic)
  -j DNAT             (rewrite the destination IP address of the packet)
      option:
      --to <ip_address>
  -j REDIRECT         (rewrite dst IP to 127.0.0.1, PREROUTING and OUTPUT only)
      option:
      –-to-port <port#>

mangle table specific
  -j ROUTE            (explicitly route packets, valid at PREROUTING)
      options:
      --iface <iface_name>
      --ifindex <iface_idx>
  -j MARK             (set Netfilter mark values)
      options:
      --set-mark <value>
      --and-mark <value>
      --or-mark <value> 
  -j TOS              (set the IP header Type of Service field) 
      option:
      --set-tos <value>
  -j DSCP             (set the IP header Differentiated Services Field)
      options:
      --set-dscp <value>
      --set-dscp-class <class>
  -j TTL              (set the IP header Time To Live field)
      options:
      --ttl-set <value>
      --ttl-dec <value>
      --ttl-inc <value>

iptables 보조 명령은 기본 조건 설정, 규칙 나열, 플러시 규칙 등의 시나리오 설정을 완료합니다.

#iptables -t <table> -L             
       (Lists the <table> rules in all chains)
#iptables -t <table> -L <CHAIN>     
       (Lists the <table> rules in <CHAIN>)

#iptables -t <table> -N <CHAIN>     
       (Creates a user-defined <CHAIN> for holding <table> rules)
#iptables -t <table> -E <CHAIN> <NEWCHAIN>  
       (Renames <CHAIN> that holds <table> rules to <NEWCHAIN>)

#iptables -t <table> -X   
       (Deletes all user-defined chains created for holding <table> rules)
#iptables -t <table> -X <CHAIN>
       (Deletes user-defined <CHAIN> created for holding <table> rules)

#iptables -t <table> -P <CHAIN> <ACTION>     where <ACTION> = ACCEPT|DROP
       (Sets the default policy of <table> rules at <CHAIN> to <ACTION>)

#iptables -t <table> -F             
       (Flushes (deletes) all <table> rules in all chains)
#iptables -t <table> -F <CHAIN>
       (Flushes (deletes) all <table> rules in <CHAIN>)

#iptables -t <table> -R <CHAIN> <INDEX> <NEWRULE>
       (Replaces <table> rule at position <INDEX> in <CHAIN> with <NEWRULE>

iptables는 런타임에 Netfilter 엔진에 명령을로드하고 Netfilter는로드 된 규칙과 설정을 즉시 적용하지만 지속되지는 않습니다. 이전에로드 한 모든 Netfilter 규칙을 다시 부팅하면 설정이 손실됩니다. 이러한 이유로 현재 활성화 된 규칙 세트를 파일에 저장하고 나중에 다시로드 할 수있는 iptables 유틸리티가 있습니다.

#iptables-save > fileName
      (Save the currently active Netfilter ruleset to fileName)

#iptables-restore < fileName
      (Restore Netfilter ruleset to the one saved in fileName)

IP 테이블 요약

Netfilter는 매우 유연하고 강력한 프레임 워크이지만 비용을 지불해야합니다. IP 테이블은 복잡합니다. 사용자 관점에서 TABLE, CHAIN, TARGET과 같은 특정 용어는 실제로 나타내는 개념과 잘 일치하지 않으며 처음에는 의미가 없습니다. 주제는 길고 명령에는 끝없는 매개 변수 목록이있는 것 같습니다. 설상가상으로 실제로 Iptable을 마스터하는 단일 책이 없습니다. "레시피 북"또는 "맨 페이지 북"의 두 가지 범주로 나뉩니다. 이 소개에서는 Netfilter / Iptables 환경에 대한 스냅 샷과 사전 소화 된 맨 페이지 항목에 필요한 용량을 제공한다고 생각합니다. iptables를 처음 사용하는 경우이 단락을 몇 번 읽은 후 iptables 예제를 읽을 수 있습니다. 약간의 연습을 통해 곧 자신의 규칙을 작성하게 될 것입니다.

방화벽

방화벽은 주로 일련의 규칙에 따라 네트워크 트래픽을 동적으로 허용하거나 거부하도록 설계되었습니다. 이 시점에서 Linux Netfilter / Iptables 프레임 워크가 방화벽 구성에 완벽한 이유를 쉽게 이해할 수 있습니다. 네트워크 패킷 흐름 맵을 살펴보면 INPUT 및 FORWARD 체인의 FILTER 테이블에서 특히 흥미로운 두 지점을 찾습니다. 특정 IP 패킷을 수락, 거부 또는 삭제하는 경우 IP 소스 주소, IP 프로토콜 (UDP / TCP), 대상 포트 (80, 21, 443 등) 등을 결정할 수 있습니다. 이것은 방화벽이 웹 서버를 무단 네트워크 요청으로부터 보호 할 때 80 %의 시간을하는 것입니다. 시간의 다른 20 %는 (NAT, MANGLE) 네트워크 패킷을 조작하는 것입니다.

방화벽 시나리오

다양한 요구를 충족시키는 수백 가지의 방화벽 레이아웃이 있지만 그 중 3 개가 가장 일반적인 방화벽 시나리오로 간주 될 수 있습니다.

  1. 인터넷에 연결된 하나 이상의 인터페이스가있는 간단한 웹 서버. 정책에는 제한된 인바운드 액세스, 무제한 아웃 바운드 액세스 및 스푸핑 방지 규칙을 허용하는 기본 규칙이 포함됩니다. IP 전달이 꺼져 있습니다.
  2. 이 방화벽은 인터넷과 보호 된 내부 영역에 연결됩니다. 정책에는 제한된 인바운드 액세스, 무제한 아웃 바운드 액세스 및 스푸핑 방지 규칙을 허용하는 기본 규칙이 포함됩니다. 보호 영역은 개인 IP 주소를 사용하므로 소스 NAT가 필요합니다. IP 전달이 켜져 있습니다.
  3. 이 방화벽은 인터넷, 내부 보호 및 완충 영역에 연결됩니다. 정책에는 제한된 인바운드 액세스, 무제한 아웃 바운드 액세스 및 스푸핑 방지 규칙을 허용하는 기본 규칙이 포함됩니다. 보호 및 DMZ 영역은 개인 IP 주소를 사용하므로 소스 및 대상 NAT가 필요합니다. IP 전달이 켜져 있습니다. 여기에 이미지 설명을 입력하십시오

나는 이것을 위해 이것을 썼다 : http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.