iptables 丢弃指向 localhost 的 cURL

iptables 丢弃指向 localhost 的 cURL

我正在尝试在 shell 上使用 cURL 连接到 localhost。我使用curl http://localhost:80进行连接。不幸的是,它被 iptables 阻止了。以下是 iptables 日志中的错误,原因如下:

IPTables-Dropped: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=80 DPT=58617 WINDOW=32768 RES=0x00 ACK SYN URGP=0

这是 iptables:

iptables -L -v
Chain INPUT (policy DROP 314 packets, 19725 bytes)
 pkts bytes target     prot opt in     out     source               destination
30731 4342K ACCEPT     all  --  eth0   any     anywhere             anywhere             state RELATED,ESTABLISHED
  255 31984 ACCEPT     all  --  eth1   any     anywhere             anywhere             state RELATED,ESTABLISHED
    6   360 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:https
  207 28142 ACCEPT     tcp  --  any    any     localhost.localdomain  anywhere             tcp dpt:6379
  173  9634 ACCEPT     tcp  --  any    any     localhost.localdomain  anywhere             tcp spt:6379

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 31748 packets, 2974K bytes)
 pkts bytes target     prot opt in     out     source               destination

我认为我已经将问题缩小到 cURL 似乎使用的目标端口不是 80。每次我发出新的 cURL 请求时,它也会发生变化。您可以在日志条目中看到这一点:SPT=80 DPT=58617。解决这个问题(我想)应该可以解决问题。

一些说明:

  • 运行 Debian Wheezy
  • Web 服务器是 nginx
  • 从本地主机到本地 Redis 服务器的连接工作正常。

更新:添加以下规则-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT可修复此问题。允许基于源端口而非目标端口的连接是否存在安全问题?

答案1

RELATED,ESTABLISHED只有针对接口 eth0 和 eth1 的规则,因此 Web 服务器对 cURL 连接请求的响应将被 iptables 丢弃,因为它不被任何规则接受。更改规则RELATED,ESTABLISHED使其适用于所有接口应该可以解决问题。

不要使用接受流量的规则除非你出于非常特殊的原因需要它们,否则请指定特定的源端口:制定一条接受所有流量的规则端口 80 意味着任何人都可以连接到你的任何服务,只要他/她可以打开连接端口 80(对于任何攻击者来说都是小菜一碟)。

相关内容