자동 재 연결 TCP 터널


9

두 컴퓨터 사이에 신뢰할 수없는 네트워크 연결이 있습니다. 때때로 제어 할 수없는 이유로 활성 TCP 연결이 끊어집니다. 두 컴퓨터 사이에 안정적인 TCP 연결 을 설정하고 싶습니다 .

네트워크가 안정적이라면 ssh -L 1234:localhost:1234 remotehost서버는 포트 1234를 수신 대기 remotehost하고 클라이언트를 가리켜 실행합니다 localhost:1234. 그러나 ssh 연결이 종료되면 전달 연결도 마찬가지입니다. 클라이언트와 서버 간의 연결을 자동으로 복원하려면 어떻게해야합니까?

비 솔루션 :

  • 대화 형 응용 프로그램 용이 아니므로 화면 이 적용되지 않습니다.
  • 이것은 단지, 자동으로 라 SSH를 터널을 다시 연결에 대한 아니다 autossh를 . 동일한 터널링 된 TCP 연결을 계속 사용하고 싶습니다. 새 연결은 시작하지 않습니다.
  • 원칙적으로 VPN이 트릭을 수행합니다. 그러나 TCP 연결을 하나만 원하면 과도하게 보일 수 있으며 양쪽에 루트 권한이 없어도 작동하는 솔루션을 원합니다.

나는 그 일을하는 프로그램의 희미한 기억 rocks을 가지고 있지만 웹의 얼굴에서 떨어진 것 같습니다. 나는 주로 양측의 리눅스에 관심이 있지만 (이 레벨의 프로그램은 다른 유니스에 이식 가능할 것으로 기대하지만) QNX와 VMS 사이에서 작동하는 프로그램을 알고 있다면 더 좋습니다.


Gilles, ssh 연결과 함께 tcp keepalives를 사용하고 있습니까? 그렇지 않은 경우, 신속하게 ... 첫번째 일부 NAT 구현 시간 연결이 시도
마이크 페닝 턴

@ 마이크 : 팁 주셔서 감사합니다. 즉각적인 필요는 없지만 일부 중간 경로가 왔다가 갔을 때 (TCP keepalives가 좋은 것보다 더 해로운 경우) NAT가 오버로드되어 삭제 된 상황 (TCP keepalives가 도움이 될 수 있음)에 직면했습니다. TCP keepalives는 어쨌든 연속 스트림 (예 : scp)에 중요하지 않습니까? 어쨌든 나는이 장군을 지키고 싶습니다 : 다음에 나는 어떤 맛의 색다른 네트워크에 직면 할 때 어떻게해야합니까?
Gilles 'SO- 악마 그만해'

Gilles, 솔루션은와 같은 상수 스트림에 대해 다릅니다 scp. 포트 포워딩 예제를 기반으로 ssh keepalives로 응답하고있었습니다. Re : 비정상적인 다운 스트림 홉, 견딜 수 있는 keepalives로 ssh 세션을 만드는 것 외에는 할 수있는 일이 많지 않습니다 (예 : ServerAliveInterval > 0및을 사용 하여 삭제 된 keepalives를 더 많이 허용 ServerAliveCountMax > 3). NAT는 더 낮은 유지 간격을 요구합니다. 중요한 문제는 문제가 무엇인지 식별하고 그에 따라 조정하는 것입니다. 옵션 .ssh/config은 항상 당신을 위해 거기에 넣습니다
Mike Pennington

@ Mike : 사용 사례 중 하나는 클라이언트가 과부하 된 NAT에서 IP를 가져와 활성 연결을 임의로 삭제하는 것입니다 (필요한 것보다 더 많은 P2P를 생각하십시오). 몇 초 후에 클라이언트는 다시 연결을 관리하지만 다른 IP 주소를 얻을 수 있습니다. 이 경우 TCP 연결이 유지되는 방법은 없습니다. Rocks는 대처하지만 오늘날의 시스템에서 즉시 컴파일되는 것을 선호합니다.
Gilles 'SO- 악마 그만해'

NAT가 새로운 IP를 제공하는 경우 NAT를 고정 시키거나 다른 rocks구현을 희망하는 것보다 할 수있는 일은 많지 않습니다 . 비록 이것이 명백한 문제이지만
Mike Pennington

답변:


5

오래된 당신이 찾고 있는 유지되지 않는 신뢰할 수있는 소켓 ( )입니까?


1
고마워요, Rocks는 정말로 내가 기억 한 것입니다. 물론 나는 유지되는 것을 선호합니다.
Gilles 'SO- 악마 중지'

@ Gilles'SO-stopbeingevil '그것은 유지되지 않을뿐만 아니라 인터넷의 얼굴을 완전히 떨어 뜨린 것 같습니다!
Michael

1

이 기능을 알고있는 유일한 표준 프로토콜은 MPTCP 입니다. 응용 프로그램 계층에 투명하므로 MPTCP 위에 SSH가 작동해야합니다. IP가 다른 여러 경로에서 기본 TCP 연결을 실행할 수 있으므로 원칙적으로 VPN 연결 여부에 따라 SSH 연결을 VPN 연결 안팎으로 마이그레이션하는 데 사용할 수 있습니다.

MPTCP 구현의 성숙도에 대해서는 잘 모르지만 프로토콜 디자인은 상당히 견고합니다.

네트워크 연결이 불안정하여 SSH 연결이 끊어지지 않도록 보호해야합니다. SSH 연결을 끊고 싶은 mitm으로부터 당신을 보호하지는 않습니다. mitm은 여전히 ​​손상된 데이터를 주입 할 수 있으며 SSH는 연결을 감지하고 끊습니다.

SSH 프로토콜에 다시 연결하는 방법과 같은 MPTCP는 가능한 한 가장 오랫동안 연결을 유지하는 방법입니다. 그러나 그런 기능이 SSH 프로토콜을 위해 설계된 것은 아니라고 생각합니다.


0

daemontoolsssh 포트를 앞으로 유지하는 데 사용할 수 있습니다 . ssh의 연결이 끊어지면 로컬 포트가 연결을 거부하기 시작하는 것처럼 연결이 끊어진 동안 연결에 따라 프로그램을 유지하지 않아도되지만 시작입니다.

iptablesssh forward가 사라지면 포트를 DROP 패킷으로 보내는 것과 같은 트릭 이 있다고 생각 하므로 연결 프로그램은 패킷이 거부되고 거부되지 않는다는 것을 알 수 있습니다. 나는 단지 daemontools(다시) 나 자신을 배우고 있기 때문에 서비스가 죽을 때 사용자 정의 스크립트를 실행할 수 있는지 확실하지 않지만 할 수 있다고 생각합니다.


-2

TCP가이를 자동으로 수행합니다. 원격 TCP 연결을 종료하는 데 사용되는 일반적인 실제 정리 해킹을 비활성화하거나 약화시키기 만하면됩니다. 연결에 대해 TCP keepalive를 비활성화하고 과도한 재전송에 대한 제한을 크게 늘리십시오. 예를 들어 Linux에서는에 큰 숫자를 씁니다 /proc/sys/net/ipv4/tcp_retries2.

그러나 최신 네트워크에서 상태 저장 패킷 검사 방화벽은 정기적으로 패킷을 교환하지 못하는 TCP 연결을 잊어 버릴 수 있으므로 퍼레이드에 비가 올 수 있습니다.


1
각 엔드 포인트에 고정 IP 주소가 있고 상태 저장 미들 박스가없는 한 TCP가 상황을 처리 할 수있는 것은 사실입니다. 질문 reasons beyond my control은 동적 IP 또는 상태 저장 미들 박스로 읽습니다. 이러한 시나리오에서 TCP keepalive는 약간 도움이 될 수 있습니다. 그러나 TCP keepalive를 구성하는 방법에 관계없이 미들 박스가 다시 시작되어 상태가 유실 될 때 연결을 유지하는 것만으로는 충분하지 않습니다.
kasperd

@kasperd 동의합니다. 그러나 이러한 경우 TCP 연결을 열어 두는 것은 쓸데없는 일입니다. 따라서, 나는 질문자가 그 특정한 도전에 직면하고 있지 않다고 가정했다.
aecolley

두 엔드 포인트를 모두 제어하고 MPTCP를 지원하는 스택으로 업그레이드 할 수 있다면 쓸모가 없습니다. 또한 MPTCP 없이도 TCP 위에 응용 프로그램 계층 솔루션을 구현할 수 있습니다.
kasperd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.