NICs: pick the imaging port at install, GE can go into any other port
Sites no longer need either MAC in site-vars. pxe_nic_mac empty: before anything changes, the playbook runs pxe-pick-nic --auto. It takes the one wired port with a link, accepts it only if pxe-nic-check calls it isolated (no LLDP/CDP/802.1X, no other DHCP server, at most 10 hosts heard in 65 s), and pins it. The choice is saved in /etc/pxe-server/nic-pick.conf and never re-guessed at boot. When it cannot tell (no link, two links, not isolated) nothing changes, and the console banner says why and to run sudo pxe-pick-nic: pull the imaging cable and plug it back in, and the port that blinked is the imaging one. Both helpers are installed before the pick, so that works after a refused first boot. The site's corp domains and allowed switches are passed to the check. corp_nic_mac empty: every other wired port (en*, eth*) is a catch-all DHCP client, so GE can be plugged in at install or later. - dnsmasq stays pinned with interface=pxe0. A new check refuses any dhcp-range outside the imaging subnet, and proxy ranges. - The catch-all ports ignore offers from 172.16.9.1. - UFW allows SSH and 9009 by source on any interface, and keeps those rules when the old any-interface rules are removed. - pxe_nic_name must not look like en*/eth* in this mode. pxe-netplan-apply.sh takes 3 or 5 args. Without a pinned GE NIC it: - renames stray names (the old pxe0 after a re-pick, a leftover corp0) to enx<mac>, so the catch-all takes them, and restores them on revert; - checks that every NIC that had a DHCP address before has one after, tracked by MAC. With both MACs set (the WJ server), netplan, the dnsmasq pin and UFW render byte-for-byte as before. Tested in the pxetest VMs: - Fresh install with no MACs and the GE link down: the imaging port was picked and pinned as pxe0 with 172.16.9.1, and dnsmasq bound DHCP to pxe0 only. GE plugged in afterwards got a lease, SSH worked, and the guard reported pxe0 isolated. - --auto refuses with two links. - The interactive pick works by pulling and replugging the link. - A 3-arg re-apply is UNCHANGED. Unit tests (fake sysfs) cover the re-pick and pinned-to-catch-all renames.
This commit is contained in:
@@ -20,21 +20,38 @@ contribute a `config/sites/<sitename>.yaml` template back to the repo.
|
||||
|
||||
### Network
|
||||
|
||||
Every server has two NICs: the imaging NIC (isolated imaging LAN, static
|
||||
172.16.9.1, the only NIC that serves DHCP/TFTP/HTTP boot/SMB) and the GE
|
||||
corporate NIC (DHCP client; SSH and the webapp on 9009 only). Put both MACs
|
||||
in `playbook/site-vars.yml` (copy `playbook/site-vars.example.yml`) before
|
||||
building the USB: `pxe_nic_mac`, `corp_nic_mac`. The installer brings the
|
||||
network up with DHCP only; the first-boot playbook stops before changing
|
||||
anything if either MAC is unset or missing, then pins both NICs by MAC in
|
||||
netplan (names `pxe0` / `corp0`, overridable), dnsmasq, UFW and Samba.
|
||||
The imaging NIC (isolated imaging LAN, static 172.16.9.1, the only NIC that
|
||||
serves DHCP/TFTP/HTTP boot/SMB) is pinned by MAC. The GE corporate side (DHCP
|
||||
client; SSH and the webapp on 9009 only) is optional. Both MACs in
|
||||
`playbook/site-vars.yml` (copy `playbook/site-vars.example.yml`) may be left
|
||||
empty:
|
||||
|
||||
- `pxe_nic_mac` empty: the first boot picks the imaging NIC itself
|
||||
(`pxe-pick-nic --auto`). It takes the one wired port with a link, and only
|
||||
if `pxe-nic-check` calls it isolated, then pins it; the choice is in
|
||||
`/etc/pxe-server/nic-pick.conf` and is never re-guessed at boot. So during
|
||||
the install plug in ONLY the imaging switch. When it cannot tell (no link,
|
||||
two links, or that port sees GE) it changes nothing and the console says
|
||||
to run `sudo pxe-pick-nic`: pull the imaging cable and plug it back in,
|
||||
and the port that blinked is the imaging one. Run it again after swapping
|
||||
a dead USB NIC, then re-run the playbook.
|
||||
- `corp_nic_mac` empty: every other wired port (`en*`, `eth*`) is a DHCP
|
||||
client, so the GE cable can go into any of them, at install or later.
|
||||
dnsmasq is pinned to the imaging NIC (`interface=`) and serves only the
|
||||
imaging subnet, and those ports ignore DHCP offers from 172.16.9.1. UFW
|
||||
allows SSH and 9009 by source, not by interface.
|
||||
- `corp_nic_mac` set: that port alone is the GE NIC, named `corp0` (as on
|
||||
the WJ server).
|
||||
|
||||
The first-boot playbook pins the result in netplan (names `pxe0` / `corp0`,
|
||||
overridable), dnsmasq, UFW and Samba.
|
||||
|
||||
| Value | Default | Where it lives |
|
||||
|-------------------|----------------------|--------------------------------------------------------------------------------|
|
||||
| PXE server IP | 172.16.9.1 | `playbook/pxe_server_setup.yml` (dnsmasq config, iPXE script, samba conf, webapp env), `playbook/startnet.cmd` (mount paths), `boot-tools/blancco/grub-blancco.cfg` (TFTP/HTTP URLs) |
|
||||
| PXE subnet | 172.16.9.0/24 | Same as above, plus `playbook/pxe_server_setup.yml` (UFW rules) |
|
||||
| DHCP range | 172.16.9.10-100 | `playbook/site-vars.yml` (`pxe_dhcp_start`, `pxe_dhcp_end`) |
|
||||
| NIC MACs / names | (required) / pxe0, corp0 | `playbook/site-vars.yml` (`pxe_nic_mac`, `corp_nic_mac`, `pxe_nic_name`, `corp_nic_name`) |
|
||||
| NIC MACs / names | (picked at install) / pxe0, corp0 | `playbook/site-vars.yml` (`pxe_nic_mac`, `corp_nic_mac`, `pxe_nic_name`, `corp_nic_name`) |
|
||||
| Hostname | pxeserver | `autoinstall/user-data` (identity.hostname) |
|
||||
|
||||
### Access from the GE corporate network
|
||||
@@ -46,7 +63,7 @@ warning on every run while that is so. Set these in `playbook/site-vars.yml`:
|
||||
|
||||
| Var | Default | Effect |
|
||||
|--------------------------|---------|--------|
|
||||
| `corp_admin_cidrs` | `[]` | List of admin subnets/hosts, e.g. `["10.134.48.0/24", "3.12.34.56/32"]`. When non-empty, UFW allows 22 and 9009 on `corp_nic_name` from these only and drops the any-source rules. The play refuses (nothing changed) if an entry is invalid or your own SSH session is not inside one of them. The imaging NIC keeps its rules. |
|
||||
| `corp_admin_cidrs` | `[]` | List of admin subnets/hosts, e.g. `["10.134.48.0/24", "3.12.34.56/32"]`. When non-empty, UFW allows 22 and 9009 from these only (on `corp_nic_name` when `corp_nic_mac` is set, else on any interface) and drops the any-source rules. The play refuses (nothing changed) if an entry is invalid or your own SSH session is not inside one of them. The imaging NIC keeps its rules. |
|
||||
| `corp_ssh_password_auth` | `true` | `false` adds `/etc/ssh/sshd_config.d/10-pxe-corp-auth.conf`: `PasswordAuthentication no`, re-allowed by a `Match Address` block for `pxe_subnet` and localhost. Keys only from GE. The play refuses while `pxe` has no `~/.ssh/authorized_keys`, and removes the drop-in again if `sshd -t` rejects it. |
|
||||
| `allow_disruptive` | `false` | Re-runs while imaging is active (SMB sessions on 445, or DHCP leases granted in the last `pxe_busy_window_min` = 30 min) do not bounce the NICs or restart dnsmasq/Apache/Samba; a needed network change stops the play. `-e allow_disruptive=true` overrides. |
|
||||
|
||||
@@ -58,8 +75,9 @@ desks' subnet, then (after `ssh-copy-id`) `corp_ssh_password_auth: false`.
|
||||
The network step refuses before changing anything when the NIC that
|
||||
`pxe_nic_mac` names holds the default route, a DHCP lease, or the route to
|
||||
your SSH client (swapped MACs or cables). When it does apply, it arms a
|
||||
120 s auto-revert timer (`pxe-netplan-revert-*`), checks both names, the
|
||||
imaging address and that the corp NIC gets its IPv4 back within 30 s, and
|
||||
120 s auto-revert timer (`pxe-netplan-revert-*`), checks the names, the
|
||||
imaging address and that the corp NIC (or, without one pinned, every other
|
||||
port that had an address) gets its IPv4 back within 30 s, and
|
||||
restores the previous netplan config AND NIC names on any failure. Backups:
|
||||
`/var/backups/netplan-<timestamp>/`.
|
||||
|
||||
|
||||
@@ -32,7 +32,11 @@ Sources: `playbook/pxe-server-helpers/`, installed by `pxe_server_setup.yml`
|
||||
`pxe_nic_allowed_switches`; `pxe_imaging_mac` / `pxe_ge_mac` are derived
|
||||
from the first two). The same MACs pin the NICs in netplan
|
||||
(`playbook/templates/netplan-pxe.yaml.j2`, names `pxe0` / `corp0`) and in
|
||||
`/etc/dnsmasq.d/pxe-nic-only.conf`.
|
||||
`/etc/dnsmasq.d/pxe-nic-only.conf`. With `pxe_nic_mac` empty the playbook
|
||||
picks the imaging NIC at install time with `pxe-pick-nic --auto`, which
|
||||
runs this check on the one port with a link (`--iface X --probe`, 65 s)
|
||||
and accepts only "isolated". With `corp_nic_mac` empty `ge_mac` is blank
|
||||
and the GE NIC is whichever other port holds a DHCP lease.
|
||||
|
||||
## How it decides
|
||||
|
||||
|
||||
Reference in New Issue
Block a user