Networking

僅通過 VPN 路由某些流量

  • October 30, 2016

我有一個中央開發伺服器,執行一個 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)
  • 其他一些使用者空間埠轉發或反向代理

引用自:https://unix.stackexchange.com/questions/64319