我需要用特定的标志阻止(在本地网络中)从特定范围的端口到另一个端口的所有流量
交通:
Transmission Control Protocol, Src Port: 50800, Dst Port: 443, Seq: 1, Ack: 1, Len: 179
Source Port: 50800
Destination Port: 443
[Stream index: 1]
[TCP Segment Len: 179]
Sequence number: 1 (relative sequence number)
[Next sequence number: 180 (relative sequence number)]
Acknowledgment number: 1 (relative ack number)
0101 .... = Header Length: 20 bytes (5)
Flags: 0x018 (PSH, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 1... = Push: Set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······AP···]
Window size value: 64400
[Calculated window size: 64400]
[Window size scaling factor: -2 (no window scaling used)]
Checksum: 0x1bcb [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
[SEQ/ACK analysis]
[iRTT: 0.212323000 seconds]
[Bytes in flight: 179]
[Bytes sent since last PSH flag: 179]
[Timestamps]
TCP payload (179 bytes)
失败的尝试:
iptables -t mangle -A PREROUTING -i eth1 -p tcp --sport 49152:65535 --dport 443 --tcp-flags PSH ACK -j REJECT --reject-with tcp-reset
或组合使用:
--tcp-flags PSH, ACK
--tcp-flags PSH,ACK PSH
或转发并输入:
iptables -I INPUT -i eth1 -p tcp --sport 49152:65535 --dport 443 --tcp-flags PSH,ACK PSH -j DROP
iptables -I FORWARD -i eth1 -p tcp --sport 49152:65535 --dport 443 --tcp-flags PSH,ACK PSH -j DROP
问题:
如何使用 iptables 规则阻止此流量?(在“流量”中描述)
PD:咨询的消息来源http://ask.wireshark.org/questions/20423/pshack-wireshark-capture
答案1
首先,设置规则的链取决于是否连接到本地框。如果应该在那里结束,则选择 INPUT。如果您需要将流量传递到另一个框,则使用 FORWARD。其次,您必须将规则添加到规则中-m tcp
才能--tcp-flags
产生效果。现在,根据要过滤的内容,您需要相应地设置标志。如果您只选择 PSH 标志(并希望忽略其余部分),则--tcp-flags PSH PSH
完全足够了。如果您需要选择 PSH/ACK,则必须将其设置为--tcp-flags PSH,ACK PSH,ACK
将两者纳入检查。您的--tcp-flags PSH,ACK PSH
检查是设置 PSH 标志和清除 ACK 标志。
至于--tcp-flags PSH ACK
,这永远不会产生肯定的结果,因为您声明检查 PSH 标志,但实际上却检查 ACK。但是,由于您忽略了这一点,因此匹配不可能成为真。
解释:
如果您通读man iptables-extensions
,您会发现它--tcp-flags
有两个参数:一个标志掩码和一个标志值。第一个参数告诉 tcp match 要检查哪些标志,而第二个参数告诉它您希望看到哪些标志被设置(其余检查的标志必须在数据包中清除)。如果数据包符合您的条件,则您命中,规则生效。如果不匹配,则为未命中,规则将被忽略。