适用于IPv6但不适用于IPv4的Docker端口转发

时间:2019-10-26 18:21:12

标签: docker networking docker-compose portforwarding

我有以下非常简单的docker-compose.yml,可在Mac上运行:

version: "3.7"
services:
  apache:
    image: httpd:2.4.41
    ports:
      - 80:80

我运行docker-compose up,然后运行此curl,Apache返回内容:

/tmp/test $ curl -v http://localhost
*   Trying ::1:80...
* TCP_NODELAY set
* Connected to localhost (::1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.66.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sat, 26 Oct 2019 18:30:03 GMT
< Server: Apache/2.4.41 (Unix)
< Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
< ETag: "2d-432a5e4a73a80"
< Accept-Ranges: bytes
< Content-Length: 45
< Content-Type: text/html
< 
<html><body><h1>It works!</h1></body></html>
* Connection #0 to host localhost left intact

但是,如果我尝试使用127.0.0.1而不是localhost访问容器,则会拒绝连接:

/tmp/test $ curl -v http://127.0.0.1
*   Trying 127.0.0.1:80...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.1 port 80 failed: Connection refused
* Failed to connect to 127.0.0.1 port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

Localhost确实指向127.0.0.1:

/tmp/test $ ping localhost
PING localhost (127.0.0.1): 56 data bytes

netstat显示要转发的所有本地IP地址80:

/tmp/test $ netstat -tna | grep 80
...
tcp46      0      0  *.80                   *.*                    LISTEN     
...

实际上,我尝试使用/etc/hosts文件中指向127.0.0.1的自定义域访问容器。我以为该域名有问题,但是后来我尝试了127.0.0.1,但也没有用,所以我认为关于docker的某些基本问题我没有做对。

为什么curl http://localhost工作,而curl http://127.0.0.1没有工作?

更新 似乎localhost正在解析为IPv6 :: 1,因此端口转发似乎在IPv6上有效,但在IPv4地址上不起作用。那有意义吗?

更新2 我无法修复它,但是我需要继续,所以我做了一个解决方法。由于我只想使用自定义域名访问docker容器,因此最终将我的域指向:: 1而不是/ etc / hosts文件中的127.0.0.1。我认为我不会进一步调试此问题,但是如果有人对此有很好的解释,那么知道它将会很有趣。

1 个答案:

答案 0 :(得分:1)

找到了罪魁祸首:pfctl

AFAIK,pfctl不应自动运行,但我的/System/Library/LaunchDaemons/com.apple.pfctl.plist则相反。

已将数据包过滤配置为将端口80上的所有传入流量重定向到8080,并将端口443重定向到8443。而且,在没有任何进程实际侦听端口80和443的情况下完成了此操作,这就是lsof和{{1 }}什么也不会显示。

netstat具有以下内容

/Library/LaunchDaemons/it.winged.httpdfwd.plist

解决方案只是侦听端口8080和8443。所有对端口80和443的请求现在都被透明地重定向。

在进行调试时,我发现了无数关于类似问题的未解决问题。我希望这对某人有帮助。