IP 테이블 :“-p udp --state ESTABLISHED”


18

발신 DNS를 허용하는 데 자주 사용되는 다음 두 iptables 규칙을 살펴 보겠습니다.

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 
   -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp --sport 53 --dport 1024:65535
   -m state --state ESTABLISHED -j ACCEPT

내 질문은 : UDP에서 ESTABLISHED 상태를 어떻게 정확하게 이해해야합니까? UDP는 상태 비 저장입니다.

여기 내 직감이 있습니다-이것이 틀린지 또는 어디인지 알고 싶습니다.

매뉴얼 페이지는 이것을 알려줍니다 :

상태

이 모듈은 연결 추적과 결합 될 때
이 패킷의 연결 추적 상태입니다.

  -상태 ...

따라서 iptables는 기본적으로 나가는 패킷에 사용 된 포트 번호 (UDP 패킷에 대해 무엇을 기억할 수 있습니까?)를 기억 한 다음 짧은 기간 내에 다시 들어오는 첫 번째 들어오는 패킷을 허용합니까? 침입자는 포트 번호를 추측해야합니다 (정말 너무 어려울까요?)

충돌 방지 정보 :

커널은 어떤 포트가 (다른 서비스 또는 이전 발신 UDP 패킷에 의해) 차단되었는지 추적하여 해당 포트가 기간 내에 새로운 발신 DNS 패킷에 사용되지 않습니까? (기간 내에 해당 포트에서 실수로 서비스를 시작하려고 시도하면 어떻게됩니까? 해당 시도가 거부 / 차단됩니까?)

위의 텍스트에서 모든 오류를 찾으십시오 :-) 감사합니다.

크리스

답변:


12

따라서 iptables는 기본적으로 발신 패킷에 사용 된 포트 번호를 기억합니다 (UDP 패킷에 대해 무엇을 기억할 수 있습니까?)

UDP의 경우 소스 및 대상 포트와 주소가 저장되어 있다고 확신합니다.

상태 테이블을 검사하려면 conntrack 및 / 또는 netstat-nat를 설치하십시오.

(기간 내에 해당 포트에서 실수로 서비스를 시작하려고 시도하면 어떻게됩니까? 해당 시도가 거부 / 차단됩니까?)

OUTPUT 및 INPUT을 사용하고 있으므로 로컬 서비스에 대해 이야기하고 있습니다. 포트가 이미 사용 중입니다. 이미 해당 포트에서 무언가를 수신하고 있기 때문에 시스템에서 다른 서비스를 시작할 수 있다고 생각하지 않습니다. 정말로 원한다면 첫 번째 서비스를 중지하고 다른 서비스를 시작할 수 있다고 생각합니다.이 경우 응답이 서비스에 도달 할 것입니다. 서비스가 패킷으로 수행하는 작업은 패킷의 내용과 서비스에 따라 다릅니다.


따라서 포트 8080에서 Tomcat 인스턴스를 시작하면 실수로 같은 포트에서 DNS 쿼리가 실행되는 경우 1 : (65535-1023)의 시작이 실패 할 가능성이 있습니까? 아니면 기간이 만료 될 때까지 기다리나요? 기본적으로 기간은 얼마나 되나요?
Chris Lercher

6
Linux에서 임시 포트 범위는 일반적으로 32768-61000 (/ proc / sys / net / ipv4 / ip_local_port_range 참조)이라고 생각합니다. 여기에는 8080 포트 예제가 포함되지 않습니다. 임시 범위 내에서. 표에 UDP 항목이 표시되는 시간은 일반적으로 30 초입니다 (/ proc / sys / net / netfilter / nf_conntrack_udp_timeout 참조)
Zoredache

2
+1, 특히 / proc 경로에 감사드립니다!
Chris Lercher 1

1
udp_timeout을 확장하려는 경우echo "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran

8

주의 :이 답변은 편집되었습니다.

매뉴얼 페이지의 내용에도 불구하고 ESTABLISHED"상태 저장"을 의미하는 것으로 보입니다. UDP의 경우 단순히 각 아웃 바운드 UDP 패킷 ( "src ip, src port dst ip, dst port"튜플)을 기억하고 응답을 인식한다는 의미입니다.

FWIW, DNS 트래픽에 대한 일반적인 규칙은 다음과 같습니다.

# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53  -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53  -j ACCEPT

# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

즉, OUTPUT체인의 트래픽을 제어 한 다음 iptables상태 모듈이 INPUT체인의 다른 모든 것을 처리 하도록합니다 .

이 관련 질문 도 참조하십시오 .


1
TCP도 허용해야한다는 것을 알고 있습니다. 그러나 관련 UDP의 의미는 무엇입니까? 맨 페이지 : "RELATED는 패킷이 새로운 연결을 시작하지만 기존 연결과 연결되어 있음을 의미합니다."Connections for UDP? 어쩌면 그것은 ESTABLISHED보다 더 합리적이지만, 내가 알고 싶은 것입니다.
Chris Lercher

규칙을 사용하지만 udp INPUT을 관련으로 제한하면 DNS 쿼리가 작동하지 않습니다. 내가 설립해야 할 것 같습니다. 관련성을 허용해야하는 이유가 있습니까 (UDP의 경우)?
Chris Lercher

좋아요, ESTABLISHED는 맨 페이지가 말하는 것 이상을 의미하는 것 같습니다. 어쨌든 내 것과 같은 OUTPUT 필터를 사용하고 부적절한 트래픽을 허용하지 않는 경우 해당 입력 규칙이 필요한 유일한 규칙입니다.
Alnitak

1
우리가 찾은 것을 감안할 때 관련 udp 패킷은 AFAIK가 없습니다. 그러나 (예를 들어) 해당 상자에서 아웃 바운드 FTP를 수행하는 경우 데이터 채널에 대해 관련 상태 규칙이 필요합니다. "ESTABLISHED, RELATED"규칙은 수신 트래픽에 가장 적합한 단일 규칙 인 AFAIK입니다.
Alnitak

1
실제로 RTP에 RELATEDUDP 패킷 존재할 있습니다.
Alnitak

1

iptables 개발자들은 "ESTABLISHED"상태가 두 클라이언트 사이의 프로토콜에 관계없이 패킷이 양방향으로 보이는 상황이라고 생각했습니다.

상태 확장은 conntrack의 일부입니다. 커널은 테이블의 상태를 이해합니다

/proc/net/nf_conntrack

발신자 관점에서 nf_conntrack 테이블의 UDP에 대한 iptable 상태의 예 UDP에서 DNS 쿼리를 보낸다고 상상해 봅시다

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
 [UNREPLIED] src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

패킷이 전송되었습니다. 응답하지 않았으며 테이블에는 반환 될 것으로 예상되는 데이터 (DNS 응답 패킷)가 있습니다.

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
  src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

응답이 도착하고 응답하지 않은 플래그가 없어지면이 UDP 연결이 시스템에 정의 된 짧은 시간 동안 ESTABLISHED 상태에 있음을 의미합니다.

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