iptables conntrack 모듈: ESTABLISHED/RELATED 대신 SNAT(또는 DNAT) 상태입니까?

iptables conntrack 모듈: ESTABLISHED/RELATED 대신 SNAT(또는 DNAT) 상태입니까?

한동안(버전 1.3에서 도입된 것으로 알고 있습니다) iptables'연결하다모듈은 SNAT와 DNAT라는 두 가지 가상 상태를 추적할 수 있습니다.

SNAT 가상 상태는 원래 소스 주소가 응답 대상과 다른 경우 일치합니다. DNAT 가상 상태, 원래 대상이 응답 소스와 다른 경우 일치합니다.

내 라우터/방화벽 호스트에는 다음과 같은 몇 가지 SNAT 규칙이 있습니다.

# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP

# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables인터넷 검색 후에 이러한 "새" 또는 상태를 사용하는 규칙의 예를 찾을 수 없었지만 다음과 같이 바꾸려고 SNAT했습니다 .DNATESTABLISHED,RELATEDSNATDNAT

# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,SNAT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate SNAT -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP

# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate DNAT -j ACCEPT

작동하는 것 같고 이 접근 방식에는 제가 알 수 있는 최소한 한 가지 이점이 있습니다. 방화벽은 내부 호스트에서 인터넷으로 RST 패킷을 삭제하는 데 사용되었지만(상태에 있었기 때문에 INVALID) 이 새로운 접근 방식을 사용하면 다음이 허용되었습니다. 통과하다 .

불행하게도 편리하기는 하지만 네트워킹에 대한 나의 이론적 지식으로는 이것이 너무 허용적인지(즉, LAN 외부에서 원치 않는 패킷이 내부에 도달하도록 허용하는 것) 이해하기에는 충분하지 않기 때문에 이 접근 방식이 실제로 적절한지 확신할 수 없습니다.

내 질문은 다음과 같이 표현될 수 있을 것 같습니다. 패킷이 SNATOR 상태를 가지면서 동시에 OR 상태를 DNAT가질 수 없습니까 ( 물론 해당 상태의 첫 번째 패킷은 제외)?ESTABLISHEDRELATEDNEW

참고: 그러한 패킷을 기록해 보았지만 내가 아는 iptables한 한 가지 옵션만 --ctstate허용되고 !사용할 수 없기 때문에 불가능합니다. 즉, 말할 수 없거나 적어도 이를 수행할 방법을 찾을 수 없습니다. 예를 들어, " SNAT상태가 있지만 상태가 없는 ESTABLISHED패킷을 기록합니다 RELATED"). 제가 생각하지 못한 다른 녹음 방법이 있다면 그것도 매우 환영할 것입니다.

편집 1: 몇 번의 시행착오 끝에 내가 틀렸다는 것을 깨달았습니다(따라서 텍스트를 획으로 표시했습니다). 일부 패킷은 여전히 ​​상태 INVALID이므로 결국 삭제됩니다.

편집 2: 사용 SNAT/ DNAT교체 하는 것이 안전하지 않은 경우 ESTABLISH,RELATED패킷이 후자가 아닌 전자 상태일 수 있는 상황에 대한 구체적인 예를 제공하십시오.

답변1

로깅에 대한 제안을 주신 @AB님 덕분에 더 많은 테스트를 할 수 있었습니다. 여기에 결과와 내 질문에 대한 답변이 있습니다. 웹에서 상태 SNAT및 에 대해 아무것도 찾을 수 없는 저와 같은 다른 사람들에게 도움이 되기를 바랍니다 DNAT. /또는 성냥을 교체하는 능력 ESTABLISHED,RELATED.

따라서 적당히 사용량이 많은 홈 네트워크(SNAT를 통해 인터넷에 액세스하는 여러 호스트와 DNAT를 통해 공개적으로 액세스할 수 있는 서버(HTTP/HTTPS, SMTP, IMAP 등)를 호스팅하는 몇 개의 VM)에서 5일 동안 나는 아무것도 보지 못했습니다. 또는 상태가 SNAT아닌 DNAT또는 상태 에 있는 패킷에 대한 로그 줄입니다 .ESTABLISHEDRELATED

SNAT따라서 "패킷이 OR DNAT상태를 가지면서 동시에 OR 상태를 가질 수 없습니까? " ESTABLISHED라는 질문에 대한 대답은 RELATED다음과 같습니다.아니요.

내 진짜 관심사는 내 LAN에 패킷을 일치시키 SNAT거나 DNAT대신 ESTABLISHED,RELATED허용하는 것이 너무 관대할 수 있다는 것입니다. 처음에는 안심할 수 있지만 이는 좋은 생각이 아니라는 것을 알게 되었습니다.

사실 그 반대도 사실이지만,더 적은RELATED허용 오차: 이 규칙을 테스트하는 동안 삭제된 상태에서 적지만 무시할 수 없는 수의 패킷을 확인했습니다 . 주로 ICMP 유형 3, 코드 1 및 3(각각)대상 호스트에 연결할 수 없습니다.그리고대상 포트에 연결할 수 없습니다.), 인터넷에서 내 LAN 내의 호스트로 향합니다. 즉, (네트워킹을 올바르게 이해한 경우) 내 호스트는 인터넷에 대한 연결을 설정하려고 시도하고 원격 라우터는 연결을 설정할 수 없다고 응답하며 내 방화벽/라우터 호스트는 이러한 응답을 차단합니다. 이것은 좋은 일이 아닐 수 없습니다.

ESTABLISHED,RELATED그래서 SNAT"또는으로 대체하는 것이 좋은 생각인가"라는 근본적인 질문에 대한 대답은 DNAT,아니요.

답변2

안전을 위해 나는 당신의 방법을 사용하지 않을 것입니다. 네트워크를 재설계하고 더 이상 SNAT를 사용할 필요가 없다고 상상해 보십시오. 무슨 일이야? 이는 분명한 부분이다. 어딘가에 숨겨진 문제가 숨어 있을 수도 있습니다.

NAT 규칙과 필터링 규칙은 특별한 이유가 없는 한 가능한 한 별도로 유지되어야 합니다. 타당한 이유가 있는지 잘 모르겠습니다. 좋은 이유는 NAT 트래픽을 NAT가 아닌 트래픽과 다르게 처리하는 것입니다(예:서버 DNAT는 뒤에 있는 다른 서버에 서비스를 제공하지만 뒤에 있는 서버/서비스에 직접 액세스하기 위한 라우터로 사용되는 것은 허용되지 않습니다.).

이제 메모해 보세요. 문제를 여러 단계로 나누세요.

잘못된 규칙:

iptables -A FORWARD -m conntrack --ctstate SNAT ! --ctstate ESTABLISHED,RELATED -j LOG

다음으로 대체 가능:

iptables -N subtest
iptables -A FORWARD -m conntrack --ctstate SNAT -j subtest
iptables -A subtest -m conntrack ! --ctstate ESTABLISHED,RELATED -j LOG

또는 RETURN과 반대 논리를 대신 사용하세요.

iptables -N speciallog
iptables -A FORWARD -j speciallog
iptables -A speciallog -m conntrack ! --ctstate SNAT -j RETURN
iptables -A speciallog -m conntrack ! --ctstate ESTABLISHED,RELATED -j LOG

또는 태그를 사용하여 동일한 효과를 얻을 수 있습니다(다른 곳에 태그를 사용하고 마스크를 사용하지 않으려는 경우에는 그렇지 않음).

iptables -A FORWARD -m conntrack --ctstate SNAT -j MARK 1
iptables -A FORWARD -m mark --mark 1 -m conntrack ! --ctstate ESTABLISHED,RELATED -j LOG

각 방법에 대해 더 많은 테스트를 쉽게 연결하는 것을 상상할 수 있습니다(방법을 표시하는 태그를 늘려서).

관련 정보