# Test A
VM, který má nastavené:
- Karta 1 - NAT
- Karta 2 - Síť pouze s hostem -> bez DHCP
## Pro přehlednost <small>optional</small>
```
hostname master
```
## Nastavení sítě
Do souboru `/etc/network/interfaces` přidám
```bash
# The loopback network interface
auto lo
iface lo inet loopback
# Karta 1 - NAT
auto enp0s3
iface enp0s3 inet dhcp
# Karta 2 - Host
auto enp0s8
iface enp0s8 inet static
address 192.168.68.10
netmask 255.255.255.0
```
Restartujeme -> `service networking restart`
## Dependencies
```
apt update
apt install isc-dhcp-server
```
> Pri startu schválně spadne. :-)
## Postup
Nastavim interface DHCP serveru `/etc/default/isc-dhcp-server`
```
INTERFACESv4="enp0s8"
INTERFACESv6=""
```
`sed -i 's/INTERFACESv4=""/INTERFACESv4="enp0s8"/' /etc/default/isc-dhcp-server`
Upravím config v `/etc/dhcp/dhcpd.conf`
```
option domain-name "vsb.cz";
option domain-name-servers 158.196.0.53; -- školní DNS, jina nepůjde, security
# Pro test doma
#option domain-name "google.cz";
#option domain-name-servers 8.8.8.8;
subnet 192.168.68.0 netmask 255.255.255.0 {
range 192.168.68.100 192.168.68.200;
option routers 192.168.68.10;
}
```
> [!Note]
> Authoritative znamená, že dhcp server nastaví adresu i pro requesty z jiných sítí -- by default by musel být jeden DHCP server na jeden subnet - request na L2 neprojde routerem. To se zase řeší na routerech pomocí `iphelper`, který přes L3 pošle ten request přímo na DHCP server -- stačí 1 server na síti
>
> Na síti nechceme mít více DHCP serverů, dělalo by to bordel. Switche umí `dhcp snooping` -- port směrem k DHCP serveru se nastaví jako trusted a příchozí requesty se přepošlou jen tam, takže i kdybych si připojil druhý na jiný port, tak to ničemu nebude vadit.
Restartuju server `service isc-dhcp-server restart`
`dhcpd -t` -- *kontrola konfigurace, zda je správná*
`cat /var/lib/dhcp/dhcpd.leases` -- *list půjčených ip address*
## Testovácí PC
Vytvořím si testovací VM, kterému dám stejnou kartu s "vypnutým" DHCP. Defakto je ale DHCP zapnuté a to naše.
Po zapnutí by měl PC dostat ip addresu. **Může to chvíli trvat** -> případně `dhclient enp0s8`
Následně vyzkouším třeba `ping 192.168.68.10`
## Nastavení NAT (maškaráda)
Musím povolit IP forward (přeposílání packetu mezi interfacy). Bez toho si nebudou povídat mezi sítěmi.
Do souboru v `/etc/sysctl.d/ip_forward.conf` vložím `net.ipv4.ip_forward = 1`
Načtu config pomocí `sysctl -p /etc/sysctl.d/ip_forward.conf`
`cat /proc/sys/net/ipv4/ip_forward` -- *zjištění, zda ip forward běží* -> expected: 1
`sysctl --all | grep ip_forward` -- *konfigurace, bez grep všechny*
Povolím NAT pomocí:
```bash
nft add table nat
nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat postrouting masquerade
```
Uložíme config, aby i po restartu bězel `nft list ruleset >> /etc/nftables.conf`
Povolíme firewall, aby fungovala nat `systemctl enable nftables`
## Instalace TFTP serveru
Nainstaluju pomocí `apt install tftpd-hpa`
Vytvořím si test soubor, pro oveření `echo "Hello, World" > /srv/tftp/file.txt`
Na test PC `apt install tftp-hpa` a připojím se `tftp 192.168.68.10`
Stáhnu test soubor `file.txt` z adresáře `/srv/tftp` pomocí `binary` a `get file.txt`
Opustím pomocí `quit`
## Instalace netboot
Stáhnu si netboot do `/srv/tftp`
```
wget http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xvf netboot.tar.gz
rm netboot.tar.gz
```
Upravím `/etc/dhcp/dhcpd.conf`
```
subnet 192.168.68.0 netmask 255.255.255.0 {
range 192.168.68.100 192.168.68.200;
option routers 192.168.68.10;
# Nové
option broadcast-address 192.168.68.255;
next-server 192.168.68.10;
filename "pxelinux.0";
}
```
Restartuju `service isc-dhcp-server restart`
## Vytvořím si nový virtual debian pc pro clienta
- Musí být bez disku
- System -> Boot order -> Pouze z networku
- Network -> pouze jedna karta -> Host-only adapter -> vboxnet1 (bez DHCP)
Po startu clienta, by se mi měla automaticky spustit instalačka Debianu
## Instalace NFS Server
`apt install nfs-kernel-server`
Vytvořím si adresář, kde bude klientský root `mkdir /srv/tftp/rootfs` a home `mkdir -p /srv/tftp/home`
Vytvořím configurační soubor `/etc/exports`, přidám
```
/srv/tftp/rootfs 192.168.68.0/24(rw,async,no_root_squash)
/srv/tftp/home 192.168.68.0/24(rw,async,no_root_squash)
```
> [!Note]
> `async` -- dává se pro rychlost
> `no_root_squash` -- normálně nemůžu mount jako root (uid 0), toto mi to dovolí
Aktivuju `exportfs -ra` a restartuju server pomocí `service nfs-kernel-server restart`
`exportfs` -- *kontrola konfigurace* -> expected:
```
/srv/tftp/rootfs
192.168.68.0/24
/srv/tftp/home 192.168.68.0/24
```
Vytvořím fstab konfiguraci `/srv/tftp/rootfs/etc/fstab`, použiju ho proto, aby mi namountovala home a proc, až po inicializaci rootfs.
```
proc /proc proc defaults 0 0
192.168.68.10:/srv/tftp/home /home nfs defaults,_netdev 0 0
```
> [!Note]
> `_netdev` -- kritické pro konfiguraci, jelikož čeká až se inicializuji network
## Otestuju na test PC (NE! toho bez disku)
Na test pc `apt install nfs-common`
Mountnu disk `mount 192.168.68.10:/srv/tftp/rootfs /mnt`
Zkusím vytvořit nějaký soubor a měl by se zobrazit v rootu `touch /mnt/test.txt`
## Root file system
Jsem v `/srv/tftp/rootfs`, některé věci překopíruju, některé vytvořím nové
```
cp -r /bin .
cp -r /boot .
mkdir dev
cp -r /etc .
cp -r /lib .
cp -r /lib64 .
mkdir media
mkdir mnt
cp -r /opt .
mkdir proc
cp -r /root .
mkdir run
cp -r /sbin .
mkdir srv
mkdir sys
mkdir tmp
cp -r /usr .
cp -r /var .
chmod o+t tmp/
```
Home directory existuje mimo rootfs -> `cp -r /home /srv/tftp/home`
> `chmod o+t tmp/` -- nastaví složku jako temp -- každý může zapsat soubor, ale upravit může jen svůj, cizí ne
## BIND9 relay
Nainstalujeme bind `apt install bind9`, aby fungoval jako "forwarder" pro naší NAT.
Bude cachovat dotazy a případně se starat o naše klientské servery.
Vytvořím konfigurace: */etc/bind/named.conf.options*
```
options {
directory "/var/cache/bind";
recursion yes;
allow-query { any; };
forwarders {
8.8.8.8;
1.1.1.1;
};
dnssec-validation auto;
listen-on { any; };
listen-on-v6 { any; };
};
```
Restartuji pomocí `systemctl restart bind9`
## Linux soubory fucki-waki
Odložím si aktuální konfigurace, jsem v `/srv/tftp`
```bash
mkdir /srv/tftp/backup
mv ldlinux.c32 backup/
mv pxelinux.0 backup/
mv pxelinux.cfg backup/
mv splash.png backup/
mv version.info backup/
```
Poté to zase vrátím zpět, ale jen to co potřebuji, lol:
```bash
cp debian-installer/amd64/boot-screens/libcom32.c32 .
cp debian-installer/amd64/boot-screens/vesamenu.c32 .
cp debian-installer/amd64/boot-screens/libutil.c32 .
cp -r backup/ldlinux.c32 .
cp -r backup/pxelinux.cfg .
cp -r backup/pxelinux.0 .
```
Zkontroluji si pokud mám dobrou verzi v `/rootfs/boot` -> verze 6.12.57
Upravím `/srv/tftp/pxelinux.cfg/default` na
```
DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE Boot Menu
LABEL Debian - NetBoot
MENU LABEL Start Network OS
KERNEL /rootfs/boot/vmlinuz-6.12.57+deb13-amd64
APPEND initrd=/rootfs/boot/initrd.img-6.12.57+deb13-amd64 root=/dev/nfs nfsroot=192.168.68.10:/srv/tftp/rootfs ip=dhcp rw
LABEL Debian - Install
MENU LABEL Install Debian
KERNEL debian-installer/amd64/linux
APPEND initrd=debian-installer/amd64/initrd.gz ip=dhcp
```
Jelikož jsme kopírovali ze serveru na klienta, musím upravit:
1. Klient hledá disk přiřazený serveru, ale klient žádný nemá, zakomentuju vše v `/srv/tftp/rootfs/etc/fstab` kromě toho co jsem přidal
2. Server měl 2 sítovky, ale klient má jen jednu, takže v `/srv/tftp/rootfs/etc/network/interfaces` zakomentuju vše kromě loopbacku (lo)
3. Smažu nepotřebné servisy z klienta `apt remove isc-dhcp-server nfs-kernel-server tftpd-hpa`
> [!Important]
> Proč by byl problém, kdybychom chtěli mít více klientů zároveň?
> - Kolize v `/tmp` -- na jednom pc si zapneme Mozillu, ta si tam udělá temp. soubory. Když zkusíme zapnout i na druhém, pošle nás do hajzlu, že už vlastně běží
> - Logy -- jednotlivé PC se nijak neidentifikují --> hrozný bordel (kromě toho, že bude hodně zapisování do toho jednoho souboru ze všech PC)
>
> Řešení -- logovat můžeme na vzdálený PC, `/tmp` namountíme do paměti klienta (ale musíme počítat s tím, že se tmp neukládá)
> Další výhody / nevýhody? Co udělám na jednom pc, stane se na všech (`Super, stáhl jsem package jednou a mají ho všichni`, ale `Kurva, posral jsem config, rozbil jsem to všem`)