1) 역방향 경로 필터링 비활성화

1) 역방향 경로 필터링 비활성화

고급정보

Machines involved:
A := vpn server inet 10.9.0.1 peer 10.9.0.2 tun0
B := vpn server inet 10.8.0.1 peer 10.9.0.2 tun2
     vpn client inet 10.9.0.6 peer 10.9.0.5 tun1
C := vpn client inet 10.8.0.6 peer 10.9.0.5 tun0

설명하다

총 3개의 기계가 있습니다. 머신 B는 openvpn 서버와 클라이언트를 실행합니다. 이제 머신 A가 redirect-gateway def1머신 B에 푸시하면 VPN 서버 응답 패킷이 라우팅 이유로 인해 머신 0.0.0.0/1 via 10.9.0.5, 128.0.0.0/1 via 10.9.0.5A 로 라우팅되기 때문에 머신 C는 분명히 머신 B의 openvpn-server에 연결할 수 없습니다. 이제 컴퓨터의 B WAN 게이트웨이를 통해 패킷을 라우팅하려면 정책 라우팅이 필요합니다.

1번 시도 실패

다음 명령을 사용하여 VPN 서버에서 보낸 패킷을 표시하려고 합니다.

iptables -t mangle -A OUTPUT -p tcp -m multiport --sports 1194 -j MARK --set-xmark 14
ip route add table 14 default via WAN_IP
ip rule add fwmark 14 table 14

하지만 여전히 머신 A로 라우팅되고 tcpdump -i tun1머신 B와 머신 A tcpdump -i tun0에서 관찰 할 수 있습니다.

**machine B**
eth0:
22:22:33.734511 IP machine_C_IP.54089 > machine_B_IP.1194: UDP, length 86
tun1:
22:32:42.713371 IP 10.9.0.6.1194 > machine_C_IP.34514: UDP, length 94

**machine A**
tun0:
20:47:47.769628 IP machine_A_IP.openvpn > machine_C_IP.40287: UDP, length 94

2번 시도 실패

또한 openvpn 프로세스 소유자가 패킷을 표시해 보았습니다. 나는에 추가했다[이메일 보호됨] Group = vpnserver그런 다음:

iptables -t mangle -A OUTPUT -m Owner --gid-owner vpnserver -j MARK --set-xmark 14 ip 경로 추가 테이블 14 기본적으로 fwmark 14는 WAN_GATEWAY IP 규칙을 통해 추가됩니다. 표 14

그러나 패킷은 여전히 ​​머신 A로 라우팅됩니다.

일해봐

다음 방법이 효과가 있지만 클라이언트별로 IP별로 경로를 추가해야 해서 불편해서 사용하지 않으려고 합니다. 일부 클라이언트에는 동적 IP도 있으므로 스크립트를 사용하여 도메인 이름으로 올바른 IP를 검색해야 합니다.

ip route add table 14 default via WAN_IP
ip rule add to machine_C_IP table 14

추상적인

실제 라우팅 후에 iptables의 OUTPUT 체인이 적용되기 때문에 태그된 패킷이 올바르게 라우팅되지 않는 것은 아닐까? 아니면 패킷을 표시할 때 뭔가 빠졌나요? 나가는 VPN 서버 패킷을 내 WAN 게이트웨이로 라우팅하는 다른 방법이 있습니까?

현재 상태

노선
default via WAN_GATEWAY dev eth0  table 42 
0.0.0.0/1 via 10.9.0.5 dev tun1 
default via WAN_GATEWAY dev eth0 onlink 
10.1.1.0/24 dev veth0  proto kernel  scope link  src 10.1.1.2 
10.8.0.0/24 via 10.8.0.2 dev tun0 
10.8.0.2 dev tun0  proto kernel  scope link  src 10.8.0.1 
10.9.0.0/24 via 10.9.0.5 dev tun1 
10.9.0.5 dev tun1  proto kernel  scope link  src 10.9.0.6 
WAN_SUBNET/26 via WAN_GATEWAY dev eth0 
WAN_SUBNET/26 dev eth0  proto kernel  scope link  src WAN_IP 
MACHINE_A_IP via WAN_GATEWAY dev eth0 
128.0.0.0/1 via 10.9.0.5 dev tun1
지적재산권 규칙
0:      from all lookup local 
32760:  from all fwmark 0xe lookup 42 
32761:  from all fwmark 0xa lookup 42 
32764:  from all to WAN_IP lookup 42 
32765:  from WAN_IP lookup 42 
32766:  from all lookup main 
32767:  from all lookup default 

답변1

스레드의 이전 답변을 바탕으로 OpenVPN 2.4.3을 실행하는 Ubuntu 17.10(영리한) 컴퓨터에서 문제를 해결한 방법입니다.

1) 역방향 경로 필터링 비활성화

우리는해야합니다유니캐스트 역방향 경로 전달 변경엄격 모드( rp_filter=2) 대신 완화 모드( rp_filter=1)를 사용합니다. 엄격 모드에서는 반환 패킷을 전달하는 데 사용되는 동일한 네트워크 인터페이스에서 들어오는 패킷을 수신해야 합니다.

sysctl -w net.ipv4.conf.<if>.rp_filter=2

<if>컴퓨터가 라우터에 연결하는 데 사용하는 물리적 이더넷 인터페이스는 어디에 있습니까? 제 경우에는 명령이 다음과 같았습니다 sysctl -w net.ipv4.conf.enp2s0.rp_filter=2. 커널 매개변수를 읽으려면 sysctl net.ipv4.conf.<if>.rp_filter.

재부팅 후에도 변경 사항이 유지되도록 하려면 다음 줄을 추가하거나 변경하세요 /etc/sysctl.conf.

net.ipv4.conf.<if>.rp_filter=2

2) 암호화된 패킷을 표시하도록 OpenVPN 서버 설정

서버 .conf파일에 다음을 추가합니다.

mark <value>

여기서는 <value>패킷을 표시하는 데 사용되는 임의의 고유 값입니다. 이렇게 하면 OpenVPN 서버에 의해 암호화된 패킷을 다시 라우팅할 수 있습니다. 나는 그것을 사용했다 mark 9.

OpenVPN 서버를 다시 시작하세요.

3) 새로운 IP 규칙과 IP 경로를 사용하여 표시된 패킷을 라우터로 다시 라우팅합니다.

ip rule add fwmark <value> table <N>
ip route add default via <router> table <N>

어디에 <N>라우팅 테이블의 임의의 고유 번호이고 <router>내 LAN에 있는 라우터의 IP 주소입니다. 즉, 다음 명령을 실행했습니다. ip rule add fwmark 9 table 42ip route add default via 192.168.8.1 table 42.

재부팅 후에도 이러한 변경 사항을 유지하는 것은 더 까다롭습니다. 특히 /etc/network/interfaces네트워크 연결을 관리하기 위해 기존 파일 대신 새로운 netplan 패키지를 사용하는 Ubuntu 17.10의 경우 더욱 그렇습니다. 더 나은 솔루션이 없기 때문에 OpenVPN 시스템 서비스 파일에 일련의 명령을 추가했습니다. OpenVPN이 시작 ExecStartPre=-/sbin/ip rule add fwmark 9 table 42되기 전에 IP 규칙과 경로가 생성됩니다 ExecStartPre=-/sbin/ip route add default via 192.168.8.1 table 42. -명령이 실패하더라도(규칙이나 경로가 이미 존재하는 경우) 서버가 시작되도록 명령 경로 앞에 빼기 기호를 사용합니다 .systemd.service 매뉴얼 페이지더 많은 정보를 알고 싶습니다.

힌트: 저는 OpenVPN 서버를 내 컴퓨터에서 systemd 서비스로 실행하고 있습니다. 제 경우 이 문제를 해결하는 가장 좋은 방법은 파일에서 OpenVPN 서버의 자세한 정보를 늘린 .conf다음 . 역방향 경로 필터링이 비활성화되지 않으면 클라이언트가 연결을 시도할 때 어떤 활동도 볼 수 없을 수도 있습니다. 설정한 후 ( 1단계) 일부 활동을 볼 수 있지만 TLS 핸드셰이크가 실패합니다. OpenVPN 패킷을 라우터로 다시 라우팅하고 나면(2~3단계) 클라이언트가 연결할 수 있었습니다.6journalctl -fu openvpn-server@<conf_file_name>.servicerp_filter2

답변2

왜 실패했는가

1번 시도 실패그리고2번 시도 실패라우팅 결정 후 iptables의 체인이 실행되기 때문에 작동하지 않습니다. iptables에 대한 다이어그램을 참조하세요.http://inai.de/images/nf-packet-flow.png.

게다가,2번 시도 실패잘못된 방법을 사용하여 VPN 서버 인스턴스에 대한 사용자/그룹을 설정했습니다. systemd 단위 파일이 아닌 /etc/openvpn/server.conf에서 사용자 또는 그룹을 지정해야 합니다. 즉:

  1. 사용자 또는 그룹 만들기adduser vpnserver
  2. 그런 다음 사용자 또는 그룹을 /etc/openvpn/server.conf에 추가하십시오. user vpnserver
  3. VPN 서버 프로세스가 이 사용자/그룹으로 실행되고 있는지 확인하세요.ps -A o pid,cmd,user,group|grep vpn

해결책

로컬 프로세스의 패킷은 프로세스에 세트가 있는 경우에만 표시될 수 있습니다.콘센트 옵션. OpenVPN은 다음을 지원합니다: https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage

/etc/openvpn/server.conf의 옵션으로 패킷을 표시 한 --mark value다음 .ip rule add fwmark value table 42ip routes default via WAN_GATEWAY table 42

그러면 머신 C는 머신 B의 VPN 서버에 연결할 수 있습니다.

선택하다

또는 VPN 서버 및 클라이언트에 netns 네임스페이스를 사용한 다음 iptables 체인을 사용할 수 있습니다.

관련 정보