Openvpn

如何確保 openVPN 客戶端始終採用相同的 IP 地址?

  • October 18, 2019

如何確保 openVPN 客戶端始終採用相同的 VPN IP 地址?

我已經在 /etc/openvpn/ccd/ 中添加並創建了帶有客戶端名稱的文件,例如client-config-dir ccdopenvpn.conf“/etc/openvpn/ccd/CLIENTNAME”僅包含 192.168.255.20 但此 IP 地址未分配給與 CLIENTNAME.ovpn 連接的客戶端

就上下文而言,VPN 的重點是允許多個遠端客戶端從任意位置相互訪問,但它們應該對其他所有內容使用預設本地路由:www PoE 攝像頭等。OpenVPN 伺服器使用https:/在 docker 內執行/github.com/kylemanna/docker-openvpn

所以客戶端證書/ovpns 是使用以下命令生成的: docker run -v $ OVPN_DATA:/etc/openvpn –log-driver=none –rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass docker run -v $ OVPN_DATA:/etc/openvpn –log-driver=none –rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn

客戶端是 Ubuntu 16.04 上的 OpenVPN 2.4.7

我的本地 .ovpn 配置

client
nobind
dev tun
remote-cert-tls server

remote XXX.XXX.XXX.XXX 1194 udp

# only route the subnet
route-nopull
route 192.168.255.0 255.255.255.0

# various certificates / keys

我的伺服器 openvpn.conf

# client specific configurations
client-config-dir ccd

# allow clients to reach other
client-to-client

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/XXX.XXX.XXX.XXX.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/XXX.XXX.XXX.XXX.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
comp-lzo no

### Route Configurations Below
route 192.168.254.0 255.255.255.0

### Push Configurations Below
push "block-outside-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "comp-lzo no"

閱讀man openvpn

客戶端配置目錄文件不能那樣工作。它應該包含與您插入主配置文件相同的 OpenVPN 選項。當該客戶端連接時,這些選項將使用設置給該客戶端的上下文執行。

要使用 CCD 文件設置客戶端 IP 地址,請在其 CCD 文件中插入ifconfig-push 命令

ifconfig-push 192.168.255.18 192.168.255.17

我稍微更改了地址,因為您似乎正在使用net30拓撲,因此客戶端應該有 4n+2 個地址,而它們的本地 OpenVPN 內部地址是 4n+1。

更簡單的方法是簡單地使用一個ifconfig-pool-persist選項,您可以在其中指定文件來儲存 cname-ip 關聯。此文件在伺服器啟動時讀取。如果連接的客戶端仍然沒有關聯,則分配其地址並更新保存在記憶體中的表。伺服器關閉時將其寫入磁碟。(我為您描繪了這一點,以便您在伺服器執行時不要嘗試修改此文件——它將被覆蓋。)這樣您就無需費心創建 CCD 文件。但是,有時客戶會獲得另一個地址。這些情況是:客戶端過多(超過池中的地址)或duplicate-cn啟用了選項。

第三種方法是使用client-connect腳本,它可以即時生成配置的一部分。它類似於 CCD 文件,只是文件是由腳本臨時生成的。這是最靈活的方式,但需要付出更多的努力。我曾經用它在客戶端連接上自動添加 DNS 記錄。

OpenVPN 按以下順序使用關於客戶端地址的這三個資訊源:客戶端連接腳本,然後是 CCD 文件,然後是 IPP 文件。

隨手記。

正如自動生成的配置所預期的那樣,您的配置不是最理想的。例如,您指示伺服器推送路由,但設置客戶端拒絕從伺服器推送的路由。最好不要拒絕路由,而是刪除推送指令。然後,如果你決定推送一些路由,那麼你只需要修改伺服器配置,而不是客戶端。您甚至可以使用 CCD 文件或客戶端連接腳本為每個客戶端設置路由。

您在客戶端上重寫 DNS 配置。當客戶端斷開連接時,沒有人保證他們將配置恢復到連接前的狀態。更多,考慮使用兩個不同 OpenVPN 的客戶端,每個都修改 DNS。那將是地獄。這個和其他一些推理導致了這裡的教訓:除非絕對必須,否則切勿將任何 DNS 選項推送到 VPN 客戶端!(這是一般性聲明,不僅適用於 OpenVPN。)

您禁用 LZO 壓縮。為什麼?網路比最慢的 CPU 慢,它總是瓶頸,所以我無法想像你不會從壓縮中受益的情況。

您將伺服器狀態轉儲到文件中。雖然這不是一個壞主意,但 OpenVPN 可以做得更好。有一個management命令,它打開一個埠(我使用 7505),你可以“telnet”到它。在那裡您可以查詢狀態(查看它轉儲到文件中的相同數據),但您可以選擇機器可解析的格式以便於自動化。你可以殺死一個客戶。您可以通過執行實時日誌來調試 OpenVPN。您可以即時更改日誌詳細程度。總的來說,這是好事。但是,我不知道這將如何與 Docker 一起使用。

我再說一遍,閱讀 man openvpn。有無數種可能性,最好至少閱讀它以了解它可以為您做什麼。OpenVPN 是非常強大的軟體。

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