킬 스위치 또는 연결 대체 방지를 위한 OpenVPN CLI

킬 스위치 또는 연결 대체 방지를 위한 OpenVPN CLI

사용 가능한 GUI(킬 스위치 확인란이 있음)가 없기 때문에 현재 Linux 배포판에서 VPN에 연결하기 위해 명령줄을 통해 OpenVPN을 사용하고 있습니다.

내 문제는 VPN 연결이 끊길 경우 킬 스위치를 추가하거나 기본 연결로의 대체를 방지할 수 있는 방법을 찾을 수 없다는 것입니다.

현재 연결에 사용하는 명령은 다음과 같습니다.

openvpn --config /etc/openvpn/gateway.conf

기본적으로 저는 VPN이 문제가 발생할 경우 기본 연결로 돌아가는 것을 방지하는 쉬운 방법을 찾고 싶습니다. VPN 연결이 다시 복구될 때까지 연결이 중단되기를 원합니다.

게이트웨이 구성 파일

client
dev tun
proto udp
remote us-california.privateinternetaccess.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
tls-client
remote-cert-tls server
auth-user-pass /etc/openvpn/login.conf
comp-lzo
verb 1
reneg-sec 0
crl-verify /etc/openvpn/crl.pem


auth-nocache
script-security 2
up /etc/openvpn/update-resolv-conf.sh
down /etc/openvpn/update-resolv-conf.sh

소스 파일:https://aur.archlinux.org/packages/private-internet-access-vpn

답변1

더 높은 메트릭을 사용하여 블랙홀 규칙을 설정하면 이 작업을 수행할 수 있습니다. 각 라우팅 규칙에 대해 우선 순위가 낮은(더 높은 메트릭) 중복 경로를 추가하고 OpenVPN의 경로가 해제되면 해당 경로는 제자리에 남아 있습니다. 추가 경로는 blackhole, prohibit또는 unreachable경로입니다.

다음을 통해 이 작업을 수행할 수 있습니다.

#!/bin/sh
set -e
ip route replace blackhole "$ifconfig_local/$ifconfig_netmask"

i=1
while true; do
  route_network_i="$(eval echo \$route_network_$i)"
  route_netmask_i="$(eval echo \$route_netmask_$i)"
  route_metric_i="$(eval echo \$route_metric_$i)"
  if [ -z "$route_network_i" ]; then
    break
  fi
  ip route replace blackhole "$route_network_i"/"$route_netmask_i" metric $(( $route_metric_i + 1 ))
  i=$(( $i + 1 )
done

답변2

VPN 터널을 누출로부터 보호할 때 VPN 클라이언트가 스스로 관리하려고 시도하는 메커니즘을 피하는 것이 가장 좋습니다. 대부분의 경우 이는 OpenVPN이 후자를 다양한 방식으로 조작하므로 대신 iptables또는 를 사용해야 함을 의미합니다 .nftip route

라우팅 구성 방법에 관계없이 터널 장치 및 OpenVPN 링크 자체로 향하는 트래픽을 제외한 모든 트래픽을 차단하는 누출 방지 방법은 다음과 같습니다.


먼저, VPN 클라이언트가 사용할 특수 그룹을 추가합니다(시스템의 다른 사용자나 프로그램이 아직 사용하고 있지 않은 한 원하는 경우 다른 그룹 이름을 선택할 수 있습니다).

sudo groupadd -r -f tunnel

root그런 다음 시스템이 시작될 때마다 또는 VPN이 시작되기 전에 실행해야 하는 방화벽 규칙이 있습니다 .

#!/bin/sh
iptables -F OUTPUT
iptables -P OUTPUT DROP
iptables -A OUTPUT -p all -m owner --gid-owner tunnel -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

그룹 ID "tunnel"은 네트워크 액세스 조건이고 터널 장치 "tun+"도 출력입니다. openvpn 구성에서 tap장치를 사용하는 경우 "tun+" 대신 "tap+"를 지정할 수 있습니다.

마지막으로 특수 그룹 ID로 VPN 클라이언트를 실행할 수 있습니다.

sudo sg tunnel -c 'openvpn --config /etc/openvpn/gateway.conf --group tunnel'

그룹 이름 "tunnel"은 명령줄에서 두 번 지정됩니다. 왜냐하면 openvpn 프로세스의 그룹 ID가 처음 시작하는 동안과 연결이 설정된 후에 모두 설정되어 있는지 확인해야 하기 때문입니다. openvpn Group=이 명령줄이나 스크립트가 아닌 시스템 서비스에서 실행되는 경우 sg.

openvpn이 실행 중인지 여부에 관계없이 위의 기술은 iptables 규칙이 활성화된 동안 Clearnet 누출로부터 사용자를 보호해야 합니다. 여기에는 데이터 및 DNS 패킷이 포함됩니다. 그리고 OUTPUT 체인의 정책은 규칙을 효과적으로 켜거나 끄는 스위치로 사용될 수 있습니다(DROP 또는 ACCEPT 사용).

관련 정보