为什么docker主机上的Jenkins响应来自容器内部的HTTP请求?

我在安装了Jenkins和Docker的机器上遇到了一些相当奇怪的行为。 为了清晰起见,Jenkins不是作为Docker容器运行,而是在jenkins用户下运行。

当在容器中运行curl时,我得到一个403:

 root@ada71c8116bf:/# curl -I www.google.co.uk HTTP/1.1 403 Forbidden Date: Tue, 30 May 2017 13:41:07 GMT X-Content-Type-Options: nosniff Set-Cookie: JSESSIONID.f1223778=36hjq9sozhveoe1bfsss1dnq;Path=/;HttpOnly Expires: Thu, 01 Jan 1970 00:00:00 GMT Content-Type: text/html;charset=UTF-8 X-Hudson: 1.395 X-Jenkins: 2.46.3 X-Jenkins-Session: 2836b130 X-You-Are-Authenticated-As: anonymous X-You-Are-In-Group-Disabled: JENKINS-39402: use -Dhudson.security.AccessDeniedException2.REPORT_GROUP_HEADERS=true or use /whoAmI to diagnose X-Required-Permission: hudson.model.Hudson.Read X-Permission-Implied-By: hudson.security.Permission.GenericRead X-Permission-Implied-By: hudson.model.Hudson.Administer Content-Length: 793 Server: Jetty(9.2.z-SNAPSHOT) 

在主机的容器之外,我得到了预期的回应:

 $ curl -I www.google.co.uk HTTP/1.1 200 OK Date: Tue, 30 May 2017 13:40:17 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=ISO-8859-1 P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info." Server: gws X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Set-Cookie: NID=104=mMKjBy002X3N_SkhkD_8xuAwpFuw03CFi0iOJjNX81FUHfMT6qTq95LcgRwdhrV_GZoUF9LQ1B9qAQPriN9Er3Bu2JWoqPgvt16TduuVj5QsNs9GiJTQBtaSXWic7G9E; expires=Wed, 29-Nov-2017 13:40:17 GMT; path=/; domain=.google.co.uk; HttpOnly Transfer-Encoding: chunked Accept-Ranges: none Vary: Accept-Encoding 

jenkins显然是责怪,但我不知道为什么它会拦截HTTPstream量离开容器。 ping Google工作正常,发送HTTPS请求也是如此。 没有其他机器拥有这个问题(大概是因为他们没有安装jenkins)。 那么,这是怎么回事? 我如何让Jenkins停止拦截来自Docker容器的HTTP?

更新

closuresjenkins的“防止跨站请求伪造漏洞”选项导致jenkins不再返回403s。 相反,Jenkins用仪表板页面(即默认页面)响应来自容器内的任何HTTP请求。

另外值得注意的是,DNS工作正常。 主机名parsing为正确的IP地址。

我要走出Wireshark。

通过使用Wireshark,我发现有东西将HTTPstream量redirect到主机上的端口8090。 一个幸运的谷歌让我检查主机的IP表( iptables -t nat -L -n ),当然有规则将所有端口80的stream量从任何地方redirect到主机的8090端口。 为了Jenkins用户的利益,有人已经明确设置了这个redirect。

解决方法是更改​​IP表,以不redirect来自泊坞子子网的stream量。

之前的表格:

 $ sudo iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 8090 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination REDIRECT tcp -- 0.0.0.0/0 127.0.0.1 tcp dpt:80 redir ports 8090 DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 Chain DOCKER (2 references) target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0 

命令改变:

 $ sudo iptables -t nat -R PREROUTING 1 ! -s 172.17.0.0/16 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8090 $ sudo iptables -t nat -R OUTPUT 1 ! -s 172.17.0.0/16 -d 127.0.0.1/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8090 

结果IP表格:

 $ sudo iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- !172.17.0.0/16 0.0.0.0/0 tcp dpt:80 redir ports 8090 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination REDIRECT tcp -- !172.17.0.0/16 127.0.0.1 tcp dpt:80 redir ports 8090 DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 Chain DOCKER (2 references) target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0 
Interesting Posts