我正在尝试在 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(对于任何攻击者来说都是小菜一碟)。