我需要确保只有特定服务可以访问我的 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 也是如此。手动更改 shell 的 cgroup 成员身份并尝试 ping vpn 中的其他节点也不起作用。我也尝试过使用--path vpn.slice
而不是--path /vpn.slice
,它没有什么区别。
我在这里错过了什么吗?