防止对 127.0.0.1 的请求转发到 http_proxy

防止对 127.0.0.1 的请求转发到 http_proxy

我的机器上有这个:

$ cat /etc/profile.d/proxy.sh 
export http_proxy=http://192.168.1.30:3128
export https_proxy=https://192.168.1.30:3128

这非常有效,直到我需要在本地主机上的应用程序中使用 HTTP 接口。

$ wget localhost
--2023-03-02 06:54:52--  http://localhost/
Connecting to 192.168.1.30:3128... connected.
Proxy request sent, awaiting response... 503 Service Unavailable
2023-03-02 06:54:52 ERROR 503: Service Unavailable.

$ wget 127.0.0.1
--2023-03-02 06:55:20--  http://127.0.0.1/
Connecting to 192.168.1.30:3128... connected.
Proxy request sent, awaiting response... 403 Forbidden
2023-03-02 06:55:20 ERROR 403: Forbidden.

有没有办法阻止localhost请求127.0.0.1转发到代理?


细节:

这台机器没有直接连接到互联网。它没有网关或默认路由。但它位于具有代理计算机 (192.168.1.30) 的 LAN 上,该代理计算机安装了代理服务器(端口 3128)并具有 Internet 连接。

$ ip addr
1: lo: ...
    inet 127.0.0.1/8 scope host lo
2: eno1: ...
    altname enp24s0f0
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eno1

$ ip route
192.168.1.0/24 dev eno1 proto kernel scope link src 192.168.1.100

$ cat /etc/hosts
127.0.0.1   localhost

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

auto eno1
iface eno1 inet static
    address 192.168.1.100
    netmask 255.255.255.0

答案1

wget手册页:

环境

Wget 支持 HTTP 和 FTP 检索代理。 Wget 可识别的指定代理位置的标准方法是使用以下环境变量:

http_代理https_代理

如果设置,http_proxy 和 https_proxy 变量应分别包含 HTTP 和 HTTPS 连接的代理 URL。

ftp_代理

该变量应包含 FTP 连接代理的 URL。 http_proxy 和 ftp_proxy 设置为相同的 URL 是很常见的。

无代理

该变量应包含以逗号分隔的域扩展代理列表不是用于.例如,如果 no_proxy 的值为.mit.edu,则代理将不会用于从 MIT 检索文档。

所以,你应该将你的更改/etc/profile.d/proxy.sh为:

export http_proxy=http://192.168.1.30:3128
export https_proxy=https://192.168.1.30:3128
export no_proxy="127.0.0.1,localhost"

如果您有一个不使用*_proxy环境变量的 GUI Web 浏览器,那么您可以创建一个代理自动配置文件,为文件命名proxy.pac,让本地 HTTP 服务器为其提供 MIME 类型application/x-ns-proxy-autoconfig

然后,通过在桌面环境或 Web 浏览器的代理设置中指定代理自动配置 URL http://localhost/some/where/proxy.pac(甚至可能),将您的桌面环境和/或 Web 浏览器配置为使用该自动配置文件。file:///some/location/proxy.pac

在您的情况下,文件的内容可能是:

function FindProxyForURL(url, host)
{
    // If not a http: or https: URL, go direct always.
    if (!shExpMatch(url,"http*") {
        return "DIRECT";
    }

    // If the destination is:
    // - any 127.*.*.* address
    // - or anything like "localhost*"
    // - or the web browser host's own IP address
    // Then go direct to destination.

    else if (shExpMatch(host, "127.*")
        || shExpMatch(host, "localhost*")
        || host == myIpAddress()) {
        return "DIRECT";
    }
    else {
        // Otherwise, use the proxy specified here.
        return "PROXY 192.168.1.30:3128";
    }
}

相关内容