iptables는 ACK 플래그 없이 TCP 재설정을 거부합니다.

iptables는 ACK 플래그 없이 TCP 재설정을 거부합니다.

나는 iptables규칙을 만들었습니다:

iptables -I INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN --dport 10000 -j REJECT --reject-with tcp-reset

그러나 실제로 이것이 수행하는 작업은 RST및 플래그가 있는 모든 ACK패킷을 거부하는 것입니다.

플래그가 설정된 경우에만 거부가 가능한가요 RST?

일반적인 환경에서는 이것이 의미가 없다는 것을 알고 있지만 설명된 대로 정확히 수행해야 하는 실습이 있습니다.

답변1

저는 중국에 있으므로 이 작업을 수행하기 전에 dig +tcp twiter.com @1.1.1.1다음 두 줄을 실행해야 합니다.

sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST,ACK -j DROP
sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST -j DROP

그러면 나는 정답을 얻게 될 것이다:

;; ANSWER SECTION:
twitter.com.        204 IN  A   104.244.42.65

첫 번째 명령을 실행하면 iptables채굴이 실패합니다.

";; communications error to 1.1.1.1#53: connection reset"

중국의 만리방화벽아주 이상한...

답변2

인바운드 RST 패킷을 삭제하려면,

  iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK  --dport 10000 -j DROP

아웃바운드 RST 패킷을 삭제하려면

  iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP

몇 년 전:

URL:https://networkengineering.stackexchange.com/questions/2012/why-do-i-see-a-rst-ack-packet-instead-of-a-rst-packet

SYN/ACK가 정확하게 SYN을 승인하지 않는 것처럼 RST/ACK는 RST를 승인하지 않습니다. TCP 설정은 실제로 4방향 프로세스입니다. 시작 호스트는 수신 호스트에 SYN을 보내고 수신 호스트는 SYN에 대한 ACK를 보냅니다. 수신 호스트는 시작 호스트에 SYN을 보내고 시작 호스트는 ACK를 다시 보냅니다. 이는 상태 통신을 설정합니다.

SYN --> 
    <-- ACK
    <-- SYN
ACK -->

효율성을 높이기 위해 수신 호스트는 SYN을 확인하고 동일한 패킷으로 자체 SYN을 보내 우리가 익숙한 3방향 프로세스를 생성할 수 있습니다.

SYN -->
    <-- SYN/ACK
ACK -->

RST/ACK의 경우 장치는 시퀀스의 이전 패킷에서 전송된 모든 데이터를 ACK로 승인한 다음 RST를 통해 연결이 종료되었음을 보낸 사람에게 알립니다. 장치는 SYN/ACK처럼 두 개의 패킷을 하나의 패킷으로 병합합니다. RST/ACK는 일반적으로 TCP 세션 종료에 대한 일반적인 응답이 아니지만 반드시 문제를 나타내는 것은 아닙니다.

관련 정보