Szybkie pytanie - uruchamiam dwa urządzenia z linuksem, jeden na moim pulpicie, a drugi na moim VPS. Ze względów bezpieczeństwa po stronie VPS zdecydowałem się na połączenia gniazd z MySQL ( /var/run/mysqld/mysql.sock
). Wiem, że mogę tunelować w ten sposób: ssh -L 3307:127.0.0.1:3306 [email protected]
jeśli skonfiguruję zdalny serwer sql do nasłuchiwania na jakimś porcie, ale chcę wiedzieć, czy mogę zrobić coś takiego: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock
tunelując dwa gniazda, a nie dwa porty?
Idealnym rozwiązaniem byłoby również przekierowanie portu lokalnego do pliku zdalnego gniazda, ale tam, gdzie to możliwe, staram się, aby serwery TCP nie działały na zdalnym urządzeniu.
(i tak, wiem, że tcp byłoby łatwiejsze).
Odpowiedzi:
Przekaż lokalne gniazdo na żądanie
socat
na obu końcachnastępnie
skradzione z przekazywania gniazd domeny unix za pomocą ssh i socat
źródło
Chociaż w czasie, gdy pytanie zostało zadane, było to naprawdę niemożliwe, ale jest możliwe obecnie.
Możesz zarówno: UNIX => TCP i UNIX => UNIX forwarding.
Na przykład:
Jest to możliwe, ponieważ OpenSSH 6.7.
źródło
ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
nie zrobiłem tego, ale spróbowałbym z socat . może coś takiego:
ponownie, nigdy nie zrobiłem czegoś takiego.
źródło
Od ssh 6.7 nie jest już potrzebne socat. Możesz przekazywać gniazda domeny unix bezpośrednio, takie jak:
Więcej informacji: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
źródło
Kolejna modyfikacja odpowiedzi @mpontes '/ @ javier
Odkurzacz
PROS
Cecha
-f
opcja nie jest używana, możesz albo użyć klucza publicznego i uruchomić się w tle za pośrednictwem,&
albo możesz zalogować się interaktywnie i użyć Ctrl + Z i użyć tego samego$!
do przechowywania pid.CONS
-f
opcji ssh, ponieważ w ten sposób stracisz pid ssh. Ta metoda polega na uruchomieniu na pierwszym planie i Ctrl + C, aby zabić.Wyjaśnienie
socat ...&
- uruchom socat w tle na zdalnym serwerzepid=$!
- przechowuj pidtrap kill\ $pid 0
- działakill $pid
na zakończenie bashwhile :; sleep...
- usiądź w nieskończonej pętliecho -ne \ \b
- Echo, po którym następuje backspace. Nie udaje się to natychmiast po odłączeniu ssh. W przypadku asleep 5
oznacza to, żesocat
może działać do 5 sekund po sshUwaga: Właściwie testowano przy użyciu docker, port
2375
,/var/run/docker.sock
oraz zmienną środowiskowąDOCKER_HOST='tcp://localhost:2375'
, ale powinien działać dla mysql wszystko jednoAktualizacja
Korzystając z kontrolek SSH , możesz użyć
-f
flagi na mój sposób, po prostu dodaj następujące flagiI dostaniesz
Teraz możesz zakończyć wszystkie kontrolowane sesje za pomocą
Te
-o
opcje mogą być zapisane w.ssh/config
pliku, lub można użyć zamiast -S (ale będziesz nadal potrzeba-o ControlMaster
)źródło
docker run ... connect.sh
celu ustawienia tunelu, a następniedocker run ... deploy.sh
. Próbowałemnohup
,&
idisown
ale wydają się przebićsocat
przez zamknięciestdout
i wyzwalaniakill
. Jakieś pomysły na poprawki w celu wsparcia tej sprawy (tj. Wciąż blisko, gdy SSH przetrwa, ale przetrwa odrzucenie)?-f
i& disown
) w terminalu. Najwyraźniej problem jest tworzony przez skrypt „wrapper”. Z chęcią przyjmę opinie, ale teraz szukam bardziej odpowiednich pytań i odpowiedzi.docker run ... connect.sh
, adocker exec {container name/id} deploy.sh
więc oni grają razem.exec
już narun
kontenerze, a potok SSH nie trwał poexec
zakończeniu. Wyjaśniłem, że było to spowodowane dziwactwem w sposobie wykonywania skryptów. Jeśli przeniosłem wywołanie do własnego skryptu i zadzwoniłemnohup <script.sh> & disown
, to przetrwa on ukończenieexec
.Opracowanie odpowiedzi Javiera działa dla mnie:
ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"
Musisz być
fork
w stanie połączyć się wiele razy bez śmierci, po zamknięciu pierwszego połączenia. Ponadto sposób, w jaki socat pozwala określić adres do powiązania, odbywa się poprzezbind
opcję, a nie jako adres przed portem.Następnie po prostu połącz się
localhost:9999
tak, jak zwykle. Następnie, aby porzucić tunel:ssh -f [email protected] "killall socat"
(lub coś podobnego, możesz zrobić bardziej skomplikowane rzeczy, które wymagają zachowania PID socat)
źródło
Tak, możesz używać socat.
Najpierw wykonaj tunel TCP za pomocą SSH. Następnie użyj socat w następujący sposób:
socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306
Następnie daj uprawnienia nowemu utworzonemu gniazdu (może być chmod 777)
źródło
chmod 777
: nie nie nie nie nie! Nigdy nie biegajchmod 777
. To praktycznie nigdy nie jest wymagane! Nawet do „celów testowych”. Jeśli plik jest czytelny, to jest czytelny. Jeśli jest zapisywalny przezuser
lubgroup
który musi do niego napisać, to jest zapisywalny. Absolutnie nie ma potrzeby udzielania wszystkim uprawnień do zapisu, a zapomnieniechmod
o czymś przy zdrowych zmysłach jest dokładnie tym, w jaki sposób hakowane są międzynarodowe korporacje. Po prostu nie rób tego. Zawsze. Napisałem wprowadzenie do uprawnień Unix . Proszę przeczytaj to!