![如何(在容器内)将请求从 0.0.0.0 转发到 127.0.0.1](https://linux22.com/image/786508/%E5%A6%82%E4%BD%95%EF%BC%88%E5%9C%A8%E5%AE%B9%E5%99%A8%E5%86%85%EF%BC%89%E5%B0%86%E8%AF%B7%E6%B1%82%E4%BB%8E%200.0.0.0%20%E8%BD%AC%E5%8F%91%E5%88%B0%20127.0.0.1.png)
寻找如何从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
以进行调试。
但是,当不使用--headless
switch 时,google-chrome
则会完全忽略另一个:--remote-debugging-address=0.0.0.0
switch 并默认启动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:端口应该改变)。