如何(在容器内)将请求从 0.0.0.0 转发到 127.0.0.1

如何(在容器内)将请求从 0.0.0.0 转发到 127.0.0.1

寻找如何从0.0.0.0:9222 --> 127.0.0.1:9222容器内部转发请求的解决方案

我正在使用已安装的 Docker 容器google-chrome-stable来运行视觉测试。

root@6bb8678b29f5:/# google-chrome-stable --version
Google Chrome 114.0.5735.90 

也许这就是完全合理google-chrome在不使用 的情况下从命令行启动时会监听不同的地址--headless,但这会阻止我在编写测试时跟踪测试。因此,有时我需要关闭--headless以进行调试。

但是,当不使用--headlessswitch 时,google-chrome则会完全忽略另一个:--remote-debugging-address=0.0.0.0switch 并默认启动DevTools并监听127.0.0.1连接。然后测试运行器无法连接到DevTools

Connecting to 172.22.0.13:9222... failed: Connection refused.

所以我的想法是为 DEV 环境设置端口转发,但我无法真正让它工作

我尝试过这个:

iptables -t nat -A PREROUTING -p tcp --dport 9222 -j DNAT --to-destination 127.0.0.1:9222
iptables -t nat -A POSTROUTING -p tcp -d 0.0.0.0 --dport 9222 -j SNAT --to-source 127.0.0.1

...请求没有立即被拒绝但仍然没有连接。

--2023-06-05 13:14:16--  http://172.22.0.13:9222/json/version
Connecting to 172.22.0.13:9222... failed: Connection timed out.
Retrying.

--2023-06-05 13:16:28--  (try: 2)  http://172.22.0.13:9222/json/version
Connecting to 172.22.0.13:9222... failed: Connection timed out.
Retrying.

我希望在这方面有更多经验的人能给我一些提示:)

谢谢 !! 。

编辑

我发现自己处于情况“2”,当chrome-stable在容器内启动时--headless,没有绑定(默认情况下)在127.0.0.1地址上,而不是0.0.0.0

设置的直观图

root@c877116fd92a:/# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:9222          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.11:35045        0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN     
tcp6       0      0 :::5900                 :::*                    LISTEN     
udp        0      0 127.0.0.11:52971        0.0.0.0:*                          
udp        0      0 224.0.0.251:5353        0.0.0.0:*      
root@0442b7974e78:/# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
root@0442b7974e78:/# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            127.0.0.1            tcp dpt:9222

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER_OUTPUT  all  --  0.0.0.0/0            127.0.0.11          

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER_POSTROUTING  all  --  0.0.0.0/0            127.0.0.11          

Chain DOCKER_OUTPUT (1 references)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            127.0.0.11           tcp dpt:53 to:127.0.0.11:44889
DNAT       udp  --  0.0.0.0/0            127.0.0.11           udp dpt:53 to:127.0.0.11:41070

Chain DOCKER_POSTROUTING (1 references)
target     prot opt source               destination         
SNAT       tcp  --  127.0.0.11           0.0.0.0/0            tcp spt:44889 to::53
SNAT       udp  --  127.0.0.11           0.0.0.0/0            udp spt:41070 to::53


更多细节在启动时的输出google-chrome

root@6bb8678b29f5:/# /usr/bin/google-chrome-stable --disable-gpu --remote-debugging-address=0.0.0.0 --remote-debugging-port=9222 --no-sandbox --window-size="1920,1080" --disable-dev-shm-usage --no-startup-window --no-first-run --start-maximized --disable-extensions --disable-infobars --user-data-dir=/var/tmp/chrome --log-level=3
[737:737:0605/110543.181892:ERROR:browser_dm_token_storage_linux.cc(100)] Error: /etc/machine-id contains 0 characters (32 were expected).

DevTools listening on ws://127.0.0.1:9222/devtools/browser/3db57e4b-403f-42cc-a385-b4d6b031a753
root@6bb8678b29f5:/# /usr/bin/google-chrome-stable --headless --disable-gpu --remote-debugging-address=0.0.0.0 --remote-debugging-port=9222 --no-sandbox --window-size="1920,1080" --disable-dev-shm-usage --no-startup-window --no-first-run --start-maximized --disable-extensions --disable-infobars --user-data-dir=/var/tmp/chrome --log-level=3 

DevTools listening on ws://0.0.0.0:9222/devtools/browser/7448953b-8da1-4d13-8621-91ebbec8d3f4

答案1

Docker 容器有一些端口转发/NATing,可以帮助实现自动化。

但如果你想用困难的方式来做到这一点......

该地址0.0.0.0通常不用作源地址(例如 DHCP 发现正在使用它)。当服务侦听时,0.0.0.0意味着它正在侦听所有可用接口,但实际上只侦听本地接口上配置的 IP 地址。

在 Netfilter 防火墙中,您可以将所有以特定端口为目标的 TCP+UDP 流量转发/NAT 到另一个 IP:端口对。以本地接口为目标的传入流量不会通过(PRE|POST)ROUTING链/表,而是通过INPUT

为了进行调试,sudo iptables -L -nv您可以查看 Netfilter 规则匹配的次数。

不要害怕使用 2 个tcpdump命令,一个用于传入数据包,一个用于 NAT 数据包并过滤您期望的细节(在这种情况下,目标 IP:端口应该改变)。

相关内容