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 によって処理されるため、(もはや) テーブル main ではなく、テーブル 220 で処理されます)。

# 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=yes)を設定します)。デフォルトでは、すべてのインターフェースがシャントされます。つまり、トンネルは確立されますが、デフォルトでは使用されません。したがって、どちらか一方を適宜設定してinterfaces_ignoreくださいinterfaces_useinterfaces_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 ルートも考慮されます)。


さらに別の(ハック的な)方法は、strongswan のテーブル 220 をバイパスすることです。strongswan 設定の代わりに、次のコードを使用して同じことを実現できます(これらの質問と例では)。

ip rule add priority 219 to 10.0.0.0/24 lookup main

Strongswan のテーブル 220 を使用して次のエントリに進むのではなく、ターゲット ネットワークでデフォルト (メイン) ルーティング テーブルを使用します。

関連情報