IP 전달 활성화 시 라우팅 문제

IP 전달 활성화 시 라우팅 문제

작업 현장

다음 두 가지 시나리오가 있습니다.서브넷

  Subnet 1: 192.168.1.0/24
  Subnet 2: 192.168.2.0/24

그리고 세라우터

Router 1: 192.168.1.1
Router 2: 192.168.2.1
Router 3: 192.168.1.10 / 192.168.2.10

라우터 1과 2는 각 서브넷을 인터넷에 연결하고 모든 클라이언트 컴퓨터에서 기본 게이트웨이로 구성됩니다. 라우터 3은 두 개의 서브넷을 연결합니다. 서브넷 간의 라우팅이 작동하도록 하기 위해 2를 구성했습니다.정적 라우팅

  Router 1: Destination 192.168.2.0, Netmask 255.255.255.0, Gateway 192.168.1.10
  Router 2: Destination 192.168.1.0, Netmask 255.255.255.0, Gateway 192.168.2.10

내 목표는 서브넷 1의 클라이언트가 서브넷 2의 http/https 서버에 액세스할 수 있도록 하는 것입니다.

Client 1: 192.168.1.20        (Debian 9)
Server 1: 192.168.2.20        (Windows Server)

클라이언트 1에서 서버 1을 ping하고 wget할 수 있습니다.

# ping 192.168.2.20
PING 192.168.2.20 (192.168.2.20) 56(84) bytes of data.
64 bytes from 192.168.2.20: icmp_seq=2 ttl=128 time=0.993 ms
64 bytes from 192.168.2.20: icmp_seq=3 ttl=128 time=0.943 ms
64 bytes from 192.168.2.20: icmp_seq=4 ttl=128 time=1.06 ms
64 bytes from 192.168.2.20: icmp_seq=5 ttl=128 time=1.77 ms
^C
--- 192.168.2.20 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4046ms
rtt min/avg/max/mdev = 0.943/1.193/1.774/0.338 ms

# wget -O- http://192.168.2.20/
--2019-06-26 08:59:12--  http://192.168.2.20/
Connecting to 192.168.2.20:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: /Test [following]
--2019-06-26 08:59:15--  http://192.168.2.20/Test
Reusing existing connection to 192.168.2.20:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘STDOUT’

-                                   [<=>                                                   ]       0  --.-KB/s
<!DOCTYPE html>
<html>Hello World!</html>
-                                   [ <=>                                                  ]   5.77K  --.-KB/s    in 0.002s

2019-06-26 08:59:15 (2.79 MB/s) - written to stdout [5912]

여태까지는 그런대로 잘됐다. 가끔 첫 번째 핑만 손실되는 경우가 있는데, 제가 이해하는 바에 따르면 이는 문제가 되지 않습니다.

질문

이제 클라이언트 1(tun0, 서브넷 10.0.0.0/24)에 OpenVPN 서버를 설정해야 합니다. VPN 클라이언트가 클라이언트 1뿐만 아니라 서브넷 1의 다른 클라이언트에도 액세스할 수 있도록 활성화했습니다.IP 포워딩/etc/sysctl.conf에서

net.ipv4.ip_forward=1

IP 전달을 활성화했을 때 위의 라우팅 설정에 문제가 발생하기 시작했습니다. 클라이언트 1에서 여전히 서버 1을 ping할 수 있지만 wget을 사용한 통신은 더 이상 제대로 작동하지 않습니다.

# ping 192.168.2.20
PING 192.168.2.20 (192.168.2.20) 56(84) bytes of data.
From 192.168.1.1: icmp_seq=2 Redirect Host(New nexthop: 192.168.1.10)
64 bytes from 192.168.2.20: icmp_seq=2 ttl=128 time=0.935 ms
From 192.168.1.1: icmp_seq=3 Redirect Host(New nexthop: 192.168.1.10)
64 bytes from 192.168.2.20: icmp_seq=3 ttl=128 time=0.880 ms
From 192.168.1.1: icmp_seq=4 Redirect Host(New nexthop: 192.168.1.10)
64 bytes from 192.168.2.20: icmp_seq=4 ttl=128 time=0.975 ms
^C
--- 192.168.2.20 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3041ms
rtt min/avg/max/mdev = 0.880/0.930/0.975/0.038 ms

# wget -O-  http://192.168.2.20
--2019-06-26 14:08:38--  http://192.168.2.20/
Connecting to 192.168.2.20:80... connected.
HTTP request sent, awaiting response... Read error (Connection reset by peer) in headers.
Retrying.

--2019-06-26 14:09:12--  (try: 2)  http://192.168.2.20/
Connecting to 192.168.2.20:80... connected.
HTTP request sent, awaiting response... Read error (Connection reset by peer) in headers.
Retrying.

^C

wget은 여전히 ​​서버 1에 대한 연결 설정을 관리하지만 위의 오류를 표시하기 전에 응답을 위해 약 30초를 기다립니다.

IP 전달로 인해 클라이언트 1과 서버 1 간의 통신이 중단되는 이유에 대한 아이디어가 있습니까? OpenVPN 클라이언트에서 동시에 서버 1로 라우팅하고 서브넷 1에 액세스하도록 클라이언트 1을 올바르게 구성하는 방법에 대한 제안 사항이 있습니까?

클라이언트 1에 추가 고정 경로를 구성하고 싶지 않지만 기본 게이트웨이에는 고정 경로를 유지하고 싶습니다.

답변1

현재 설정의 영향과 결과를 요약하려면 다음을 수행하세요.

귀하의 시스템고객 1표준 구성에서는 192.168.2.0/24에 대한 특정 정보를 알 수 없습니다. 이것은 실제로라우터 1192.168.2.0/24에 대한 특정 경로는 다음과 같이 정의됩니다.라우터 3. 그렇게 할 때고객 1192.168.2.20에 액세스하려고 시도하면 라우팅 테이블을 살펴보지만 구체적인 내용은 찾지 못하고 기본 경로를 사용합니다.라우터 1.라우터 1자신의 경로가 동일한 LAN에 있음을 감지하여 라우팅 대신에 알려줍니다.고객 1,사용하여ICMP 리디렉션, 사용라우터 3(192.168.1.10 게이트웨이 IP) 직접.고객 1기본적으로 단순 호스트로서 ICMP 리디렉션 메시지를 수락하고 현재 대상 192.168.2.20에 대한 경로를 변경하여 192.168.1.1 대신 192.168.1.10을 통과합니다.

왜냐하면 귀하의 시스템고객 1이제 10.0.0.0/24의 노드와 192.168.1.0/24의 노드 사이에서 라우터 역할을 하므로 라우터로도 설정해야 합니다(예: 다음을 사용하여).net.ipv4.ip_forward=1).

문제는 사이의 기본 상호 작용입니다IP 포워딩그리고리디렉션 수락:

accept_redirects - BOOLEAN
  Accept Redirects.

  Functional default: enabled if local forwarding is disabled.
              disabled if local forwarding is enabled.

이제 이것이 현재 문제입니다. 전달이 활성화되었으므로 리디렉션 허용이 비활성화됩니다. 따라서 ICMP 리디렉션을 무시하고 더 이상 192.168.1.10을 사용하지 않습니다. 이를 방지하는 방법에는 두 가지가 있습니다.

  • 하고 싶지 않은 일(하지만 어쨌든 먼저 제안하고 싶습니다): 왜냐면고객 1어쨌든 이제 특정 구성이 있는 라우터(VPN...)에서 특정 구성을 완료합니다. 192.168.2.0/24에 올바른 특정 경로를 추가합니다.

    # ip route add 192.168.2.0/24 via 192.168.1.10
    

    만약에고객 1다음과 같이 구성됨위 아래라면, 올바른 내용을 추가할 수 있습니다.상호 작용다음 추가 줄이 있는 섹션:

        up ip route add 192.168.2.0/24 via 192.168.1.10
    

    다른 방법의 경우 동등한 방법을 검색하십시오(예: GUI 애플릿을 사용하여 NetworkManager를 구성할 수도 있음).

    이제 라우터 역할을 하는 시스템은 리디렉션이 필요하지 않고 리디렉션 수신을 트리거하지 않기 때문에 자유롭게 ICMP 리디렉션을 무시할 수 있습니다.

  • 또는 전달 중에도 ICMP 리디렉션이 무시되지 않도록 특정 인터페이스의 특정 동작을 조정할 수 있습니다.

    이것인터페이스 특정변형 세부 설명은 추가 옵션을 제공합니다.

    accept_redirects - BOOLEAN
      Accept ICMP redirect messages.
      accept_redirects for the interface will be enabled if:
      - both conf/{all,interface}/accept_redirects are TRUE in the case
        forwarding for the interface is enabled
      or
      - at least one of conf/{all,interface}/accept_redirects is TRUE in the
        case forwarding for the interface is disabled
      accept_redirects for the interface will be disabled otherwise
      default TRUE (host)
          FALSE (router)
    

    기본 설정net.ipv4.ip_forward=1설정에 부작용이 있을 수 있음net.ipv4.conf.all.accept_redirects=0(그리고 다시 설정ip_forward=0다시 재설정됩니다net.ipv4.conf.all.accept_redirects=1! ) 첫 번째 인용문에 언급된 바와 같습니다. 이제 다음과 같이 표시됩니다.

    # sysctl net.ipv4.conf.all.accept_redirects net.ipv4.conf.default.accept_redirects
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 1
    

    따라서 모든 인터페이스는 상속됩니다.기본값은 1이지만 전역적으로 전환됩니다.모두(이 특정 설정의 경우 인터페이스 값이 적용되지 않습니다.) 설정되지 않았습니다. 이 값을 거의 뒤집어야 합니다.모두1로,기본연결된 인터페이스를 제외한 모든 인터페이스에 대해 0입니다.서브넷 1(라고 가정하면이더넷 0)도 1로 설정됩니다. ICMP 리디렉션은 보안상의 이유로 또는 잘못 구성된 여러 라우터 간의 루프 트리거를 방지하기 위해 종종 무시되므로 필요하지 않은 경우 무시하는 것이 가장 좋습니다. 어쨌든 여기서는 필요한 것만 활성화하고 아무것도 비활성화하지 않을 것입니다(주로 다른 인터페이스 이름을 모르기 때문에). 자유롭게 그렇게 하십시오. 인터페이스에 대해 다시 생각해보세요서브넷 1~라고 불리는이더넷 0:

    # sysctl -w net.ipv4.conf.all.accept_redirects=1 # must be done AFTER net.ipv4.ip_forward=1
    # sysctl -w net.ipv4.conf.eth0.accept_redirects=1 # which should be already set
    

    시작 시 구성할 수 있습니다.sysctl.d설정뒤쪽에이전 설정.

이제 왜 핑이 계속 작동하고 연결이 실패하기 전에 작동하기 시작하는지 정말 모르겠습니다.

두 경우 모두 참고: 10.0.0.0/24의 시스템은 이제 192.168.2.0/24에 부분적으로 액세스할 수 있습니다(아마도 자체 VPN 구성을 조정하여). 그 이유 중 하나는 10.0.0.0/24로 돌아가는 경로를 아는 사람이 아무도 없기 때문입니다.고객 1NAT를 수행 중입니다. 안전 효과를 반드시 고려하십시오. 방화벽 설정을 추가해야 할 수도 있습니다(예:iptables) 라우팅을 비활성화합니다.

답변2

OpenVPN은 패킷을 올바른 대상(올바르게 구성된 경우)으로 전달해야 하므로 클라이언트 1에서는 ip_forwarding이 필요하지 않은 것이 좋습니다. 그러나 어쨌든 출력(전달이 켜진 후)에는 패킷이 라우터 1로 먼저 전송된 것으로 표시됩니다. 라우팅이 이를 라우터 3으로 직접 전달해야 하기 때문에 문제는 그 이유입니다. 따라서 먼저 라우터 3에서 라우팅된 패킷을 확인하여 소스 및 대상 주소를 확인할 수 있습니다. "tcpdump -v -s0 -X"가 트릭을 수행합니다.

관련 정보