====== HomeRouter IV ======
===== Požadavky =====
* aktualizovat openwrt na rspro
* aby podporoval nové šifrovací klíče SSH a měl záplaty na zranitelnosti
* aby obsahoval podporu PPPoE potřebnou pro současný Internet
* snadno opakovatelné aktualizování na další verzi OpenWRT (co nejméně specialit)
* extroot vlastně už moc nepotřebuji, ale raději ho využít
* web server, tvheadend ... mam uz na PI
* možná by se hodil tcpdump, iftop, aircrack
* [[#https_proxy|HTTPS proxy]] na moje web servery s automatickou obnovou certifikátu přes [[#acme|let's encrypt]] pro veřejnou IP adresu dostupnou přes [[#wireguard|Wireguard]]
===== Základ =====
Základní image
* https://openwrt.org/toh/ubiquiti/routerstation_pro
* https://downloads.openwrt.org/releases/22.03.5/targets/ath79/generic/openwrt-22.03.5-ath79-generic-ubnt_routerstation-pro-squashfs-factory.bin
tftp 192.168.1.20 -m binary -c put openwrt-22.03.5-ath79-generic-ubnt_routerstation-pro-squashfs-factory.bin
* rs232 rika:
Firmware Version: RSPRO.ar7100pro.v6.0.0-OpenWrt-r20134-5f15225c1e␍␊
'kernel' size, 0x00226e50 is not a multiple of block size, 0x00010000! Abort.␍␊
* https://github.com/openwrt/openwrt/issues/13260
* https://downloads.openwrt.org/releases/19.07.10/targets/ath79/generic/openwrt-19.07.10-ath79-generic-ubnt_routerstation-pro-squashfs-factory.bin
tftp 192.168.1.20 -m binary -c put openwrt-19.07.10-ath79-generic-ubnt_routerstation-pro-squashfs-factory.bin
* následně sysupgrade přes OpenWRT UI (force)
* https://downloads.openwrt.org/releases/22.03.5/targets/ath79/generic/openwrt-22.03.5-ath79-generic-ubnt_routerstation-pro-squashfs-sysupgrade.bin
Extroot
* doinstalovaní balíčků pro extroot
* musel jsem stahovat ručně, router nebyl připojen k Internetu
* https://downloads.openwrt.org/releases/22.03.5/packages/mips_24kc/
* **kmod-usb-storage mod-usb-core kmod-usb2** - základní USB subsystém
* vyžaduje kmod-scsi-core
* **kmod-mmc** - driver pro SD/MMC karty
* vyžaduje mod-usb-serial
* **kmod-fs-ext4** - pro použitý filesystém na externím úložišti
* **block-mount** - přepojení souborového systému na externí úložiště během init
* vyžaduje kmod-lib-crc16
* **e2fsprogs** - hodí se pro vytváření FS (není nutné)
opkg install kmod-usb-storage mod-usb-core kmod-usb2 kmod-mmc block-mount
Příprava SD karty
* SD kartu jsem naformátoval na ext4 v PC, abych nemusel instalovat závislosti e2fsprogs ručně
pkg_hash_check_unresolved: cannot find dependency libuuid1 for e2fsprogs
pkg_hash_check_unresolved: cannot find dependency libext2fs2 for e2fsprogs
* po připojení do routeru
mkdir /tmp/newroot
mkdir /tmp/currroot
mount --bind / /tmp/currroot
mount /dev/sda /tmp/newroot/
tar -C /tmp/currroot -cvf - . | tar -C /tmp/newroot -xvf -
sync
* upravil jsem fstab
* není potřeba nastavovat noatime, protože "lepší" relatime je zapnutý implicitně
* lze zkontrolovat přes ;cat /proc/mounts;
config mount
option target /
option device /dev/sda
option fstype ext4
option options rw
option enabled 1
option enabled_fsck 0
* upravil jsem /etc/banner, abych věděl, že naběhl extroot
Doinstalování balíčků na extroot
* podpora wifi
* **wireless-tools** - wifi subsystém
* **kmod-ath9k** - driver pro R52n
* **wpad-basic** - stačí mi WPA PSK + 802.11r
* **e2fsprogs** - obsahuje fsck
* iftop, tcpdump, aircrack-ng
Doladění
* změna cache balíčku do trvalé paměti
* Navigate to LuCI → System → Software → Configuration to change /var/opkg-lists to /usr/lib/opkg/lists.[[https://openwrt.org/docs/guide-user/additional-software/extroot_configuration|zdroj]]
* nebo ručně v /etc/opkg.conf
===== Wireguard =====
* instalace
opkg install luci-proto-wireguard // podpora v LUCI WebUI + závislosti
opkg install luci-app-wireguard // zobrazování stavu ve WebUI
* konfiguraci jsem provedl přes uci set, výsledek je v ''/etc/config/network''
* musel jsem vytvořit vlastní firewall zónu. Když jsem použil WAN tak to nějak zahazovalo odesílané pakety a nenastal vůbec handshake
* pro aplikaci změn konfigurace lze použít ''/etc/init.d/network restart''
* v konfiguraci wireguard lze zapnout debug
* povolil jsem routování přes ''route_allowed_ips'', ale ve firewall zóně jsem to nepovolil pro LAN
config interface 'wg0'
option proto 'wireguard'
option private_key '*****'
list addresses '10.0.0.2/24'
config wireguard_wg0
option description 'peer1'
option public_key '*****'
option preshared_key '*****'
list allowed_ips '10.0.0.1'
list allowed_ips '172.17.17.0/24'
option route_allowed_ips '1'
option endpoint_host 'peer1.example.com'
option persistent_keepalive '25'
option endpoint_port '51820'
===== ACME =====
* pro testování je vhodně použít staging
* používám ověření webroot s cestou /www/acme
* konfiguroval jsem přes uci
config cert 'wiki'
option use_staging '0'
option keylength '2048'
option update_nginx '0'
option update_haproxy '0'
option enabled '1'
list domains 'wiki.bari2.eu'
option update_uhttpd '0'
option validation_method 'webroot'
option webroot '/www/acme'
* vypnul jsem notifikaci nginx při změně cert..
* měl jsem problém při přechodu ze staging, kdy po zpracování prvního certifikátu poslal notifikaci a nginx už nenastartoval, protože acme na začátku přesunul všechny nastavené staging certifikáty a nginx to už nenašel
* později lze klidně zapnout
* logy lze číst v ''logrotate'', užitečné při ladění
===== HTTPS proxy =====
opkg install nginx-ssl luci-app-acme acme-dnsapi
* vypnout konfiguraci přes luca, protože nemá takové možnosti
vim /etc/config/nginx
config main global
option uci_enable 'false'
* využít luca template jako základní konfigurák
cp /etc/nginx/uci.conf.template /etc/nginx/nginx.conf
* změnil jsem v něm akorát root na /www/acme, ve kterém jsem vytvořil prázdný index.html
* pro každý web jsem vytvořil následující config v /etc/nginx/conf.d/
server {
listen 6666 ssl;
server_name wiki.bari2.eu;
ssl_certificate /etc/acme/wiki.bari2.eu/wiki.bari2.eu.cer;
ssl_certificate_key /etc/acme/wiki.bari2.eu/wiki.bari2.eu.key;
include conf.d/location-acme.inc;
include conf.d/location-pi-fwd.inc;
}
server {
listen 7777;
server_name wiki.bari2.eu;
include conf.d/location-acme.inc;
include conf.d/location-https-fwd.inc;
}
* location-acme.inc - slouží ke zpřístupněni adresáře, kam acme dává dočasné soubory pro ověření vlastnictví domény. Pro každou doménu mám stejnou složku, protože se to ověřuje vždy sekvenčně a navzájem se neovlivňuje.
location /.well-known/acme-challenge/ {
default_type "text/plain";
root /www/acme/;
}
* location-https-fwd.inc - slouží k přesměrování http požadavku na https. Má cenu jen pro domény, kterým spravuji certifikáty.
location / {
return 301 https://$host$request_uri;
}
* location-pi-fwd.inc - přesměrování na pi s weby, na https port.
location / {
proxy_pass https://192.168.0.5;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
* weby, kterým nespravuji certifikát, posílám na pi web server.
server {
listen 7777 ssl;
server_name _;
ssl_certificate conf.d/default.crt;
ssl_certificate_key conf.d/default.key;
# mohl bych sem dat acme include, aby to umelo overit jakoukoliv domenu
# je to ale zbytecne, pokud ten ssl pak nepouzivam... tak jsem to zrusil
}
# pokud zadny server name nema exact mach (nebo regular/wildcard)
# vezme prvni unmatched server_name na tom portu
# takze zalezi na poradi .. ten default musi byt prvni
# hodnota "_" je jen nikdy nematchnuta hodnota, co nejkratsi :)
server {
listen 8080;
server_name _;
# vse co neznam poslu na pi
include conf.d/location-pi-http-fwd.inc;
}
* naslouchám záměrně na jiném portu, protože 80/443 je obsazen OpenWRT webui
* šlo to vyřešit i tak, že bych webui spustil jen nad určitou IP adresou rozhraní, ale tohle je více robustní na změnu IP adresy
* na druhé straně wireguard tunelu se požadavky na 80/443 směřují na nové porty.
* šlo to vyřešit i tak, že by změnu portu dělal firewall na gw