특정 서비스만 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의 다른 노드를 핑하는 것도 작동하지 않았습니다. 나는 또한 --path vpn.slice
대신 사용해 보았지만 --path /vpn.slice
아무런 차이가 없습니다.
여기서 뭔가 빠졌나요?