1

Temat: Dropbear i port forwarding

Potrzebowałem ostatnio za pomocą SSH otworzyć odwrotny tunel z zewnątrz do mojego routera. Niestety nie potrafię tego zrobić, a raczej potrafię, ale na routerze port jest otwarty tylko dla localhosta, a nie dla wszystkich po stronie LAN:

root@xxx:~# netstat -na | grep 466
tcp        0      0 127.0.0.1:4666          0.0.0.0:*               LISTEN

Uprzednio zmieniłem konfigurację dropbear'a włączając GatewayPorts i w tej chwili mam w /etc/config/dropbear

config 'dropbear'
        option 'PasswordAuth' 'on'
        option 'Port' '22'
        option 'GatewayPorts' 'yes'

Ponadto na zdalnym komputerze w konfiguracji putty mam zaznaczone w "Port forwarding", że "Remote ports do the same", w sensie że przyjmują połączenia z innych hostów. Czy jest jeszcze coś, co można spróbować zrobić, czy może ta implementacja dropbeara "tak ma"? Czy ktoś mógłby coś jeszcze zasugerować?

Pozdrawiam

Grzesiek

2 (edytowany przez build000 2014-12-10 11:56:18)

Odp: Dropbear i port forwarding

Najlepiej przekieruj z WAN do LAN usługę ssh na innym porcie po stronie WAN, niż ma dropber w tym routerze - tak jest najprościej i najpewniej.
Wtedy wołasz ze zdalnego hosta np. (jak to jakaś powłoka linuxa):
ssh xxx@yyy.zz -p XXXX
i zawsze Cię wtedy przekieruje na serwer ssh na danym urządzeniu LAN, gdzie urządzenie może słuchać np. na domyślnym porcie 22 (czy jakimkolwiek innym - nikt nie mówi, że musi to być 22 - wszystko zależy od tego jak to sobie ustawisz - nawet bezpieczniej jest używać innego portu - w routerze też zresztą warto przestawić domyślny port na inny).
Krótko mówiąc izolujesz usługę ssh dla routera od tej w urządzeniach LAN - i tak jest najbezpieczniej.
Generalnie to zły pomysł mieć otwarty ssh na routerze od strony WAN, jak jest już niepotrzebny - unikać takiej sytuacji jak to tylko możliwe.

3 (edytowany przez itias 2014-12-10 13:25:42)

Odp: Dropbear i port forwarding

Tutaj chodzi o nieco bardziej skomplikowany przypadek, chodzi mi o reverse port forwarding. Czyli z zewnątrz wywołanie polecenia:

ssh -f -N -q -R LAN_IP:4666:localhost:4666 xxx@yyy.zz

Scenariusz jest taki: mam sieć domową (A) za routerem z openwrt. Router ma zewnętrzne IP. Mam też komputer w innej sieci (B), za NAT'em i firewallem, i potrzebuję się czasem podłączyć do jednej z usług na tym komputerze, do konkretnego portu. Trudność polega na tym, że nie kontroluję tego NAT'a i firewalla. Zatem jedyną możliwością jest otwarcie portu na moim routerze od strony LAN, z którego ruch będzie przekazywany na port tego komputera na zewnątrz. Ale trzeba to zainicjować z komputera w sieci B, stąd reverse port forwarding. Port na routerze się otwiera, ale tylko lokalnie, pomimo że GatewayPorts w dropbearze jest ustawione na "yes". Jak zrobić, żeby port był dostępny z innych komputerów w sieci A?

4

Odp: Dropbear i port forwarding

Otwórz na firewallu. Dropbear tego nie zrobi samodzielnie.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: Dropbear i port forwarding

Na firewallu nie mogę, bo nim nie administruję, stąd konieczność remote port forwardingu. A dropbear to robi, jak widać poniżej:

root@xxx:~# netstat -na | grep 466
tcp        0      0 127.0.0.1:4666          0.0.0.0:*               LISTEN

ale ja bym chciał tak:

root@xxx:~# netstat -na | grep 466
tcp        0      0 10.0.0.1:4666          0.0.0.0:*               LISTEN

jeśli 10.0.0.1 to interfejs LAN mojego routera.
W pierwszym przypadku, czyli to co umiem zrobić, forwardowany port jest widziany tylko "wewnątrz" routera, a w drugim przypadku w całym LAN'ie. Pytanie zatem, czy jest to ograniczenie dropbeara, który pomimo ustawienia GatewayPorts na yes, ignoruje to ustawienie?

6

Odp: Dropbear i port forwarding

Nic nie zrobiło. To co pokazałeś to tylko oznacza że słucha na danym interfejsie (lub wszystkich). Nie oznacza to ze magicznie na firewallu też jest do niego dostęp.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7

Odp: Dropbear i port forwarding

Ach, widzę niedopowiedzenie, już tłumaczę: to jest wynik polecenia netstat wykonanego na routerze w sieci domowej, czyli w sieci A, po utworzeniu odwrotnego tunelu przez putty z sieci B. Czyli port został zdalnie otwarty, tyle tylko, że słucha na interfejsie 127.0.0.1 a nie na 10.0.0.1 czyli LAN.

8

Odp: Dropbear i port forwarding

Jeszcze raz dla wyjaśnienia wszystkich wątpliwości, chciałem przedstawić rysunek.
Ponieważ nie mam uprawnień do konfiguracji firewalla w lokalizacji, gdzie stoi komputer z aplikacją, do której chcę się podłączyć, niemożliwe jest proste połączenie (linia czerwona). W związku z tym otwieram zdalny port na swoim domowym routerze, który jest przekazywany do portu na komputerze za firewallem. Robię to za pomocą putty na tymże komputerze za firewallem, wykorzystując remote port forwarding (linia niebieska). W teorii powinno to umożliwić połączenie z laptopa poprzez tak zestawione połaczenie (linia zielona). Niestety, pomimo że port na routerze otwiera się, nasłuchuje jedynie na adresie 127.0.0.1, a zatem nie mogę podłączyć się do tego portu z mojej podsieci domowej. Czy ktoś miałby jakieś sugestie, dlaczego pomimo włączonej opcji GatewayPorts na routerze, nie mogę uzyskać tego połączenia?
port forwarding

9

Odp: Dropbear i port forwarding

Odpowiedź poniekąd wydaje się banalna - bo po to jest firewall na tym komputerze, żeby zablokować taki banalny sposób na nieautoryzowany dostęp do portów/usług/aplikacji na komputerze z tymże firewallem. Nie masz dostępu do firewall na tym kompie - nic nie zdziałasz (w teorii). Chyba nie oczekujesz, że Ci ktoś na tym forum napisze jak obejść ten firewall ?
smile

10

Odp: Dropbear i port forwarding

Nie chodzi o obejście firewalla (który akurat jest zupełnie osobnym urządzeniem), bo jak najbardziej mogę się dostać do tej sieci poprzez VPN, ale jest to niewygodne z różnych względów, np. rozłączanie raz dziennie, przekierowanie całego ruchu sieciowego przez VPN etc. etc. Poza tym, przecież piszę, że potrafię to zrobić, ponieważ tunel się otwiera, i nawet potrafię się podłączyć tworząc drugi tunel z laptopa do mojego routera (o czym nie pisałem, żeby nie zaciemniać obrazu), ale chcę to uprościć.
Zadałem więc pytanie techniczne, związane z konfiguracją dropbear'a, licząc że ktoś kto ma wiedzę, spróbuje pomóc (jak Cezary i build0000), a jak ktoś nie wie to nie będzie bił piany smile

11 (edytowany przez build000 2014-12-12 11:00:16)

Odp: Dropbear i port forwarding

To nie w tym rzecz, że ogólnie się da (jak sam sugerujesz np. vpn) - chodzi o to raczej jak, tzn. tym czym gdy się to robi (dropbera, ssh) to już nie jest autoryzowany i poprawny sposób i poniekąd zakrawa na włamanie - ja to np. tak widzę, inni mogą mieć inne zdanie - być może ktoś Ci podpowie. wink
Poza tym autorzy openwrt słusznie ograniczyli możliwości tej usługi - teraz np. możesz się przekonać dlaczego.

12

Odp: Dropbear i port forwarding

@build000: o i to jest już odpowiedź na moje pytanie, choć może pośrednia. Szkoda tylko, że nie napisałeś wcześniej, że takie ograniczenie istnieje, zaoszczędziłbym trochę czasu na eksperymenty. Jak już pisałem, mogę to zrobić inaczej, choć mniej wygodnie, więc przy tym pozostanę. A posądzanie mnie o włamanie to jest trochę nadinterpretacja (szczególnie w świetle posta nr 10), ale to chyba dosyć popularne, że szuka się u kogoś najgorszych intencji, prawda? wink

13

Odp: Dropbear i port forwarding

O nic Cię nie posądzam, ale tak na zdrowy rozum na pewne kwestie trzeba zwracać uwagę - nie zapominaj, że to i podobne fora czytają różni ludzie. Ja osobiście czytam, bo zawsze mogę coś nowego się dowiedzieć z zakresu szeroko pojętego serwisu z własnym openwrt/gargoyle. Raczej skłaniam się ku zainteresowaniom jak uczynić mój router/sieć bardziej bezpieczną - to tyle.

14 (edytowany przez krzyk 2014-12-17 15:53:21)

Odp: Dropbear i port forwarding

itias napisał/a:

Potrzebowałem ostatnio za pomocą SSH otworzyć odwrotny tunel z zewnątrz do mojego routera. Niestety nie potrafię tego zrobić, a raczej potrafię, ale na routerze port jest otwarty tylko dla localhosta, a nie dla wszystkich po stronie LAN:

root@xxx:~# netstat -na | grep 466
tcp        0      0 127.0.0.1:4666          0.0.0.0:*               LISTEN

Uprzednio zmieniłem konfigurację dropbear'a włączając GatewayPorts i w tej chwili mam w /etc/config/dropbear

config 'dropbear'
        option 'PasswordAuth' 'on'
        option 'Port' '22'
        option 'GatewayPorts' 'yes'

Hej,

Własnie walczyłem z tym samym problemem.

Wygląda na to, że w tutorialu Cezarego jest błąd: http://eko.one.pl/?p=openwrt-sshtunnel
Prawidłowa opcja do odblokowania forwardowania portów w pliku /etc/config/dropbear to:

        option GatewayPorts 'on'

możesz to zweryfikować patrząc na procesy:

 ps | grep drop
 3083 root      1232 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22 -a

jeśli parametr -a jest obecny to opcja jest aktywna
(-a              Allow connections to forwarded ports from any host)

Dodatkowo demon dropbear działa trochę inaczej niż inne unixowe sshd i domyślnie nasłuchuje tylko na 127.0.0.1.

Żeby to zmienić musisz przy tworzeniu reverse tunelu od strony klienta wskazać konkretny interfejs na serwerze.

Czyli zamiast:

ssh -f -NT -R 4445:localhost:22 192.168.1.2

Wywołujesz:

ssh -f -NT -R 192.168.1.2:4445:localhost:22 192.168.1.2 

lub bardziej ogólnie:

ssh -f -NT -R 0.0.0.0:4445:localhost:22 192.168.1.2 

(wtedy serwer słuch na wszystkich interfejsach - czyli działa tak jak inne demony sshd).

Pzdr
Krzych

15

Odp: Dropbear i port forwarding

W sensie?  GatewayPorts  jest czytany boolem, więc reaguje na on/off/1/0/yes/no

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

16

Odp: Dropbear i port forwarding

Cezary napisał/a:

W sensie?  GatewayPorts  jest czytany boolem, więc reaguje na on/off/1/0/yes/no

Zobacz:

root@Gargoyle:~# uci set dropbear.global.GatewayPorts=yes
root@Gargoyle:~# uci commit dropbear
root@Gargoyle:~# /etc/init.d/dropbear restart
root@Gargoyle:~# ps | grep drop
 3382 root      1256 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22 -a
 4014 root      1164 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22
 4016 root      1496 S    grep drop
root@Gargoyle:~#
root@Gargoyle:~# uci set dropbear.global.GatewayPorts=on
root@Gargoyle:~# uci commit dropbear
root@Gargoyle:~# /etc/init.d/dropbear restart
root@Gargoyle:~# ps | grep drop
 3382 root      1256 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22 -a
 4035 root      1164 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22 -a
 4037 root      1496 S    grep drop

Proces 3382 to bieżaca sesja ssh więc nie jest restartowana.

Pzdr
Krzych

17

Odp: Dropbear i port forwarding

Krzychu, dzięki wielkie. Jutro przetestuję w firmie, którą się opiekuję, bardzo mi to ułatwi sprawę zdalnego monitorowania.

18

Odp: Dropbear i port forwarding

Ha, W AA działało, a teraz inaczej są weryfikowane parametry ...

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

19

Odp: Dropbear i port forwarding

itias napisał/a:

Krzychu, dzięki wielkie. Jutro przetestuję w firmie, którą się opiekuję, bardzo mi to ułatwi sprawę zdalnego monitorowania.

Mam nadzieję, że Ci to zadziała.

Przy okazji jeszcze jedna uwaga. Na moim Gargoyl'u

 | Gargoyle PL 1.6.2.2 (b70bfc1)                                |
 | OpenWrt Attitude Adjustment 12.09.1 (r42647)                 |

nie działa opcja:

uci set dropbear.@dropbear[0].SSHKeepAlive=XX

odpowiada ona za zabicie martwej sesji ssh. (Parametr -K demona dropbear):

-K <keepalive>  (0 is never, default 0, in seconds)

gdzieś czytałem, że domyślna wartość to 300s, ale jak widać powyżej nie jest to prawda. Martwa sesja nigdy domyślnie nie wygasa (robiłem testy i po około 30 minutach sesja dalej wisiała).

U mnie jest to istotna sprawa, bo serwer, z którym się łaczę ma zmienny adress IP (Neostrada). Łączę się używając DDNSa a nie adresu IP. Więc zależy mi żeby po zmianie IPka serwer zabił nieaktywną sesję ssh. W przeciwnym razie klient zobaczy cos takiego:

root@Gargoyle:~# ssh: Remote TCP forward request failed (port 4445 -> localhost:22)

Żeby opcja "SSHKeepAlive" zaczęła u mnie działać zmodyfikowałem plik:

/etc/init.d/dropbear

W linii 84 dopisałem:

        # H) SSHKeepAlive
        config_get val "${section}" SSHKeepAlive
        [ "${val}" ] && append args "-K ${val}"

teraz po ustawieniu w pliku konfiguracyjnym (lub za pomocą UCI):

/etc/config/dropbear:
        option SSHKeepAlive '10'

martwa sesja jest zabijana po 10s. A demon odpala się z opcją -K:

 3180 root      1164 S    /usr/sbin/dropbear -P /var/run/dropbear.2.pid -p 4444 -a -K 10

Pzdr
Krzych

20

Odp: Dropbear i port forwarding

Cezary napisał/a:

Ha, W AA działało, a teraz inaczej są weryfikowane parametry ...

Ja tam nie wiem, swieżonka jestem w Gargoylu ;-)

Btw, szkoda, że w twoich tutorialach nie można dodawać komentarzy. Byłoby łatwiej wyłapywać takie rzeczy.

Pzdr
Krzych

21

Odp: Dropbear i port forwarding

Faktycznie GatewayPorts musi być "on". Co prawda mam efekt uboczny, teraz niezależnie co podam, czy localhost, czy interfejs LAN, słucha na wszystkich interfejsach:

root@xxx:~# netstat -na | grep 4666
tcp        0      0 0.0.0.0:4666            0.0.0.0:*               LISTEN

22

Odp: Dropbear i port forwarding

itias napisał/a:

Faktycznie GatewayPorts musi być "on". Co prawda mam efekt uboczny, teraz niezależnie co podam, czy localhost, czy interfejs LAN, słucha na wszystkich interfejsach:

root@xxx:~# netstat -na | grep 4666
tcp        0      0 0.0.0.0:4666            0.0.0.0:*               LISTEN

To dziwne. U mnie słucha wyłącznie na podanym interfejsie.

Na kliencie wywołuję:

root@Gargoyle:~# ssh -f -NT -R 192.168.1.22:4445:localhost:22 192.168.1.2

A na serwerze mam dwa interfejsy:
192.168.1.2 i 192.168.1.22 (secondary IP na LANie):

root@gargoyle2:~# netstat -taupen | grep 4445
tcp        0      0 192.168.1.22:4445       0.0.0.0:*               LISTEN      2622/dropbear
root@gargoyle2:~#
root@gargoyle2:~# telnet 127.0.0.1 4445
telnet: can't connect to remote host (127.0.0.1): Connection refused
root@gargoyle2:~#
root@gargoyle2:~# telnet 192.168.1.2 4445
telnet: can't connect to remote host (192.168.1.2): Connection refused
root@gargoyle2:~#
root@gargoyle2:~# telnet 192.168.1.22 4445
SSH-2.0-dropbear_2014.65

jak widać nawet na localhoscie nie słucha.

Pzdr
Krzych

23 (edytowany przez itias 2014-12-19 11:59:04)

Odp: Dropbear i port forwarding

Może to właściwość putty, którym wytwarzam tunel. Poeksperymentuję trochę i dam znać, może komuś jeszcze się to przyda.

Aktualizacja: faktycznie wygląda to na jakieś kwestie związane z putty. Otwarcie tunelu przez ssh robi dokładnie to co trzeba, czyli można ograniczyć nasłuchiwanie do określonego interfejsu.

24

Odp: Dropbear i port forwarding

itias napisał/a:

Faktycznie GatewayPorts musi być "on". Co prawda mam efekt uboczny, teraz niezależnie co podam, czy localhost, czy interfejs LAN, słucha na wszystkich interfejsach:

root@xxx:~# netstat -na | grep 4666
tcp        0      0 0.0.0.0:4666            0.0.0.0:*               LISTEN

I to jest właśnie powód by nie robić takich zajawek w openwrt/gargoyle. Gdy jeszcze bardziej to rozkminisz dojdziesz do wniosku, że więcej złego niż dobrego dają takie manewry i w efekcie końcowym jesteś jak otwarta księga dla każdego bardziej dociekliwego jegomościa w internecie.
wink

25

Odp: Dropbear i port forwarding

itias napisał/a:

Może to właściwość putty, którym wytwarzam tunel. Poeksperymentuję trochę i dam znać, może komuś jeszcze się to przyda.

Aktualizacja: faktycznie wygląda to na jakieś kwestie związane z putty. Otwarcie tunelu przez ssh robi dokładnie to co trzeba, czyli można ograniczyć nasłuchiwanie do określonego interfejsu.

Pobawiłem się chwilę puttym i wygląda na to, że musi być włączona opcja Port forwarding  -> remote ports żeby serwer słuchał na innych interfejsach niż 127.0.0.1:

putty

Niestety nie można tego ograniczyć to konretnego intefejsu i odpowiada to unixowemu:

ssh -f -NT -R 0.0.0.0:4445:localhost:22 IP_servera_SSH

Na pewno rozwiązaniem dla klienta windowsowego jest użycie cygwina i polecenia:

ssh -f -NT -R 192.168.1.1:4445:localhost:22 IP_servera_SSH

Pzdr
Krzych