需要 `sudo` 才能 `wget localhost`

需要 `sudo` 才能 `wget localhost`

我在连接本地 web 服务(apache2 默认网页)时遇到问题。当我使用wget服务器执行简单的 HTTP:GET 请求时,返回503 Service unavailable。但是,当我 时sudo wget,我得到200 OK

$ wget localhost
--2023-03-02 04:58:46--  http://localhost/
Connecting to 10.10.1.30:3128... connected.
Proxy request sent, awaiting response... 503 Service Unavailable
2023-03-02 04:58:46 ERROR 503: Service Unavailable.

$ wget 127.0.0.1
--2023-03-02 04:59:13--  http://127.0.0.1/
Connecting to 10.10.1.30:3128... connected.
Proxy request sent, awaiting response... 403 Forbidden
2023-03-02 04:59:13 ERROR 403: Forbidden.

$ sudo wget localhost
--2023-03-02 04:59:32--  http://localhost/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10701 (10K) [text/html]
Saving to: ‘index.html’

index.html          100%[=================>]  10.45K  --.-KB/s    in 0s      

2023-03-02 04:59:32 (365 MB/s) - ‘index.html’ saved [10701/10701]

这怎么可能?

比较一些细节:

$ wget localhost --debug                   | $ sudo wget localhost --debug
...                                        | ...
---request begin---                        | ---request begin---
GET http://localhost/ HTTP/1.1             | GET / HTTP/1.1
User-Agent: Wget/1.21                      | User-Agent: Wget/1.21
Accept: */*                                | Accept: */*
Accept-Encoding: identity                  | Accept-Encoding: identity
Host: localhost                            | Host: localhost
Connection: Keep-Alive                     | Connection: Keep-Alive
Proxy-Connection: Keep-Alive               |
---request end---                          | ---request end---
Proxy request sent, awaiting response...   | HTTP request sent, awaiting response... 
---response begin---                       | ---response begin---
HTTP/1.1 503 Service Unavailable           | HTTP/1.1 200 OK
Server: squid/3.5.28                       | Server: Apache/2.4.54 (Debian)
Mime-Version: 1.0                          | Last-Modified: Tue, 09 Aug 2022 17:13:01 GMT
Date: Thu, 02 Mar 2023 10:08:29 GMT        | Date: Thu, 02 Mar 2023 10:11:58 GMT
Content-Type: text/html;charset=utf-8      | Content-Type: text/html
Content-Length: 3718                       | Content-Length: 10701
X-Squid-Error: ERR_DNS_FAIL 0              | ETag: "29cd-5e5d20b6c3ce8"
Vary: Accept-Language                      | Vary: Accept-Encoding
Content-Language: en                       | Accept-Ranges: bytes
X-Cache: MISS from mgmt-11102              | Keep-Alive: timeout=5, max=100
Via: 1.1 mgmt-11102 (squid/3.5.28)         | 
Connection: keep-alive                     | Connection: Keep-Alive
---response end---                         | ---response end---
...

为什么我的请求会发给代理?

代理是网关/防火墙,但我很惊讶这个请求竟然离开了这台机器。 和 可以观察到类似的curl行为python3.urllib

以下是系统的一些细节

$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   host
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ cat /etc/apt/apt.conf.d/99HttpProxy 
Acquire::http::Proxy "http://10.10.1.30:3128";
Acquire::http::No-Cache true;
Acquire::http::Pipeline-Depth 0;

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 78:ac:44:56:dc:b8 brd ff:ff:ff:ff:ff:ff
    altname enp24s0f0
    inet 10.10.1.1/24 brd 10.10.1.255 scope global eno1
       valid_lft forever preferred_lft forever

$ ip route
10.10.1.0/24 dev eno1 proto kernel scope link src 10.10.1.1

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet static
address 10.10.1.1
netmask 255.255.255.0

答案1

经过一些研究我尝试了这个:

$ env | grep proxy
http_proxy=http://10.10.1.30:3128
https_proxy=https://10.10.1.30:3128

这就是导致将请求发送到代理的wget原因。curlurllib

这暂时解决了该问题:

$ unset http_proxy
$ wget localhost

我这样做是为了弄清楚它被设置在哪里:

$ cd /etc
$ grep -rw http_proxy
profile.d/proxy.sh:export http_proxy=http://10.10.1.30:3128

现在,每当我使用需要连接到本地服务器的工具时,我只需要unset该变量。然后每当我使用连接到互联网的工具时,就可以恢复它。

相关内容