一部のトラフィックはVPNを通過し、他のトラフィックは通過しないようにします。
与えられたfwmarkを持つパケットはプライマリインターフェイス(wlo1
)に送信され、他のすべてのトラフィックはtun0
プライマリテーブルのトンネルインターフェイス(、OpenVPNを使用)に送信されます。 nftablesにこのルールを追加しました。
table ip test {
chain test {
type route hook output priority mangle; policy accept;
meta cgroup 1234 meta mark set 1
}
}
デフォルトのルーティングテーブルには次のエントリがあります。
default via 10.11.0.1 dev tun0
10.11.0.0/16 dev tun0 proto kernel scope link src 10.11.0.20
[WANIP.0]/24 dev wlo1 proto kernel scope link src [WANIP]
128.0.0.0/1 via 10.11.0.1 dev tun0
[VPNIP] via [WANGATEWAY] dev wlo1
fwmarkを持つパケットは1
独自のルーティングテーブルに転送されますip rule add from all fwmark 1 lookup test
。テーブルにtest
次のパスを追加しました。
default via [WANGATEWAY] dev wlo1
この cgroup で実行するとping 8.8.8.8
中断されます。送信することはできますが、パケットを受信できないようです。
VPN トラフィックが期待どおりに動作します。
どうしたの?
答え1
パケットが送信されると、ルーティング決定が行われます。この決定は発信インターフェイスを選択します。そして使用する一致する送信元IPアドレス。
いつ。 。 。いつパス/出力チェーンはフラグを設定することによってルートリダイレクトの確認、ここに見られるように模式図(これはiptables覚えておいてください。しかし、完璧に大丈夫です。nftables)。再ルーティングチェックはルートを変更しますが、送信元 IP アドレスは変更しません。したがって、より多くの作業を行う必要があります。
- 送信元IPアドレスを変更するには、NATルールを追加してください。
これは必ずしなければなりません。後ろに確認を再ルーティングしてオンNAT/ポストルーティング。同じテーブルが異なるリンクタイプを持つことができることに注意してください。iptablesここでtable<=>型)。
nft add chain ip test testnat '{ type nat hook postrouting priority srcnat; policy accept; }'
nft add rule ip test testnat meta mark 1 masquerade
これで正しいパケットが残ります。
- デフォルトルートを介して到着しなくても応答ストリームが許可されるようにします。
君は緊張を解けることができるリバースパス転送緩いモードに変更して
rp_filter
:sysctl -w net.ipv4.conf.wlo1.rp_filter=2
または、発信フローと同じルーティングテーブルを使用するように応答フローを表示します。実際、セキュリティは向上しませんが、とにかく次のようになります。
nft add chain ip test testpre '{ type filter hook prerouting priority mangle; policy accept; }' nft add rule ip test testpre iif "wlo1" meta mark set 1
ああ、新しいバージョン以降に必要な他の調整なしでは動作しません。文書化されていない機能2010年に登場:
sysctl -w net.ipv4.conf.wlo1.src_valid_mark=1
メモ:
conntrackにタグを保存すると、セキュリティの面でより良い結果が得られます。コマック(
ct mark
)は正しい応答フローのみを許可し、他のフローは厳密な逆方向パス転送をバイパスすることを許可しません。厳格モードでは何も通過しません。wlo1発信トラフィックの応答でない限り。以下は対応するnftablesルールファイルの全体です(nftablesルールを置き換えるときは上記のオプション2で使用されます)。table ip test { chain test { type route hook output priority mangle; policy accept; meta cgroup 1234 meta mark set 1 ct mark set meta mark } chain testnat { type nat hook postrouting priority srcnat; policy accept; meta mark 1 masquerade } chain testpre { type filter hook prerouting priority mangle; policy accept; ct mark 1 meta mark set ct mark } }
それに私の言葉によるとudd 範囲入り口:https://kernelnewbies.org/Linux_4.10#ネットワーキング
cgroupsの使用を制限されたuidセットに変換できる場合は、上記のように
ip rule add ... uidrange ...
ルーティングスタック(netfilterやnftablesなし)のみを使用して正しく実行できます。これに対する私の答えを参照してください。特定のインターフェイス(tum1)を介したユーザートラフィックのルーティング。