Az előző cikkben megtörtént a feladat leírása.
Lássunk hozzá a router felprogramozásához
Kössük a számítógépünket a router egyik LAN portjához. Az OpenWRT alapértelmezésként a 192.168.1.1 IP címet rendeli a routerhez.
Az első intézkedésünk, hogy a Routeren egy erős jelszót állítunk be. Erre telepítés után azonnal felhívja a figyelmüket.
A legegyszerűbb, ha SSH-val root-ként bejelentkezünk (nem kér jelszót)
passwd
A jelszó feleljen meg a szokásos elvárásoknak.
Frissítsük fel a telepíthető csomagok listáját:
opkg update
Telepítsünk jól használható webes kezelő felületet, magyar nyelvet és a https hozzáférést.
opkg install luci-theme-openwrt luci-i18n-openvpn-hu luci-ssl
Egy könnyen kezelhető szövegszerkesztő
opkg install nano
Rakjuk fel az OpenVPNt és a kezelő felületét (magyarul is)
opkg install openvpn-openssl luci-app-openvpn luci-i18n-openvpn-hu
sftp szerver, hogy egyszerűen tudjunk fájlokat másolni az eszközre (nincs grafikus kezelő felülete, csak egy kiegészítés az SSH-hoz)
opkg install openssh-sftp-server
Frissítsük fel a routeren található csomagokat (ezt úgy tűnik érdemes hetente elvégezni):
opkg list-upgradable | awk -F " " '{print "opkg upgrade "$1}' >up.sh
sh up.sh
rm up.sh
Ezzel a scripttel először elkészítjük a frissítendő csomagok listáját, awk
-val elkészítjük a scriptet, ami felfrissíti a programokat (opkg upgrade program_neve
formátumban), majd ezt lefuttatjuk.
Sajnos egy lépcsőben nem lehet a feladatot elvégezni pedig az egysoros script milyen elegáns:
opkg list-upgradable | awk -F " " '{print "opkg upgrade "$1}' | sh
mert az első opkg még zárolja a fájlokat, amikor a második már elindul.
Persze itt is lehet trükközni:
opkg list-upgradable | awk -F " " '{print "opkg upgrade "$1}' |sort| sh
Itt a sort
utasítással egy kicsit húzzuk az időt, hogy az első opkg
-nak legyen ideje kilépni, mielőtt az update elkezdődik. (Így már lehet választani a két verzió között.)
A csomagok frissítésének az ára, hogy a rendelkezésünkre álló tárhely egy jelentős részét elhasználja, ezért ha rosszul állunk tárhellyel, ezt a lépést kénytelenek vagyunk kihagyni.
Tegyük biztonságosabbá a routerre való bejelentkezést
Az ssh bejelentkezés biztonságát két ponton tudjuk emelni:
- A szokásos (szabványos) 22-es portot átírjuk egy másikra
- A jelszavas bejelentkezés helyett kulcsos bejelentkezést írunk elő
A webes felületen http helyett https protokoll használatát tudjuk előírni.
A /etc/config/dropbear
fájl vizsgálatakor az OpenSSH config fájlhoz szokott szem elkerekedik. Összesen öt sort tartalmaz. Ha az összes lehetséges beállítást megtesszük, akkor sem lesz 11 sornál hosszabb.
Másoljuk a publikus kulcsunkat a /etc/dropbear/authorized_keys fájlba. Ezt megtehetjük fájl másolással, vagy a LUCI felületen. Az OpenSSH ssh-copy-id
parancsa ebben az esetben nem segít.
A kulcs átmásolása után egy másik terminálból próbáljunk meg bejelentkezni. Ezúttal jelszó nélkül kell sikerülnie (hiszen a kulcs azonosít).
Ha a bejelentkezés nem sikeres, lehet hibát keresni a nyitva hagyott kapcsolaton keresztül.
Ha sikeres volt a próba, tiltsuk le a jelszavas bejelentkezést, és állítsuk át a portot 22-ről egy másikra.
uci set dropbear.@dropbear[0].PasswordAuth=off
uci set dropbear.@dropbear[0].port=1234
uci commit dropbear
Ezzel, amit az ssh-val lehetett megtettük. (Még lehetne felhasználót létrehozni az adminisztrációhoz, de akkor a LUCI felület lesz a gyenge pont, nem nyújt valós többletbiztonságot, csak ha a webes felületet letiltjuk).
Tegyünk némi biztonságot a LUCI webes felületre is
Követeljük meg a https használatát (sokkal többet nem tehetünk, csak ha a fantáziánkat használjuk).
uci set uhttpd.main.redirect_https='1'
uci commit
Kezdjük el az OpenVPN felprogramozását
A programozáshoz UBUNTU (linux) munkaállomást használunk, amire telepítettük az sshfs
csomagot.
Innen 4-féle módon is folytathatjuk a feladat megoldását:
- A luci kezelő felületén állítjuk be az OpenVPN szervert
- A server.cnf fájlt a /etc/openvpn mappába másoljuk
- „uci” utasításokkal állítjuk be commandline módban
- a /etc/config/openvpn fájl szerkesztésével
Vegyük sorra:
1., A luci kezelőfelület csak a static key modelt támogatja. Most nem ez a választott eljárás.
2., Ha a config állományt a /etc/openvpn mappába másoljuk, akkor a router indításakor elindul, azonban a működését a luci felületről nem tudjuk befolyásolni (ezt használjuk teszteléshez).
3., Az „uci” utasításokkal létrehozott VPN-t lehet grafikus felületről is kezelni.
4., Egyenértékű a 3., ponttal. az uci utasítások hozzák létre illetve módosítják az állományt.
Válaszuk a 3. és 4. opciót. Egy minimális plusz munkával valamivel elegánsabb eredményt kapunk.
Jelentkezzünk be a routerre:
Telepítsük fel a felhasználó kezelőt:
opkg update
opkg install shadow-useradd
Hozzunk létre egy felhasználót az OpenVPN-nek
adduser vpn
A PC-n csatoljuk fel a router /etc mappáját (ezért telepítettük az sftp-t a routerre):
sshfs root@192.168.1.1:/etc/ /mnt
Ennél korrektebb:
mkdir ~/mnt
sshfs root@192.168.1.1:/etc/ ~/mnt
Hozzuk létre a szerver mappát:
sudo mkdir /mnt/openvpn/client
Másoljuk ide a szükséges kulcsokat. Ezek:
ca.crt
kliens1.key
kliens1.crt
ta.key
dh4096.pem
(Már érdemes elliptic curve kulcsokat használni a gyorsabb működés érdekében. Az OpenVPN a 2.4 verziótól támogatja.)
A routeren hozzuk létre az interfészt a VPN-hez
uci set network.vpn1=interface
uci set network.vpn1.ifname=tun0
uci set network.vpn1.proto=none
uci set network.vpn1.auto=1
Ez után hozzuk létre a VPN kapcsolatot:
uci set openvpn.vpnclient=openvpn
uci set openvpn.vpnclient.enabled=1
uci set openvpn.vpnclient.dev=tun
uci set openvpn.vpnclient.proto=udp
uci set openvpn.vpnclient.verb=3
uci set openvpn.vpnclient.ca=/etc/openvpn/client/ca.crt
uci set openvpn.vpnclient.cert=/etc/openvpn/client/kliens1.crt
uci set openvpn.vpnclient.key=/etc/openvpn/client/kliens1.key
uci set openvpn.vpnclient.cipher=AES-192-CBC
uci set openvpn.vpnclient.auth=sha256
uci set openvpn.vpnclient.tls-auth='/etc/openvpn/client/ta.key 1'
uci set openvpn.vpnclient.client=1
uci set openvpn.vpnclient.remote_cert_tls=server
uci set openvpn.vpnclient.remote="proba.itkommando.hu 1192"
uci set openvpn.vpnclient.persist_key='1'
uci set openvpn.vpnclient.persist_tun='1'
uci set openvpn.vpnclient.comp_lzo='1'
uci set openvpn.vpnclient.user='vpn'
uci set openvpn.vpnclient.group='vpn'
uci commit openvpn