如何使我的客户端(主机)在Docker容器内使用Squid代理

120次阅读
没有评论

问题描述

场景如下:他有1个客户端(IP: 192.168.0.200)和1个主机(IP: 192.168.0.15)。当客户端想要连接到互联网时,主机上会创建一个包含Squid代理的Docker容器。他已经从sameersbn/squid:latest镜像中拉取了Squid代理,并且使用了以下命令来创建容器:

docker run -d --name SQUID_192.168.0.200 -p 9001:3128 -v /home/administrator/container-data:/var/log/squid3 sameersbn/squid:latest

他还在客户端上配置了IP地址如下:

auto enp0s3
iface enp0s3 inet static
address 192.168.0.200
netmask 255.255.255.0
gateway 192.168.0.15

然后他使用iptables将数据包从192.168.0.200转发到名为SQUID_192.168.0.200的容器:

iptables -t nat -A PREROUTING -p tcp -i wlp3s0 -s 192.168.0.200 --dport 9001 -j DNAT --to-destination 172.17.0.2:3128

这里的问题包括:
1. 用户不确定在创建容器时使用-net None还是-net Host或其他选项更合适。
2. 用户不确定他的方式是否正确,能否将数据包从192.168.0.200导向容器名称为SQUID_192.168.0.200的Squid代理。
3. 尽管他已经访问了互联网(如打开google.comdetik.com),但这些访问并未在access.log中记录。

解决方案

请注意以下操作可能涉及版本差异及修改前做好备份。

方案1 – 使用Bridge网络模式

默认情况下,Docker使用Bridge网络模式,这使得容器能够在单独的网络命名空间中运行,可以与宿主机和其他容器隔离。如果你希望在容器内使用Squid代理,并且要将客户端的流量转发到容器,可以使用Bridge网络模式。

以下是在Bridge网络模式下创建Squid代理容器的步骤:

  1. 创建一个Docker网络(如果需要):
docker network create my_network
  1. 运行Squid容器并将其连接到已创建的网络:
docker run -d --name squid_proxy --network my_network -p 9001:3128 -v /home/administrator/container-data:/var/log/squid3 sameersbn/squid:latest
  1. 配置iptables规则来将客户端流量导向Squid容器。注意要替换容器的IP地址为Squid容器的实际IP地址(可以通过docker inspect squid_proxy来查找):
iptables -t nat -A PREROUTING -p tcp -i wlp3s0 -s 192.168.0.200 --dport 9001 -j DNAT --to-destination <SQUID_CONTAINER_IP>:3128

方案2 – 使用Host网络模式(仅在合适的情况下使用)

在Host网络模式下,容器将直接使用主机网络,这意味着容器将共享主机的网络命名空间,可以直接使用主机上的网络接口。但请注意,这种模式可能会引入一些安全风险,因为容器与主机共享网络,需要确保容器的安全性。

以下是在Host网络模式下创建Squid代理容器的步骤:

  1. 运行Squid容器并使用Host网络模式:
docker run -d --name squid_proxy --net host -v /home/administrator/container-data:/var/log/squid3 sameersbn/squid:latest
  1. 配置iptables规则来将客户端流量导向Squid容器。注意要替换容器的IP地址为Squid容器的实际IP地址(可以通过docker inspect squid_proxy来查找):
iptables -t nat -A PREROUTING -p tcp -i wlp3s0 -s 192.168.0.200 --dport 9001 -j DNAT --to-destination <SQUID_CONTAINER_IP>:3128

验证访问日志

如果你的访问日志(access.log)没有记录客户端的访问,可能是因为Squid代理的配置有问题。你可以检查Squid配置,确保Squid正确监听了端口,以及访问控制和日志配置是否正确。检查Squid的配置文件(squid.conf)来查看是否有问题。

请注意,如果Squid代理位于容器中,访问日志应该记录在容器的/var/log/squid3/access.log路径下,你可以进入Squid容器来查看日志文件。

以上两种方案中,”SQUID_CONTAINER_IP”应该替换为Squid容器的实际IP地址。你可以通过以下命令来获取Squid容器的IP地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' squid_proxy

在完成以上步骤后,你可以再次尝试访问互联网,并查看Squid代理容器的访问日志来确认是否记录了访问记录。如果问题仍然存在,请检查iptables规则以及客户端的网络配置是否正确。

希望这些步骤对你有所帮助!如果还有其他问题,请随时提出。

正文完