iptables 是否应该阻止 websocket 连接的 RST 数据包?

iptables 是否应该阻止 websocket 连接的 RST 数据包?

我有以下设置用于卸载 SSL 和运行家庭助理:

  • Raspberry pi A(型号 3,以下为 10.0.0.21)正在运行 apache2、NextCloud 和 iptables。
  • Raspberry pi B(型号 1,以下为 10.0.0.69)正在运行家庭助理(原始安装,没有添加集成,仅跟踪运行家庭助理配套应用程序的一部 iPhone)

我的调制解调器将来自互联网的流量端口转发到 Pi A,在那里它卸载 SSL,然后将流量发送到本地 Nextcloud 或运行家庭助理的 pi B。我用来卸载 SSL 并将流量转发到家庭助理的配置是:

<IfModule mod_ssl.c>
<VirtualHost _default_:8443>
    LogLevel debug
    ErrorLog ${APACHE_LOG_DIR}/ssl_proxy_error.log
    CustomLog ${APACHE_LOG_DIR}/ssl_proxy_access.log combined

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/mysite/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mysite/privkey.pem

    <Proxy *>
        Allow from localhost
    </Proxy>

    Header add Connection "Upgrade"
    RequestHeader set Connection "Upgrade"

    ProxyPass        / http://10.0.0.69:8123/
    ProxyPassReverse / http://10.0.0.69:8123/

    RewriteEngine on
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule /(.*) ws://10.0.0.69:8123/$1 [P,L]

    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
    RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS}
</VirtualHost>
</IfModule>

在Pi A中的iptables中,将流量转发到Pi B上的家庭助理的相关规则是:

# Generated by xtables-save v1.8.2
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:LOG_AND_DROP - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 10.0.0.0/16 -m state --state NEW -m comment --comment "Allow DMZ" -j ACCEPT
-A INPUT -s 109.32.0.0/13 -m state --state NEW -m comment --comment "Allow KPN" -j ACCEPT
...
-A INPUT -s 83.163.0.0/16 -m state --state NEW -m comment --comment "Allow xs4all" -j ACCEPT
-A INPUT -j LOG_AND_DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j LOG_AND_DROP
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
-A OUTPUT -j LOG_AND_DROP
-A LOG_AND_DROP -m limit --limit 5/min -j LOG --log-prefix "Source host denied "
-A LOG_AND_DROP -j DROP
COMMIT

自从添加了家庭助理 pi 后,我发现 Pi A 上的 iptables 阻止了大量 RST 数据包。这些数据包来自 Pi B(家庭助理 pi),并以“源主机被拒绝”前缀记录。我大约每 20 秒看到一次这些日志,这可能是因为 iptables 的日志和丢弃规则中的速率限制。它们看起来像这样:

Apr 29 09:48:37 piA kernel: [7261534.851749] Source host denied IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:28:00:00:40:00:40:06:26:77 SRC=10.0.0.69 DST=10.0.0.21 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=8123 DPT=43686 WINDOW=0 RES=0x00 RST URGP=0

经过一番谷歌搜索后,我怀疑这些数据包可能有两个原因:

  1. ACK/RST 洪水攻击。这不太可能,因为我在 iptables 中没有看到其他大量流量,并且转发的端口超过 40.000 范围,因此不太可能成为目标。调制解调器上的流量通常很低,我在 iptables 日志中没有看到大量拒绝(除非它们被 RST 日志和日志速率限制淹没)。
  2. 我的手机、运营商网络、调制解调器或 Pi A 正在切断从我手机上的家庭助理配套应用程序打开的 websocket 连接,以某种方式导致发送 ACK,从而导致家庭助理发出 RST。

在 pi B 上:运行sudo tcpdump -nn -c 300 -i enxb827eb0b58da | grep 8123(grep 仅过滤往返于端口 8123 的流量,请参阅上面的 iptables 日志)我看到以下内容:

13:48:57.514986 IP 10.0.0.69.8123 > 10.0.0.21.44022: Flags [F.], seq 1436924275, ack 2384595600, win 1005, options [nop,nop,TS val 1950188584 ecr 1262794418], length 0
13:48:57.565543 IP 10.0.0.21.44022 > 10.0.0.69.8123: Flags [.], ack 1, win 501, options [nop,nop,TS val 1262869497 ecr 1950188584], length 0
13:48:57.772090 IP 10.0.0.69.8123 > 10.0.0.21.44024: Flags [F.], seq 1197293903, ack 4042210488, win 1002, options [nop,nop,TS val 1950188841 ecr 1262794678], length 0
13:48:57.815521 IP 10.0.0.21.44024 > 10.0.0.69.8123: Flags [.], ack 1, win 500, options [nop,nop,TS val 1262869747 ecr 1950188841], length 0
13:49:20.512688 IP 10.0.0.69.8123 > 10.0.0.21.43830: Flags [P.], seq 930768631:930768633, ack 1366378890, win 1009, options [nop,nop,TS val 1950211581 ecr 1262837177], length 2
13:49:20.513589 IP 10.0.0.21.43830 > 10.0.0.69.8123: Flags [.], ack 2, win 501, options [nop,nop,TS val 1262892444 ecr 1950211581], length 0
13:49:20.913549 IP 10.0.0.21.43830 > 10.0.0.69.8123: Flags [P.], seq 1:7, ack 2, win 501, options [nop,nop,TS val 1262892844 ecr 1950211581], length 6
13:49:20.913722 IP 10.0.0.69.8123 > 10.0.0.21.43830: Flags [.], ack 7, win 1009, options [nop,nop,TS val 1950211982 ecr 1262892844], length 0
13:49:21.715924 IP 10.0.0.21.43990 > 10.0.0.69.8123: Flags [F.], seq 4244003455, ack 2737788983, win 501, options [nop,nop,TS val 1262893647 ecr 1945760001], length 0
13:49:21.716101 IP 10.0.0.69.8123 > 10.0.0.21.43990: Flags [R], seq 2737788983, win 0, length 0
13:49:42.885341 IP 10.0.0.69.8123 > 10.0.0.21.44026: Flags [F.], seq 1290966553, ack 3680514599, win 1002, options [nop,nop,TS val 1950233954 ecr 1262838859], length 0
13:49:42.935887 IP 10.0.0.21.44026 > 10.0.0.69.8123: Flags [.], ack 1, win 500, options [nop,nop,TS val 1262914867 ecr 1950233954], length 0

这里我注意到了10.0.0.21.43990 > 10.0.0.69.8123: Flags [F.](FIN),后面跟着10.0.0.69.8123 > 10.0.0.21.43990: Flags [R](RST)。根据我在 TCP 上找到的信息,我期望的是 FIN/ACK,而不是 RST。

我的问题是:
如何找到这些 RST 数据包的原因,以及我应该如何处理它们,阻止还是允许?

相关内容