僅通過 VPN 路由某些流量
我有一個中央開發伺服器,執行一個 VPN 伺服器,以及幾個需要連接到它的客戶端。伺服器正在執行 Apache,但僅接受本地請求(僅偵聽 127.0.0.1:80)。
我基本上需要強制連接到 VPN 的每個客戶端通過 VPN 將流量路由到某個主機名和本地 Apache 實例。
例如:
Client requests google.com -> google.com Client requests server -> vpn -> server:80
我知道當客戶端連接到 VPN 時我可以將路由命令推送到客戶端,現在我只需要弄清楚要推送什麼路由來實現這一點。至少,
route
客戶端自己添加此路由的語法/命令是什麼?
首先:除了本地機器之外,您將無法將流量路由到 127.xyz (好吧,甚至可能,但您肯定會在此過程中破壞其他東西……)所以我d 建議更新 apache 配置以監聽 VPN IP(例如 10.8.0.1)。如果這不是一個選項,您可以在我的答案末尾嘗試其中一個選項。
OpenVPN 客戶端應該已經獲得了到伺服器的路由,在我的範例中是這樣的:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.8.0.1 10.8.0.53 255.255.255.255 UGH 0 0 0 tun0 10.8.0.53 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
如果您想將其他路由推送到客戶端,請使用:
push "route 192.168.10.0 255.255.255.0"
(相應地更改 IP/網路遮罩)。
如果您希望您的 apache 實例可以通過主機名(而不僅僅是 at
http://10.8.0.1/
)訪問,請將其放在每個客戶端的/etc/hosts
文件中10.8.0.1 servername.domain.example
或設置 DNS 伺服器(如 dnsmasq <- 確保禁用 dhcp 伺服器)並將其推送到客戶端(在您的 ovpn-conf 中):
push "dhcp-option DNS 10.8.0.1"
這應該夠了吧。
其他選項
如果您無法更改 apache 監聽的 IP,我會想到以下方法(但僅將它們用作最後的手段):
- SSH 埠轉發:不使用 OpenVPN(或任何其他 VPN 伺服器),而是使用 SSH 連接到您的伺服器:
ssh -L1234:localhost:80 user@servername
這樣,伺服器上的 apache 實例(僅在 監聽
127.0.0.1:80
)將在您的客戶端上可用http://localhost:1234/
。您必須對每個客戶都這樣做,因此如果您有很多客戶,它可能不適合。但即便如此,您也可以為
~/.ssh/authorized_keys
. 請記住,客戶端可能可以將其用作 Internet 的代理或做一些您可能不希望他們做的事情。所以正確配置 sshd 很重要。
- 一些 iptables 魔法(你必須對流量進行 NAT)
- 其他一些使用者空間埠轉發或反向代理