한동안(버전 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
했습니다 .DNAT
ESTABLISHED,RELATED
SNAT
DNAT
# 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 외부에서 원치 않는 패킷이 내부에 도달하도록 허용하는 것) 이해하기에는 충분하지 않기 때문에 이 접근 방식이 실제로 적절한지 확신할 수 없습니다.
내 질문은 다음과 같이 표현될 수 있을 것 같습니다. 패킷이 SNAT
OR 상태를 가지면서 동시에 OR 상태를 DNAT
가질 수 없습니까 ( 물론 해당 상태의 첫 번째 패킷은 제외)?ESTABLISHED
RELATED
NEW
참고: 그러한 패킷을 기록해 보았지만 내가 아는 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
또는 상태 에 있는 패킷에 대한 로그 줄입니다 .ESTABLISHED
RELATED
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
각 방법에 대해 더 많은 테스트를 쉽게 연결하는 것을 상상할 수 있습니다(방법을 표시하는 태그를 늘려서).