Linux

iptables 刪除了到 localhost 的 cURL

  • May 6, 2015

我正在嘗試在外殼上使用 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(對於任何攻擊者來說都是微不足道的)。

引用自:https://serverfault.com/questions/689875