Warning: Memcache::addserver() expects parameter 2 to be long, string given in /usr/home/rpc/domains/rpc.one.pl/public_html/libraries/joomla/cache/storage/memcache.php on line 84 Tunel ppp po ssh
 
 
Tunel ppp po ssh Drukuj Email
Wpisany przez rpc   
piątek, 30 marca 2012 22:11

Tunel ppp po ssh


Jest wiele programów za pomocą których utworzymy tunel pomiędzy dwoma hostami bądź sieciami/podsieciami. Poniżej przedstawię prostą konfigurację tunelu między dwoma routerami openwrt. Zaletą jest to, iż nie wymaga to żadnego specjalnego oprogramowania. Wszystko co trzeba jest w openwrt.


Założenia

  1. Nazwa interfejsu w openwrt : ppp-tun ( nazwa zmieniona z portu ppp9 - opcja ifname pppd tylko w openwrt istnieje)
  2. Adresy tunelu point-to-point: 192.168.111.1-192.168.111.2
  3. sieć lan pierwszego routera : 192.168.1.0/24
  4. sieć lan drugiego routera: 192.168.2.0/24
  5. zakładamy, że port na którym nasłuchuje ssh został zmieniony ze standardowego 22 na 2222

Instalacja

Wszystko co trzeba mamy już w systemie.

Konfiguracja routera pierwszego (192.168.1.0/24)

Tworzymy plik, który utworzy nam automatycznie trasę do przeciwnej podsieci oraz skonfiguruje firewall.

touch /etc/ppp/ip-up.d/98-ppp-tun

o zawartości

if [ "$IFNAME" = "ppp-tun" ]; then
route add -net 192.168.2.0/24 dev $IFNAME
iptables -I FORWARD -i br-lan -o ppp-tun -j ACCEPT
iptables -I FORWARD -i ppp-tun -o br-lan -j ACCEPT
fi

oraz tworzymy plik, który wyrzuci nam reguły iptables po ustaniu tunelu

touch /etc/ppp/ip-down.d/98-ppp-tun

o zawartości

if [ "$IFNAME" = "ppp-tun" ]; then
iptables -D FORWARD -i br-lan -o ppp-tun -j ACCEPT
iptables -D FORWARD -i ppp-tun -o br-lan -j ACCEPT
fi

nadajemy jeszcze uprawnienia do plików

chmod +x /etc/ppp/ip-up.d/98-ppp-tun
chmod +x /etc/ppp/ip-down.d/98-ppp-tun


Konfiguracja routera drugiego (192.168.2.0/24)

Tworzymy plik, który utworzy nam automatycznie trasę do przeciwnej podsieci oraz skonfiguruje firewall.

touch /etc/ppp/ip-up.d/98-ppp-tun

o zawartości

if [ "$IFNAME" = "ppp-tun" ]; then
route add -net 192.168.1.0/24 dev $IFNAME
iptables -I FORWARD -i br-lan -o ppp-tun -j ACCEPT
iptables -I FORWARD -i ppp-tun -o br-lan -j ACCEPT
fi

oraz tworzymy plik, który wyrzuci nam reguły iptables po ustaniu tunelu

touch /etc/ppp/ip-down.d/98-ppp-tun

o zawartości

if [ "$IFNAME" = "ppp-tun" ]; then
iptables -D FORWARD -i br-lan -o ppp-tun -j ACCEPT
iptables -D FORWARD -i ppp-tun -o br-lan -j ACCEPT
fi

nadajemy jeszcze uprawnienia do plików

chmod +x /etc/ppp/ip-up.d/98-ppp-tun
chmod +x /etc/ppp/ip-down.d/98-ppp-tun


Generowanie certyfikatu ssh

Aby ssh łączył się bez pytania wygenerujemy na dowolnym linuxie (może być pod windows puttygen) certyfikat DSA

mkdir /root/.ssh
dropbearkey -t dss -f /root/.ssh/id_dsa
dropbearkey -y -f /root/.ssh/id_dsa | grep ssh > /root/.ssh/id_dsa.pub

co daje w yniku:

Will output 1024 bit dss secret key to '/root/.ssh/id_dsa'
Generating key, this may take a while...
Public key portion is:
ssh-dss AAAAB3NzaC1kc3MAAACBANNY0vzuWaIxJnSzRCCYY27sc4mJOpEIQsblLnXcm0gE4GAconcqyxq73UT4x0YA26b6sCbYcdM3epw8hJ67vMKtotew2e6I+s5dkLfIoK/08jmecIIjAxyA6MEbso7rVUJsgq0IuAzo/yX/WylYOZKa/rGpVH2qsBo6B8fwUDmlAAAAFQDy1jGIh+qUlnbvQ/A+aKf0YnMH7wAAAIA9Uj5qIQdtflOkzopvP6R+zeQP6TAnvL8KoltfNn9hGLolfiIyqx1RLMSj6YoRdVF3+vpSNhZl9SD0TIOeGdYaTJP9P5BaMfgkmsWpHly6nvfsnVHbTLLNcBPoXdliwjel08ocYQViZjlRZ6qPgjTS3RSjiyVO0jvL5Ms30EqxEQAAAIA0ZN+3SUnbKdWnHllNt3TvsTGxW/ero7JN/FiSMVVU8gPKGXuzCpTpuwjX3vNfAYY4RPoXI2mT3yEKhBsblI/QJi1XFuwQDzoImiCkArxJE05mSBsS5ooaSVZvlZXXbQnSBLWyYWE7z0Ci4CIdcDQIp7rcH24iGGowrvpCSbnzcw== root@OpenWrt
Fingerprint: md5 da:ed:b9:64:a9:68:39:f9:7c:80:04:22:64:e8:9d:fb



lub generujemy za pomocą ssh-keygen

ssh-keygen -t dsa

co daje w wyniku

root@router# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
fb:f1:6a:77:66:ba:9a:8a:3d:40:c1:77:4c:01:4e:04 root@linux
The key's randomart image is:
+--[ DSA 1024]----+
|     .Eo++o.     |
|      oo. o      |
|       o..       |
|      .          |
|     .  S        |
|      .  .       |
|       .. .      |
|       o...+. +  |
|      . o+=++*   |
+-----------------+

ja w czasie generowania wszędzie naciskałem enter nie podając żadnego hasła.Dzięki temu uruchomienie tunelu możemy zautomatyzować dodając go np. /etc/rc.local.


Teraz należy wygenerowany certyfikat publiczny wgrać na router przeciwny (nazwijmy to kliencki) za pomocą np. scp czy winscp.

A więc na routerze openwrt w katalogu /etc/dropbear winien znaleźć się plik

authorized_keys

w którym zawartością powinien być opisany wyżej wygenerowany przez nas certyfikat publiczny, który jest umieszczony w pliku

/root/.ssh/id_dsa.pub

po skopiowaniu plik może wyglądać jak niżej:

root@OpenWrt:~# cat /etc/dropbear/authorized_keys
ssh-dss AAAAB3NzaC2kc3MAAACBAMPafbNz2MttesiXBAkSzlj8Fcq5KA8E9gRKKC8CWiXx+hQKpI5LL53aRP263glMFoHoejiAOpF9fGUfxirXZSRgxtwpjD6e/pOkD3wUhtzeO+ApQ9jrHBNYnMZjPeuQbPNfte6UWcqOU0KBUK4Hy7WiX6580MSLZyOBrV9jQM67AAAAFQCg1o69YDFNPfJ6pz+Z6vXuv01QfwAAAIEAk99shdGj+G85Yf0R+NREKRoZ9EUKHY2s7NotJ0rWxetyJWhHPeyK7S7v4ZwzgenGZyBl5qd1puxV5KPPBt9KU3e0PPahEDU9q6gRSPddCZIORWeRTuFfWETq8RaQZof36B6X2AvGpkI8IDa94pNnuMwew1OUAXP/lAVxDI8IcdAAAACAa/rWrxxbBKjiLQmy0EESH7azoOUy7/QM3Cbp33q5w/tsTYeHehcSNN5aocsz4NBZYQl07XC12lHYfo46XY8WGOh7UqYd0aR8gsZhilA8YDKRaIjUYmoedt1pmyvUdXZ2B72apoAk7Th7uEyAaPC+xBM7Ic63rpAJK9qt9AFSUk1= root@linux


Uruchomienie tunelu

Na routerze wywołujemy poniższą komendę:

pppd noauth connect-delay 5000 linkname 'tun' unit 9 ifname 'ppp-tun' pty "ssh -p 2222 tunnel.one.pl -t -e none /usr/sbin/pppd noauth local connect-delay 5000 linkname 'tun' unit 9 ifname 'ppp-tun'" 192.168.111.1:192.168.111.2 local

Połączenie point-to-point zostanie nawiązane poprzez ssh. Zostaną nadane odpowiednie adresy IP, od teraz można już pingować obie strony routerów oraz ich podsieci.


Wyłączanie tunelu

Jeśli w systemie jest tylko jedno połączenie to nie ma problemu wystarczy wtedy

killall pppd

jeśli jednak mamy więcej połączeń ppp to musimy inaczej zabijać demon pppd. Tak aby nie uwalić pozostałych procesów. Do uruchomienia tunelu dodałem jeszcze jedną opcję "linkname" dzięki niej w katalogu /var/run utworzy nam się plik z połączenia ppp-XXX.pid, gdzie XXX to nazwa którą wprowadziliśmy za parametrem linkname.

W więc nasz plik będzie miał nazwę ppp-tun.pid. W pliku jak się domyślamy mamy nasz numer procesu pppd.

A więc komenda, która nam wygasi proces pppd wyglądać będzie następująco:

kill `cat /var/run/ppp-tun.pid`


Ps. W openwrt ash jest dość ubogi. Jednak jeśli chcemy zrobić szybki tunel pod standardowym linuxem typu debian, redchat, etc. to nie są potrzebne skrypty dodające routing. Wystarcza wtedy jedna komenda:

pppd noauth connect-delay 5000 linkname 'tun' unit 9 pty "ssh -p 2222 tunnel.one.pl -t -e none /usr/sbin/pppd noauth local connect-delay 5000 linkname 'tun' unit 9 connect '(sleep 10 && route add -net 192.168.2.0/24 dev ppp9 )&' " 192.168.111.1:192.168.111.2 local connect '(sleep 10 && route add -net 192.168.1.0/24 dev ppp9 )&'

zostaje co najwyżej problem firewalla ale trasy dodadzą nam się po 10 sekundach automatycznie.


Autostart tunelu

Jeśli potrzebujemy aby tunel startował automatycznie na jednym z routerów (tym który ma być inicjujący połączenie) tworzymy następujący skryp:

touch /etc/hotplug.d/iface/30-ppp-over-ssh

o treści

#!/bin/sh

#max 5 znaków
nazwa_linku="tun"

#zakres portów linku poit to point
zakres_portow_ptp="192.168.111.1:192.168.111.2"

nr_portu_ssh="2222"
adres_ssh="tunel.one.pl"

nazwa_pppx="ppp-"$nazwa_linku
opcje_pppd="noauth local connect-delay 5000 linkname /'$nazwa_linku/' ifname /'$nazwa_pppx/'"

[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && pppd $opcje_pppd pty "ssh -p $nr_portu_ssh $adres_ssh -t -e none /usr/sbin/pppd $opcje_pppd" $zakres_portow_ptp
[ "$ACTION" = "ifdown" -a "$INTERFACE" = "wan" ] $$ kill `cat /var/run/ppp-$nazwa_linku.pid`


Słownik pppd

ifname [nazwa]- zmienia nazwę interfejsu ze standardowego pppX na zdefiniowany przez nas. Ma ilość znaków to 9 znaków. Opcja tylko istnieje w openwrt.
unit [0-9]- definiuje (narzuca) jaki ma być numer interfejsu pppX
linkname [nazwa]- tworzy plik PID w katalogu /var/run ze specyficzną nazwą w stylu ppp-[nazwa].pid. W openwrt znajduje się tam numer procesu, w debianie numer procesu + nazwa interfejsu.
noauth - brak autoryzacji

po resztę odsyłam do manuala pppd.




Podziel się tą informacja z innymi:
Poprawiony: sobota, 31 marca 2012 20:11