用於共享伺服器的 VM 的單個經過身份驗證的代理配置
問題。
大家好,
我需要在特定伺服器中擁有少量虛擬機。每台機器都應該有自己的代理配置,但是在其中執行的軟體沒有適當的代理設置功能,因此來賓的代理配置不是一種選擇。我的目標是在我的外部代理允許的範圍內路由盡可能多的流量,而不僅僅是 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