我正在尝试在外壳上使用 cURL 连接到本地主机。我是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
- 网络服务器是 nginx
- 从 localhost 到本地 Redis 服务器的连接工作正常。
更新:添加以下规则-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
可解决问题。允许基于源端口而不是目标端口的连接是否存在安全问题?
您
RELATED,ESTABLISHED
只有接口 eth0 和 eth1 的规则,因此 web 服务器对 cURL 连接请求的回答将被 iptables 丢弃,因为它不被任何规则接受。更改RELATED,ESTABLISHED
规则使其适用于所有接口应该可以解决问题。不要使用接受来自特定源端口的流量的规则,除非您出于非常特定的原因需要它们:拥有接受来自端口 80 的所有流量的规则意味着任何人都可以连接到您的任何服务,如果他/她可以打开连接端口 80(对于任何攻击者来说都是微不足道的)。