问题。
大家好,
我需要在特定服务器上运行少量虚拟机。每台机器都应该有自己的代理配置,但其中运行的软件没有适当的代理设置功能,因此客户机上的代理配置不是一种选择。我的目标是路由我的外部代理允许的尽可能多的流量,而不仅仅是 HTTP。
我正在使用在 Ubuntu 服务器上运行的 VirtualBox,连接到具有 Tomato 固件的路由器(可以将其视为一个小型 Linux 盒)。虚拟机通过桥接连接连接到路由器,因此路由器可以独立看到每个虚拟机;我强烈希望保持这种方式,因为能够通过其 IP 与每个虚拟机通信非常方便(我可以将其设置为静态)。我愿意使用其他服务器端软件,但我看不出我当前的设置为什么不起作用。我想到了几个不同的选择,我想知道是否有人知道哪个是最好的,或者我是否完全错过了更好的选择:
选项1。
我已经能够在我的 Ubuntu 服务器(与运行虚拟机的服务器相同)上成功安装和配置 squid3 代理服务器,该服务器与外部经过身份验证的代理进行通信。出于安全原因,我仅启用了与代理的本地连接,而同一网络中的其他计算机可以使用与本地代理的连接,然后将其重定向到外部代理:
Local Machine -> Ubuntu Server (squid3) -> External Proxy
不幸的是,正如我上面提到的,虚拟机没有代理客户端功能。我以为我可以通过它自己的 Squid 服务器路由服务器的所有流量,但由于虚拟机具有桥接连接,因此它们直接与路由器通信。为了缓解这个问题,我一直在尝试将虚拟机流量从路由器重定向回 Ubuntu 服务器:
Virtual Machine -> Tomato Router -> Ubuntu Server (squid3) -> External Proxy
到目前为止,这种方法收效甚微,因为我对如何重定向所有端口的流量的细节感到困惑,而且我以前从未使用过 iptables。即使我能够将所有流量重定向回 squid3 服务器,我也不知道如何将单独的代理设置应用于每个虚拟机。我是否需要为每个虚拟机设置一个 squid3 服务器?我很确定 squid3 允许我按传入 IP 进行过滤,但cache_peer "proxy-host" parent "proxy-port" 0 no-query default login=username:password
我用来与外部代理通信的选项似乎是全局行为。
选项 2。
我可以在 Tomato 路由器上安装 squid3 代理服务器,并在路由器本身上执行我在第一个选项中描述的所有操作,但我还无法安装代理服务器。就像我在第一个选项中想知道的那样,我是否需要为每个虚拟机设置不同的代理服务器?布局将非常相似:
Virtual Machine -> Tomato Router (squid3) -> External Proxy
选项 3。
尽管我更愿意维持从虚拟机到路由器的桥接连接,但也许有一种方法可以通过 NAT 连接到虚拟机并使用 Ubuntu 服务器或 Tomato 路由器上的 squid3 服务器(如果我能够使其工作的话)。
问题。
哪种选择是解决我的问题的最佳方法?有没有我尚未考虑过的更好的方法来解决这个问题?
更新。
显然我误以为 squid 无法cache_peer
在客户端而不是全局处理该指令,我只需使用 即可cache_peer_access
。目前,我正尝试选择选项 1,直到有人给我一个更好的理由不这样做。这是我的配置/etc/squid3/squid.conf
:
编辑:根据建议更新 http_port
# acl definitions here
acl localnet src 192.168.1.0/24
acl localhost src 127.0.0.1
# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager
# any client in the local network has access
http_access allow localhost
http_access allow localnet
# And finally deny all other access to this proxy
#http_access deny all
http_access allow all # test only
# external proxy settings
http_port 3128 transparent
cache_peer XXXX.XXXX.XXXX.XXXX parent 80 0 no-query default login=user:pass
# No direct access
never_direct allow all
# do not forward the IP address
forwarded_for off
流量从 Tomato 路由器重定向到我的 squid 服务器。为此,我使用以下 iptables(虚拟机的 IP 范围限制在 192.168.1.50-192.168.1.100 之间,通过 DHCP 服务器将 MAC 地址静态绑定到 IP 来实现):
PROXY_IP=192.168.1.115
REDIRECT_PORTS=443,80,21,70,210,1025:65535,280,488,591,777
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s $PROXY_IP -j ACCEPT
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.1.50-192.168.1.100 -p tcp -m multiport --dport $REDIRECT_PORTS -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.1.50-192.168.1.100 -p udp -m multiport --dport $REDIRECT_PORTS -j MARK --set-mark 3
ip rule add fwmark 3 table 2
ip route add default via $PROXY_IP dev br0 table 2
然后返回 Ubuntu 服务器:
iptables -A PREROUTING -t nat -p tcp -m multiport --dport $REDIRECT_PORTS -j REDIRECT --to 3128
iptables -A PREROUTING -t nat -p udp -m multiport --dport $REDIRECT_PORTS -j REDIRECT --to 3128
答案1
我想您的第一个选择就没问题。
但你应该配置虚拟机使用主机服务器作为默认网关,禁用服务器上的 icmp 重定向,并设置透明 http 代理在上面。
更新:
如果您的网桥调用 iptables,则不需要更改 icmp 重定向和 VM 的路由。
/etc/sysctl.conf:
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
要将 http 请求重定向到你的 squid、iptables:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128