特定のサービスだけがVPN仮想インターフェイスにアクセスできるようにする必要があります。私が知っている限り、iptablesを使用してプロセスcgroupメンバーシップに基づいてフィルタリングするのが最もクリーンな方法です。
そのため、systemdを使用してsshdサービスをvpn.slice
cgroupに入れ、チェーンを作成してINPUTとOUTPUTに追加しました。
iptables -N vpn
iptables -A vpn -m cgroup --path /vpn.slice -j ACCEPT
iptables -A vpn -j DROP
iptables -A INPUT -i $INTERFACE -j vpn
iptables -A OUTPUT -o $INTERFACE -j vpn
iptables -L出力:
[root@sh ~]# iptables -L -v
Chain INPUT (policy ACCEPT 287K packets, 17M bytes)
pkts bytes target prot opt in out source destination
106 5160 vpn all -- homeforward any anywhere anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 476K packets, 673M bytes)
pkts bytes target prot opt in out source destination
78 10062 vpn all -- any homeforward anywhere anywhere
Chain vpn (2 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- any any anywhere anywhere cgroup /vpn.slice
184 15222 DROP all -- any any anywhere anywhere
このルールを適用すると、SSHサーバーに接続できなくなり、他のポートのnetcatにも当てはまります。シェルのcgroupメンバーシップを手動で変更し、VPNの他のノードをpingすることも機能しませんでした。私も--path vpn.slice
代わりに試してみましたが、--path /vpn.slice
違いはありません。
ここで何か抜けましたか?