SSH 터널이 어떤 네트워크 인터페이스를 사용하고 있는지 확인하세요.

SSH 터널이 어떤 네트워크 인터페이스를 사용하고 있는지 확인하세요.

2개의 네트워크 인터페이스가 있는 서버가 있습니다.

NAT 방화벽 제한으로 인해 인터넷의 서버에 SSH 터널을 설정합니다.

ssh -fNTMS "/tmp/tunnel.socket" host;

ssh -S "/tmp/tunnel.socket" -O forward -R "0:localhost:22" placeholder

일반적으로 유선 1GB 이더넷 연결(eth0)을 통해 연결되지만 사무실에 있고 사람들이 물건을 옮기고 케이블이 "떨어질" 수 있기 때문에 신뢰할 수 없습니다(불행히도 접착제를 사용할 수 없습니다).

또한 속도가 느리고 비용이 더 많이 드는 모바일 4G 인터넷 연결(eth1)도 있습니다.

터널이 여전히 제대로 작동하는지 확인하기 위해 정기적으로 다음 -O check명령을 사용합니다.

ssh -S "/tmp/tunnel.socket" -O check placeholder
  Master running (pid=3430)

echo $?
  0

실패 하면 -O check소켓이 닫히고(통과 -O exit) 새 SSH 연결이 설정됩니다.

eth0 네트워크 케이블 "떨어짐"으로 인해 오류가 발생한 경우 Linux는 자동으로 eth1을 사용합니다.

이것은 정말 잘 작동합니다.

그러나 eth0이 다시 나타나면 다시 eth0으로 전환하고 싶습니다.

그래서 나는 를 실행하는 동안 -O check터널이 현재 eth1(이 질문의 초점)을 사용하고 있는지 확인하고 eth0이 돌아오면 다시 연결할 수 있다고 생각합니다.


노선 정보:

ip route
  default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.225 metric 100 
  default via 192.168.2.1 dev eth1 proto dhcp src 192.168.2.241 metric 200

eth1의 메트릭은 200이므로 작업 시 eth0이 우선순위를 갖습니다.

아무것도 찾을 수가 없어/proc/3430/

다음과의 연결을 나열할 수 있습니다 lsof.

lsof -ai -p 3430 -n -P

  COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  ssh     3430 craig    3u  IPv4  69362      0t0  TCP 192.168.1.225:43878->1.1.1.1:22 (ESTABLISHED)

그리고 netstat -tpln소켓을 나열할 때 인터페이스가 표시되지 않습니다.

답변1

내가 사용하고 있는 가능한 해결책은 양쪽에 새로운 인터페이스를 만드는 것입니다. 그런 다음 -w스위치를 통해 연결 됩니다 ssh.

먼저 올바른 측정항목을 사용하여 두 개의 로컬 기본 경로를 설정해야 합니다. 무언가 변경될 때마다(eth0 위 또는 아래) 연결이 끊어지지만 이는 문제가 되지 않습니다(계속 읽으십시오).

각 서버에 Tun 장치를 만들고 사용자가 해당 장치에 액세스할 수 있도록 합니다. 다음과 같습니다(상대방의 주소를 바꿔야 합니다).

sudo ip tuntap add dev tun3 mode tun user myuser group mygroup
sudo ifconfig tun3 10.9.0.1 pointopoint 10.9.0.2 netmask 255.255.255.255

글쎄, 그렇다면

ssh -w3:3 myuser@remote_host

ssh두 인터페이스를 터널링하고 ping할 수 있습니다 . 연결이 끊어져도 문제 없습니다. 장치는 tun다시 연결되어 재개될 때까지 기다립니다.

이 시점부터 eth0 또는 4G를 적절하게 사용하지만 주소(10.9.0.1/10.9.0.2)를 유지하는 "안정적인" 링크를 통해 원격 호스트에 연결할 수 있습니다.

대신 플래그(모니터) 와 함께 (및 키)를 ssh사용하는 것이 좋습니다 . 링크 손실을 감지하고 다시 연결합니다.autossh-M

이것은 완전한 VPN(라우팅, 정책, 방화벽 등을 tun 인터페이스에 적용할 수 있음)에 가깝지만 ssh익숙한 기존 VPN을 통해 작동합니다.

답변2

멍청하네요... 터널은 메트릭이 가장 낮은 기본 인터페이스를 사용하므로 단일 인터페이스에 지치지 않습니다.

eth0이 다시 작동하면 데이터가 eth0을 통해 전송됩니다.

이로 인해 연결이 실제로 실패하게 되므로 ServerAliveInterval/를 사용하여 ServerAliveCountMax연결을 알리고 닫아야 합니다.

관련 정보