Gow*_*vam 5 proxy iptables transparent-proxy containers docker
我在主机上运行了一对 docker 容器,这些容器一起使我的应用程序得以实现。因此,对于我的应用程序的每次迭代/实例,都需要运行一对 docker 容器。到目前为止,我在运行第二个容器时使用 --link 参数来链接第一个容器,并从主机文件中获取第一个容器的 IP 以便以编程方式使用它。
现在,我需要为第二个 docker 容器设置透明代理。这样,第二个容器的所有 http(端口 80)流量都应该通过第一个容器的端口 8080。
第一个容器 IP:172.17.0.4 (在端口8080上运行代理服务)。第二个容器IP:172.17.0.6(有浏览器等客户端工具)。我想将172.17.0.6的所有 http 流量(端口80)转发到172.17.0.4的端口8080。
即)流量到 172.17.0.4 的 80 <---> 172.17.0.6 的 8080
我尝试在第二个容器中添加 iptables 规则以进行上述配置。但它们都不起作用。
~# sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080
Run Code Online (Sandbox Code Playgroud)
不起作用。
~# sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080
Run Code Online (Sandbox Code Playgroud)
不起作用。
~# sudo iptables -t nat -A POSTROUTING -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何在 docker 容器内配置透明代理,将指定端口的所有流量转发到另一个容器的端口?
PS: 如果我手动将代理设置添加到第二个容器中的浏览器中。它运行良好。但我想为整个容器设置透明代理,而不仅仅是浏览器。以便来自第二个容器内的任何工具的任何网络请求都将转发到第一个容器的代理端口。
我读过一些关于使用 nginx/HAProxy 反向代理一起运行的所有容器的教程。但我想将单个容器与其自己的代理容器配置为一对。
谢谢大家抽出时间来回答。基本上我想做的是代理第二个容器的传出/发起流量(注意:我不是尝试代理传入流量,因此不能使用 Apache mod_proxy 或 Nginx proxy_pass。这些模块适用于传入流量)。第一个容器在端口 8080 上运行代理服务。
正如 Thierno 建议的那样,我可以使用 http_proxy 和 https_proxy ENV 变量来代理传出流量,但不幸的是,并非操作系统中运行的所有应用程序/服务都遵循这些 http_proxy 和 https_proxy ENV 变量。有些应用程序会强制跳过代理设置。这就是我想使用iptables 来执行流量规则的原因。因此,任何应用程序/服务都不能跳过代理。
我在之前的问题设置中犯的错误是,我试图将传入流量路由到代理服务器的端口 80 到 8080。由于第一个容器没有任何传入流量,因此它无法工作,并且通过 PREROUTE/POSTROUTE 流量来实现我想要的效果在逻辑上是错误的。为了路由发起/传出流量,我们需要使用iptables 的OUTPUT 链。
我使用 RedSocks 与 iptables 组合来强制代理服务器的完整传出流量。这是我使用的 iptables 配置:
# 为 RedSocks 创建新链
root# iptables -t nat -N REDSOCKS
Run Code Online (Sandbox Code Playgroud)
# 忽略 LAN 和其他一些保留地址
root# iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
root# iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
root# iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
root# iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
root# iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
root# iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
Run Code Online (Sandbox Code Playgroud)
# 将所有http重定向到redsocks本地端口
root# sudo iptables -t nat -A REDSOCKS -p tcp --dport 80 -j REDIRECT --to-ports 12345
Run Code Online (Sandbox Code Playgroud)
# 对于 https 流量,只需将端口 80 替换为 443
# 对 eth0 上的所有传出流量使用所有 REDSOCKS 链
root# sudo iptables -t nat -A OUTPUT -p tcp -o eth0 -j REDSOCKS
Run Code Online (Sandbox Code Playgroud)
现在,配置 redsocks 监听本地端口 12345 的传入流量,并将其转发到代理服务器的 IP 和端口。要执行此操作,请像这样编辑 redsocks.conf ,
redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = 172.17.0.4;
port = 8080;
type = http-relay;
}
Run Code Online (Sandbox Code Playgroud)
只需保存conf并重新启动redsocks服务即可。现在,来自第一个容器的所有传出流量都将强制使用代理。(注意:我使用 iptables-persistent 在服务器重新启动时保留规则)实际上,我通过在 iptables 配置中添加另一行来对 http 和 https 流量实现相同的规则。尽管它不是透明代理,但它为我完成了这项工作。
归档时间: |
|
查看次数: |
7634 次 |
最近记录: |