====== 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