Mac OS X에서 pf.conf를 사용하여 OpenVPN 연결이 활성화되어 있지 않으면 나가는 트래픽 방지


19

pf.conf를 사용하여 OpenVPN 연결이 활성화되어 있지 않으면 외부 네트워크에 대한 모든 연결을 거부 할 수있었습니다. 그러나 랩톱 덮개를 닫거나 열거 나 Wi-Fi를 껐다가 다시 켜서 연결이 끊어지면 Wi-Fi 연결이 끊어집니다.

  • Mac OS 10.8.1을 사용하고 있습니다.
  • Wi-Fi (공공 Wi-Fi를 포함한 다양한 위치에서)를 통해 웹에 연결합니다.
  • OpenVPN 연결은 점도로 설정됩니다.

다음과 같은 패킷 필터 규칙이 설정되어 있습니다. /etc/pf.conf

# Deny all packets unless they pass through the OpenVPN connection
wifi=en1
vpn=tun0

block all

set skip on lo
pass on $wifi proto udp to [OpenVPN server IP address] port 443
pass on $vpn

로 패킷 필터 서비스를 시작하고로 sudo pfctl -e새 규칙을로드합니다 sudo pfctl -f /etc/pf.conf.

또한 시스템 시작시 패킷 필터가 시작되도록 /System/Library/LaunchDaemons/com.apple.pfctl.plist<string>-f</string>을 편집 하고 읽 <string>-ef</string>도록 변경했습니다 .

이 모든 것이 처음에는 잘 작동하는 것 같습니다. OpenVPN 연결이 활성화 된 경우 응용 프로그램은 웹에만 연결할 수 있으므로 안전하지 않은 연결을 통해 데이터가 유출되지는 않습니다.

그러나 랩톱 덮개를 닫았다가 다시 열거 나 Wi-Fi를 껐다가 다시 켜면 Wi-Fi 연결이 끊어지고 상태 표시 줄의 Wi-Fi 아이콘에 느낌표가 표시됩니다. Wi-Fi 아이콘을 클릭하면 "경고 : 인터넷에 연결되어 있지 않습니다"라는 메시지가 나타납니다.

인터넷 연결 메시지가 없습니다

연결을 다시 얻으려면 "Alert : No Internet connection"메시지가 사라지고 VPN 연결을 다시 열 수 있기 전에 Wi-Fi 연결을 끊었다가 다시 5 ~ 6 번 다시 연결해야합니다. 다른 경우 Wi-Fi 알림이 자체 계약에 따라 사라지고 느낌표가 사라지고 다시 연결할 수 있습니다. 어느 쪽이든, 다시 연결하는 데 5 분 이상 걸릴 수 있으며, 이는 실망 스러울 수 있습니다.

회선을 제거하면 block all문제가 해결되지만 (안전하지 않은 연결은 허용됨) Wi-Fi 연결을 다시 확보하고 확인하기 위해 Apple에서 필요로하는 서비스가있는 것 같습니다. 나는 시도했다 :

  • pass on $wifi proto icmp allpf.conf 에 추가 하여 ICMP 활성화
  • 추가하여 DNS 확인 활성화 pass on $wifi proto udp from $wifi to any port 53
  • 으로 변경 block all하여 차단 된 패킷을 로깅하여 자세한 내용을 알아 보려고 block log all하지만 OS X에서는 로깅이 비활성화 된 것으로 보입니다 sudo tcpdump -n -e -ttt -i pflog0. "tcpdump : pflog0 : 해당 장치가 없습니다"라는 로그 결과가 표시 되기 때문 입니다.

이 중 어느 것도 Wi-Fi 연결을 더 빨리 재설정하는 데 도움이되지 않습니다.

Wi-Fi 연결을 다시 확보하기 위해 어떤 서비스를 사용해야하는지, Wi-Fi 재 연결을보다 안정적으로 만들기 위해 pf.conf에 어떤 규칙을 추가해야하는지 확인하려면 어떻게해야합니까?


1
이 이후에 오는 사람들을위한 관련이있을 수 : sparklabs.com/support/preventing_network_and_dns_traffic_leaks
ptim

답변:


14

Little Snitch를 사용하여 네트워크 연결을 모니터링함으로써 Apple은 백그라운드에서 mDNSResponder 앱을 사용하여 Wi-Fi 연결이 가능한지 확인했습니다. mDNSResponder는 UDP 패킷을 네임 서버로 보내 연결을 확인하고 호스트 이름을 IP로 확인합니다.

이전에 Wi-Fi를 통한 모든 UDP 패킷 을 허용하기 위해 UDP 규칙을 변경 하면 mDNSResponder를 연결할 수 있습니다. 이는 이제 Wi-Fi가 연결 해제 후 처음으로 다시 연결됨을 의미합니다. 나중에 다른 사람들에게 도움이 될 경우, Mountain Lion에 대한 Apple의 기본 규칙을 포함한 최종 pf.conf는 다음과 같습니다.

#
# com.apple anchor point
#
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"as
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

#
# Allow connection via Viscosity only
#
wifi=en1 #change this to en0 on MacBook Airs and other Macs without ethernet ports
vpn=tun0
vpn2=tap0

block all

set skip on lo          # allow local traffic

pass on p2p0            #allow AirDrop
pass on p2p1            #allow AirDrop
pass on p2p2            #allow AirDrop
pass quick proto tcp to any port 631    #allow AirPrint

pass on $wifi proto udp # allow only UDP packets over unprotected Wi-Fi
pass on $vpn            # allow everything else through the VPN (tun interface)
pass on $vpn2           # allow everything else through the VPN (tap interface)

이는 불행히도 ntpd (시간 동기화) 및 mDNSResponder와 같이 UDP 프로토콜을 사용하는 소수의 응용 프로그램에서 Wi-Fi를 통해 데이터를 유출 할 수 있음을 의미합니다. 그러나 이것은 여전히 ​​대부분의 응용 프로그램이 사용하는 TCP를 통해 데이터가 보호되지 않은 상태로 이동하도록 허용하는 것보다 낫습니다. 이 설정에서 개선 할 제안이 있으면 의견이나 추가 답변을 환영합니다.


이것은 제가 부담없이 관심을 가져 왔던 결과입니다. 결과가 집에 가서 시험해 보도록 영감을 준 것입니다! 감사!
jakev

@SixSlayer 그것은 꽤 잘 작동하는 것 같습니다! 시작시와 연결이 끊어지면 자동 연결되도록 점도를 설정하여 모든 것을 원활하게 만듭니다. 주목해야 할 것은 OS 업데이트 후 pf.conf 및 com.apple.pfctl.plist가 기본값으로 재설정되므로 두 백업을 모두 유지하는 것이 좋습니다.
Nick

UDP는 IMHO의 일종입니다. 저는 네트워크 담당자는 아니지만 이런 종류의 학습이 도움이되며 이러한 종류의 세부 사항을 제어하는 ​​데 관심이 있습니다. 나는 일을 찾는 데 약간의 시간을 할애하지만, 누군가가 나를 이길 경우에도 마찬가지입니다.
jakev

이것은 굉장합니다-정확히 내가 찾던 것입니다. 감사합니다!
keo

동시에 많은 OpenVPN 연결을 열고 병렬로 라우팅 할 수 있습니까? (대역폭 확보 및 추가)
keo

11

모든 UDP 를 허용 할 필요는 없습니다 . mDNS에서 'm'은 '멀티 캐스트'를 의미하며 "링크 로컬 멀티 캐스트 주소"라는 특정 멀티 캐스트 대상 IP 주소와 UDP포트 번호를 사용 5353합니다.

이는 위의 솔루션에서 전 세계의 모든 65535 UDP 포트에 대한 트래픽을 전세계 3.7 억 개의 라우팅 가능한 IP 주소로 불필요하게 허용하여 VPN을 우회 할 수 있음을 의미합니다. UDP를 사용하는 응용 프로그램의 수에 놀랄 것이므로 VPN이 다운되었을 때 나가는 트래픽을 방지하기 위해 원래 아이디어의 목적을 크게 상실하고 있습니다.

대신이 규칙을 사용하지 않는 이유 :

pass on $wifi proto udp to 224.0.0.251 port 5353

방화벽 구성에서 매우 중요한 경험 규칙-방화벽을 통해 예외를 만들 때는 항상 가장 구체적인 규칙을 사용하십시오. 특수성은 때때로 편의성과 사용 편의성을 희생하여 발생합니다. 즉, 통과해야 할 다른 링크 로컬 프로토콜이 있다는 것을 발견하고 또 다른 특정 규칙을 추가 할 수 있습니다.

위의 규칙을 바꾸고 원래 Wi-Fi 문제가 발생하면 PF가 네트워크 장치의 IP 주소를 자동 구성하는 데 사용되는 프로토콜 인 DHCP를 차단하고있을 수 있습니다. (홈 네트워크에서 일반적으로 광대역 라우터는 DHCP 서버입니다). DHCP를 허용해야하는 규칙은 다음과 같습니다.

pass on $wifi proto udp from 0.0.0.0 port 68 to 255.255.255.255 port 67

* 참고 : 대체해야 할 수도 있습니다 0.0.0.0에 대한 any. 이 단계에서 컴퓨터에 아직 IP 주소가 없기 때문에 DHCPREQUEST컴퓨터가 처음 전송 하는 패킷에 소스 0.0.0.0주소가 있습니다.
솔직히 말해서을 사용하는 것에 더 의존 any합니다. 다른 옵션은 모든 소스 사양을 제거하는 것입니다. 즉 pass on $wifi proto udp to 255.255.255.255 port 67, 규칙의 소스 포트 부분을 잃어 버리고 가능한 한 구체적으로하는 것이 항상 가장 안전한 옵션입니다.

희망이 도움이됩니다. 유용한 링크는 다음과 같습니다.

mDNS : http://en.wikipedia.org/wiki/Multicast_DNS#Packet_structure

DHSP : http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_discovery


1

이것은 큰 도약을 만들고 pf.conf를 사용하기에 충분한 배경 ​​정보를 제공했습니다. VPN 연결이 끊어진 후 10.8에서 다시 연결하기 위해 사용하는 내용은 다음과 같습니다.

(저는 이더넷 만 사용하지만 $ wifi에 $ lan을 변경할 수 있으며 작동합니다)

lan=en0
wifi=en1
vpn=tun0
block all
set skip on lo
pass on $lan proto { udp,tcp } to 8.8.8.8
pass on $lan proto tcp to vpn.btguard.com port 1194
pass on $vpn

1

목표로 만들기 위하여 PF 규칙을 현재 (VPN)이 작은 인터페이스를 비롯한 기존의 활성 인터페이스 식별에 "쉬운"방법 killswitch에 사용될 수있다 프로그램을

여전히 진행 중이지만 방화벽 규칙을 올바르게 작성하기 위해 외부 IP 및 활성 인터페이스를 식별하기에 좋은 출발점이 될 수 있습니다.

-i(info) 옵션을 사용한 예제 또는 출력 :

$ killswitch -i
Interface  MAC address         IP
en1        bc:57:36:d1:82:ba   192.168.1.7
ppp0                           10.10.1.3

public IP address: 93.117.82.123

서버 ip 전달 -ip:

# --------------------------------------------------------------
# Sat, 19 Nov 2016 12:37:24 +0100
# sudo pfctl -Fa -f ~/.killswitch.pf.conf -e
# --------------------------------------------------------------
int_en1 = "en1"
vpn_ppp0 = "ppp0"
vpn_ip = "93.117.82.123"
set block-policy drop
set ruleset-optimization basic
set skip on lo0
block all
pass on $int_en1 proto udp to 224.0.0.251 port 5353
pass on $int_en1 proto udp from any port 67 to any port 68
pass on $int_en1 inet proto icmp all icmp-type 8 code 0
pass on $int_en1 proto {tcp, udp} from any to $vpn_ip
pass on $vpn_ppp0 all

완벽하지는 않지만 작업이 진행 중입니다. 더 많은 정보 / 코드는 여기에서 찾을 수 있습니다 : https://github.com/vpn-kill-switch/killswitch


0

-또한-

이 줄을 추가 할 수도 있습니다.

pass on $wifi inet6 proto udp from any to FF02:0000:0000:0000:0000:0000:0000:00FB port 5353

ipv6에서 mDNS가 작동 할 수 있도록

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.