双网卡RHEL8服务器Docker化应用路由及HTTP代理配置咨询
Docker双网卡强制走代理配置方案
Docker守护进程配置的可行性
Docker守护进程本身支持代理配置,但仅能覆盖部分场景:
- 配置的
HTTP_PROXY/HTTPS_PROXY环境变量,首先会作用于Docker daemon自身的镜像拉取操作,满足你eth0走代理下载镜像的需求。 - 同时可以配置默认注入到所有新创建容器的代理环境变量,支持读取系统代理变量的应用可以直接生效,无需单独配置。
但该方案无法覆盖原生不支持代理配置的应用,这类应用不会读取环境变量,因此无法强制其流量走代理。
Docker daemon代理配置方式如下:
- 创建daemon代理配置目录:
mkdir -p /etc/systemd/system/docker.service.d - 编辑配置文件
/etc/systemd/system/docker.service.d/http-proxy.conf:
[Service] Environment="HTTP_PROXY=http://<squid代理IP>:<squid端口>" "HTTPS_PROXY=http://<squid代理IP>:<squid端口>" "NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
- 重载配置并重启Docker:
systemctl daemon-reload systemctl restart docker
如果需要默认给所有容器注入代理环境变量,可以在/etc/docker/daemon.json中添加以下配置后重启Docker:
{ "proxies": { "default": { "httpProxy": "http://<squid代理IP>:<squid端口>", "httpsProxy": "http://<squid代理IP>:<squid端口>", "noProxy": "localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" } } }
iptables方案的实现逻辑
iptables可以实现透明代理,完全覆盖不支持代理配置的应用需求,无需修改任何应用代码,配置逻辑如下:
前置配置
首先开启内核IP转发:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
同时修改squid配置文件squid.conf,开启透明代理模式:
把默认的http_port 3128改为http_port 3128 transparent,之后重启squid服务。
iptables规则配置
# 放行eth1网卡和Docker网络之间的双向流量,不影响用户访问业务 iptables -A FORWARD -i eth1 -o docker0 -j ACCEPT iptables -A FORWARD -i docker0 -o eth1 -j ACCEPT # 内网地址段流量不走代理,直接放行 iptables -t nat -A PREROUTING -i docker0 -d 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -j RETURN # 将容器发起的80、443端口TCP流量重定向到squid代理端口 iptables -t nat -A PREROUTING -i docker0 -p tcp --dport 80 -j REDIRECT --to-port 3128 iptables -t nat -A PREROUTING -i docker0 -p tcp --dport 443 -j REDIRECT --to-port 3128
规则配置完成后保存生效:
iptables-save > /etc/sysconfig/iptables
配置注意事项
- 如果存在非HTTP/HTTPS的对外请求(比如SMTP发邮件、FTP传输等),squid无法代理这类流量,可以搭配redsocks实现全端口TCP流量的透明代理。
- 需要确认系统路由配置:默认路由走eth0,eth1网卡对应的业务网段配置单独的静态路由,避免用户访问业务的流量出现回包路径错误。
- 测试阶段可以先给iptables加日志规则,排查流量走向是否符合预期,避免影响现有业务。
内容的提问来源于stack exchange,提问作者potofski
相关产品推荐
相关产品推荐

