PPTP VPN은 Linux 라우터에서 작동하지 않습니다.

PPTP VPN은 Linux 라우터에서 작동하지 않습니다.

원래:

방금 이전 Linux 설치(Debian squeeze)에서 내 라우터용 새 Linux 설치(Linux Mint 17.3)로 전환했습니다(Linux가 설치된 전체 데스크톱 컴퓨터를 내 라우터로 사용합니다). Linux PC는 내 DSL 모뎀에 직접 연결하고 PPPoE 연결을 협상한 다음 다른 모든 장치에 대한 인터넷 연결을 라우팅합니다.

내가 아는 한, 내 설정은 이전 데비안 설치와 동일합니다. rc.local새 컴퓨터에서도 동일하고 작동 중인 iptables를 설정하는 간단한 스크립트가 있습니다 ( /etc/rc.local루트 콘솔에서 실행하여 이를 보장했습니다). 새 상자에도 DNS를 설정했습니다.

대부분의 기능은 동일했지만 문제가 발생했습니다. Windows 컴퓨터의 VPN이 더 이상 연결되지 않았습니다. Wireshark를 살펴보면 초기 PPTP 패킷이 성공적으로 전송 및 수신된 것처럼 보이지만 Windows 컴퓨터에서 전송된 "Set-Link-Info" 패킷이 있고 Windows 컴퓨터에서 "PPP LCP 설정을 시작합니다. 구성 요청" 패킷. 이 시점에서는 아무런 응답도 받지 않습니다. 이전 데비안 설정을 Wireshark에서 캡처한 결과 이 ​​시점에서 응답이 발생하고 결국 "PPP LCP 구성 확인"이 생성되는 것으로 나타났습니다.

나는 무엇을 더 확인해야할지 정말로 모른다. 새 설정에서 왜 PPTP 연결이 멈췄는지 이해할 수 없습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

/etc/rc.local참고: 전체 iptables 구성을 설정하는 방법은 다음과 같습니다 (두 설치 모두 동일).

#!/bin/sh -e

echo "*** Running rc.local ***"

# First up, make sure 'net.ipv4.ip_forward=1' exists, uncommented, in /etc/sysctl.conf (just do this manually)
echo "MAKE SURE net.ipv4.ip_forward=1 EXISTS, UNCOMMENTED, IN /etc/sysctl.conf OR NAT WILL NOT WORK!!!"
echo ""

# Firewall variables
#WAN_IFACE="eth0"         # At the time of writing, this is the NIC built into the mobo
WAN_IFACE="ppp0"         # Virtual PPP interface when using PPPoE
LAN_IFACE="eth1"         # At the time of writing, this is the extension NIC card
LAN_IP="192.168.1.1/24"  # Class-C internal network

# Setup iptables... flush existing rules
iptables -F
iptables -t nat -F
set +e
# Set +e here to continue on error; iptables may give an error if this chain doesn't currently exist and we try to delete it
iptables -X LOGGING
set -e

# Set default policies for chains
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# Allow all local loopback access
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A OUTPUT -o lo -p all -j ACCEPT

# Allow incoming traffic for established connections
iptables -A INPUT -i $WAN_IFACE -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $WAN_IFACE -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $LAN_IFACE -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $LAN_IFACE -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow incoming ICMP traffic
iptables -A INPUT -p icmp -j ACCEPT

###
# Uncomment lines in this section to allow unsolicited incoming traffic on ports
## Open common service ports
## SSH
#iptables -A INPUT -i $WAN_IFACE -p tcp --destination-port 22 -j ACCEPT
## HTTP (8080 + 8081)
#iptables -A INPUT -i $WAN_IFACE -p tcp --destination-port 8080 -j ACCEPT
#iptables -A INPUT -i $WAN_IFACE -p tcp --destination-port 8081 -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --destination-port 8080 -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --destination-port 8081 -j ACCEPT
# DNS
iptables -A INPUT -i eth1 -p tcp --destination-port 53 -j ACCEPT
iptables -A INPUT -i eth1 -p udp --destination-port 53 -j ACCEPT
# Local Samba connections
iptables -A INPUT -p tcp --syn -s $LAN_IP --destination-port 139 -j ACCEPT
iptables -A INPUT -p tcp --syn -s $LAN_IP --destination-port 445 -j ACCEPT
###

# NAT setup - allow the NAT masquerading
iptables -t nat -A POSTROUTING -o $WAN_IFACE -j MASQUERADE

# Allow forwarding of packets between the Internet and local network interface(s)
iptables -A FORWARD -i $WAN_IFACE -o $LAN_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $LAN_IFACE -o $WAN_IFACE -j ACCEPT

# Logging setup
iptables -N LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix="IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP

# Logging; uncomment the below to log dropped input packets to syslog (verbose; only use for debugging!)
echo "Uncomment the necessary lines in rc.local to enable iptables logging..."
#iptables -A INPUT -j LOGGING

echo "*** Finished running rc.local ***"

exit 0

고쳐 쓰다:

나는 이것을 더 조사했고 Linux 라우터의 출력에 대한 Wireshark 분석에서 매우 중요한 차이가 드러났습니다. 여기에 두 개의 스크린샷이 있습니다. 첫 번째는 라우팅이 제대로 작동하는 이전 Debian 상자에서 가져온 것이고, 두 번째는 라우팅이 작동하지 않는 새 Mint 상자에서 가져온 것입니다.

데비안에서의 Wireshark 압착

Linux Mint 17.3의 Wireshark

내 Linux 라우터의 공용 IP 주소와 PPTP 프로토콜을 통해 VPN 연결을 설정하기 위해 통신하는 원격 주소를 나타내기 위해 IP 주소를 빨간색과 파란색 줄무늬로 바꿨습니다. 또한 로컬 네트워크에 있는 Windows 컴퓨터의 IP 주소가 녹색으로 강조 표시됩니다.

주목해야 할 것은 PPTP 프로토콜이 완료되고 PPP LCP 패킷으로 전환된 후에 어떤 일이 발생하는지입니다. Debian 시스템에서는 패킷을 공용 인터넷으로 보내기 전에 이러한 패킷의 소스 주소를 내 공용 IP 주소로 변환합니다. 그러나 내 Linux Mint 상자에서는 전송된 패킷의 소스 주소가 여전히 연결을 시도하는 Windows 시스템의 로컬 네트워크 주소로 남아 있습니다. 로컬 클래스 C 소스 주소를 사용하여 패킷을 인터넷으로 보냅니다. 물론 패킷은 라우팅되지 않습니다!

문제는 내 Linux Mint 컴퓨터에서는 NAT가 충돌하지만 Debian 컴퓨터에서는 충돌하지 않는 원인이 무엇입니까? iptables는 동일하며 모두 /etc/network/interfaces동일합니다. 모르겠어요...하지만 어쩌면 이 발견이 여기 누군가가 제가 이것을 알아내도록 도와줄 수도 있습니다. :-)

답변1

NAT가 제대로 작동하려면 프로토콜별 도우미 모듈을 로드해야 합니다. 기본적으로 TCP와 UDP만 로드됩니다.

이것이 NAT 없이 탈출하는 PPTP 트래픽(실제로는 GRE를 통한 PPP)을 보는 이유입니다. nf_nat_proto_gre적어도 Linux 4.4부터는 이 모듈이 있습니다.

비슷한 상황이 연결 추적에 적용됩니다(이 기능이 없으면 GRE 패킷은 설정되거나 연관된 연결의 일부로 간주되지 않습니다). 그건 nf_conntrack_proto_gre.

PPTP에도 특별한 처리가 필요하다는 것이 밝혀졌습니다(PPP 협상에 IP 주소가 포함되어 있는 것 같지만 확인하지 않았습니다). 이 특별한 처리는 에서 제공되며 nf_nat_pptpPPTP 연결 추적은 에서 제공됩니다 nf_conntrack_pptp.

modprobe ip_nat_pptpVPN이 제대로 작동하도록 해야 합니다 . 모듈 간의 종속성은 결국 네 개의 모듈을 모두 로드하게 됩니다. 시작 시 계속 작동 nf_nat_pptp하려면 /etc/modules.

(아니요, 이 내용이 어디서 녹음되었는지 모르겠습니다. 죄송합니다!)

답변2

DeRobert의 답변이 정확합니다. 그러나 최신 커널 버전에는 또 다른 문제가 있습니다. 보안상의 이유로 net.netfilter.nf_conntrack_helper의 기본값이 0으로 변경되었습니다.

관련 항목을 참조하세요:

쉬운 수정 방법은 다시 1로 설정하는 것입니다. /etc/sysctl.conf 하단에 추가

net.netfilter.nf_conntrack_helper = 1

그런 다음 다시 시작하거나 실행하십시오.sysctl -p

관련 정보