從 StrongSwan VPN 排除本地子網

從 StrongSwan VPN 排除本地子網

我有一台帶有額外的、僅限本地的乙太網路介面和私有子網路的電腦。建立 StrongSwan VPN 後,我無法存取該子網路。

這是本地“左”配置(由演算法):

conn ikev2-<rightip>
    fragmentation=yes
    rekey=no
    dpdaction=clear
    keyexchange=ikev2
    compress=no
    dpddelay=35s

    ike=aes128gcm16-prfsha512-ecp256!
    esp=aes128gcm16-ecp256!

    right=<rightip>
    rightid=<rightip>
    rightsubnet=0.0.0.0/0
    rightauth=pubkey

    leftsourceip=%config
    leftauth=pubkey
    leftcert=daves.crt
    leftfirewall=yes
    left=%defaultroute

    auto=add

相關子網路是 10.0.0.0/24。 %defaultroute 解析為 192.168.0.0/24 中的位址。

「left」和「leftsubnet」看起來不是正確的選擇,但我認為沒有更好的選擇。我嘗試將 leftsubnet 設定為 10.0.0.0/24 和 !10.0.0.0/24。

如何從 StronSwan VPN 連線中排除本機子網路?

如何檢查連接的路由配置?

答案1

您可以設定一個直通政策

更新:正如 @ecdsa 所指出的,在 Strongswan >= 5.5.2 的情況下,有一個更簡單的方法,看最後你的版本能不能用。

帶有一些隨機 IP 的範例。在進行任何更改和隧道之前:

# ip route get 10.0.0.55
10.0.0.55 dev lxcbr0 src 10.0.0.77 uid 0 

建立隧道後,問題:

# ip route get 10.0.0.55
10.0.0.55 via 192.168.0.1 dev eth0 table 220 src 192.168.0.44 uid 0 

將此配置新增至/etc/ipsec.conf

conn ignorelan
    left=127.0.0.1 #prevents usage in peers selection algorithm
    leftsubnet=10.0.0.0/24
    rightsubnet=10.0.0.0/24
    authby=never
    type=passthrough
    auto=route

並重新加載它:

# ipsec reload

應立即激活它。如果沒有(這次)你可以這樣做:

# ipsec route ignorelan
'ignorelan' shunt PASS policy installed

無論如何,它應該在以後重新啟動時使用。您現在擁有(除了任何隧道之外):

# ipsec status 
Shunted Connections:
     ignorelan:  10.0.0.0/24 === 10.0.0.0/24 PASS

[...]

現在,無論隧道是否建立,您都會返回正確的路線(由 Strongswan 處理,因此在表 220 中,而不僅僅是表 main(不再)):

# ip route get 10.0.0.55
10.0.0.55 dev lxcbr0 table 220 src 10.0.0.77 uid 0 
    cache 

對於 0.0.0.0/0 的隧道,將出現與表 220 類似的結果:

# ip route show table 220
default via 192.168.0.1 dev eth0 proto static src 192.168.0.44 
10.0.0.0/24 dev lxcbr0 proto static src 10.0.0.77 
192.168.0.0/24 dev eth0 proto static src 192.168.0.44 

如果您沒有在直通設定中放置與實際情況相符的路由(例如:錯誤的網路遮罩),則「分流」會出現錯誤的結果(如預期的來源IP,但會通過錯誤的網路卡),所以要小心。


更新: 這旁路 LAN 插件更易於使用,尤其是在動態環境中。

不要新增條目,而是conn啟動它(例如在Debian buster(不穩定)上,編輯/etc/strongswan.d/charon/bypass-lan.conf 並設定load=yes (即:charon.plugins.bypass-lan .load =是))。預設情況下,每個介面都會被分流,這意味著將建立隧道,但預設不會使用。所以只需設定其中一個interfaces_ignoreinterfaces_use相應即可。您應該interfaces_ignore為您的介面設定不想要繞過隧道,或設定interfaces_use為您設定的接口繞過隧道。例如:

interface_use = lxcbr0

之後會在這個例子中得到ipsec start,就像之前的方法一樣:

# ip route show table 220
10.0.0.0/24 dev lxcbr0 proto static src 10.0.0.77

(但在使用 IPv6 時也會考慮與此介面相關的 IPv6 路由)。


另一種(hackish)方法是繞過strongswan的表220:而不是任何strongswan設置,可以透過以下方式實現相同的效果(對於這些問題和範例):

ip rule add priority 219 to 10.0.0.0/24 lookup main

它將使用目標網路的預設(主)路由表,而不是使用 Strongswan 的表 220 繼續到下一個條目。

相關內容