AWS NLB 및 탄력적 IP에서 작동하지 않는 iptables 규칙은 EC2 인스턴스 공용 IP를 사용하여 작동합니다.

AWS NLB 및 탄력적 IP에서 작동하지 않는 iptables 규칙은 EC2 인스턴스 공용 IP를 사용하여 작동합니다.

나는 약간의 손실을 입었습니다.

먼저 몇 가지 맥락을 살펴보겠습니다. NLB 뒤에 AWS EC2 인스턴스가 있습니다. NLB는 탄력적 IP를 사용하고 있습니다. EC2 인스턴스는 DNS 서버를 실행하고 UDP 및 TCP 53을 수신하고 있습니다. NLB는 TCP 및 UDP 포트 53에 대해 설정되어 있습니다. 인스턴스는 대상 그룹에 있고 NLB의 관점에서 정상입니다(예상대로 요청을 처리함).

해결하려는 문제: 레코드 유형에 대한 모든 DNS 쿼리(비율 제한 및 필터링에 대한 몇 가지 다른 규칙 포함)를 삭제하고 싶기 ANY때문에 다음 규칙을 추가했습니다 iptables.

$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 40 -j DROP

$ iptables -t raw -I PREROUTING -p tcp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 52 -j DROP

$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 40 -j LOG \
    --log-prefix "BLOCKED ANY: "

$ iptables -t raw -I PREROUTING -p tcp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 52 -j LOG \
    --log-prefix "BLOCKED ANY: "

이제 문제는...

시도하면 dig some.domain -t any @public.ip.of.instance쿼리가 차단되고 /var/log/kern.log예상대로 로그 항목이 표시됩니다.

시도하면 dig some.domain -t any @elastic.ip.on.nlb요청이 차단되지 않고 응답을 받습니다. 에 로그 항목이 없습니다 kern.log.

저에게 가장 이상한 부분은 NLB를 그림에서 꺼내어 동일한 탄력적 IP를 인스턴스에 직접 할당하려고 시도했다는 것입니다. 동일한 결과 - 위의 규칙이 적용되어도 에 ANY전송된 쿼리가 EIP삭제되지 않습니다 iptables. ANY대신 프라이빗 IP를 사용하여 다른 인스턴스에서 전송된 동일한 쿼리가 EIP예상대로 삭제됩니다.

nat나는 (체인 사용 PREROUTING) 테이블과 filter(체인 사용 ) 테이블 에서 동일한 규칙을 시도했습니다 INPUT. 내 iptables규칙 에서 명백한 내용을 놓치고 있습니까 ?

다른 아이디어가 있나요?

답변1

ServerFault를 살펴보면서 다음 답변을 찾았습니다.iptables는 16진수 문자열 일치로 패킷을 삭제합니다.16진수 값 사이의 공백을 표시하는 경우 다음과 같이 시도해 보는 것이 좋습니다.

해당 질문의 예:

$ iptables --append INPUT --match string --algo kmp \
    --hex-string '|f4 6d 04 25 b2 02 00 0a|' --jump ACCEPT

따라서 예를 다음과 같이 변경하십시오.

$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
    --hex-string "|00 00 FF 00 01|" --algo bm --from 40 -j DROP

답변2

알았어 그럼 나중에많은몇 시간 동안 문제를 해결한 결과, 짧은 대답은 계속해서 작동하고 있었다는 것 같습니다...

NLB( tcpdump udp port 53 -X -nn) 뒤의 EC2 인스턴스에서 tcpdump를 실행했습니다. 그런 다음 내 Macbook(Catalina 10.15.2)에서 실행했는데 dig some.domain -t any @elastic.ip.on.nlb응답을 받았을 뿐만 아니라 EC2 인스턴스의 패킷 캡처에 쿼리가 표시되지도 않았습니다. 발굴 쿼리에 사용한 탄력적 IP를 사용하는 NLB 뒤에는 EC2 인스턴스가 하나만 있습니다. 완전히 이상해진 나는 Ubuntu 시스템과 Windows 10 컴퓨터에서 동일한 dig 명령을 실행했습니다. 두 쿼리 모두 시간 초과되었으며(iptables로 적절하게 필터링됨) tcpdump에서 확인했으며 로그 메시지는 예상대로 /var/log/kern.log에 있었습니다. 내 Macbook으로 돌아가서 동일한 dig 명령을 실행했는데 여전히 응답이 반환되고 tcpdump에는 아무것도 반환되지 않습니다... 뭐!

나는 Macbook을 재부팅하고, 올바른 IP와 동일한 쿼리를 사용하고 있는지 백만 번째로 확인하고, 다른 도메인을 시도했고, 아마도 수백 가지 다른 것들을 시도했습니다. 내 Macbook에서 오는 패킷 캡처에 아무것도 없는 응답을 반환하는 것처럼 보이는 이유가 무엇인지 완전히 알 수 없습니다.

따라서 궁극적으로 이는 이상하게 고립된 문제(어쩌면 Apple의 일부 오류가 계속 발생하고 있을 수도 있음...)처럼 보이며 AWS에서 수행하는 이상한 패킷 맹글링이나 처음 생각했던 것처럼 망가진 iptables 규칙이 아닌 것 같습니다. 따라서 실제 대답은 StackExchange에 게시하기 전에 여러 컴퓨터에서 사용해 보는 것입니다.

편집: 명확히 하기 위해. EIP가 아닌 인스턴스의 퍼블릭 IP를 사용하는 경우 Macbook의 tcpdump에 쿼리가 표시되고 예상대로 시간 초과가 발생합니다. EIP에서만 쿼리가 표시되지 않고 응답이 반환됩니다.

또한 이것이 답변 게시물이어야 하는지 아니면 초기 게시물을 수정했어야 했는지 잘 모르겠습니다. 모드는 당신이 원하는대로 할 수 있습니다!

관련 정보