Virtualization

用於共享伺服器的 VM 的單個經過身份驗證的代理配置

  • November 16, 2013

問題。

大家好,

我需要在特定伺服器中擁有少量虛擬機。每台機器都應該有自己的代理配置,但是在其中執行的軟體沒有適當的代理設置功能,因此來賓的代理配置不是一種選擇。我的目標是在我的外部代理允許的範圍內路由盡可能多的流量,而不僅僅是 HTTP。

我正在使用在 Ubuntu 伺服器上執行的 VirtualBox,連接到具有 Tomato 韌體的路由器(將其視為一個小型 Linux 機器)。虛擬機通過橋接連接到路由器,因此路由器可以獨立看到它們中的每一個;我強烈希望保持這種狀態,因為能夠通過其 IP 與每個 VM 通信非常方便(我可以將其設置為靜態)。我願意使用其他伺服器端軟體,但我看不出我目前的設置不起作用的原因。我已經想到了一些不同的選擇,我想知道是否有人對哪個最好有一些見解,或者我是否完全錯過了更好的選擇:

選項1。

我已經能夠在我的 Ubuntu 伺服器(與執行虛擬機的伺服器相同)上成功安裝和配置 squid3 代理伺服器,該伺服器與野外經過身份驗證的代理進行通信。出於安全原因,我只啟用了到代理的本地連接,並且同一網路中的其他機器能夠使用連接到本地代理,這反過來又將它們重定向到外部代理:

Local Machine -> Ubuntu Server (squid3) -> External Proxy

不幸的是,正如我上面提到的,VM 沒有代理客戶端功能。我認為我可以通過它自己的 Squid 伺服器路由所有伺服器的流量,但由於虛擬機有一個橋接連接,它們直接與路由器通信。為了緩解這個問題,我一直在嘗試將虛擬機流量從路由器重定向回 Ubuntu 伺服器:

Virtual Machine -> Tomato Router -> Ubuntu Server (squid3) -> External Proxy

到目前為止,我在這種方法上收效甚微,因為我迷失瞭如何為所有埠重定向流量的細節,而且我以前從未使用 iptables 做過任何工作。即使我能夠將所有流量重定向回 squid3 伺服器,我也不知道如何將單獨的代理設置應用於每個 VM。我需要為每個虛擬機設置一個 squid3 伺服器嗎?我很確定 squid3 允許我按傳入 IP 進行過濾,但cache_peer "proxy-host" parent "proxy-port" 0 no-query default login=username:password我用來與外部代理交談的選項似乎是全域行為。

選項 2。

我可以在 Tomato 路由器上安裝 squid3 代理伺服器,並在路由器本身上執行我在第一個選項中描述的所有操作,但我還不能安裝代理伺服器。就像我在第一個選項中想知道的那樣,我是否需要為每個 VM 使用不同的代理伺服器?佈局將非常相似:

Virtual Machine -> Tomato Router (squid3) -> External Proxy

選項 3。

即使我更願意保持從虛擬機到路由器的橋接連接,也許有一種方法可以通過 NAT 連接到虛擬機,並在 Ubuntu 伺服器或番茄路由器上使用 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(VM 僅限於 192.168.1.50-192.168.1.100 範圍內的 ip,通過 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

我想你的第一個選擇是好的。

但是您應該將虛擬機配置為使用主機伺服器作為預設網關,在伺服器上禁用 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

引用自:https://serverfault.com/questions/555120