Files
trade-iac/doc/step-001-wireguard-ufw-ssh-only.md

4.2 KiB

Step 001: WireGuard + UFW + SSH tylko po WG (Ubuntu 24.04, 1 NIC)

Cel: na świeżym Ubuntu 24.04 na bare metalu ustawić:

  • WireGuard jako prywatny kanał administracyjny,
  • SSH dostępne tylko przez WireGuard,
  • przygotować grunt pod Agave RPC dostępne tylko przez WireGuard (8899/8900 prywatnie),
  • zostawić porty klastra Agave na publicznym NIC, żeby node mógł się zsynchronizować.

Kolejność jest krytyczna: najpierw uruchom WireGuard i sprawdź, że działa, dopiero potem ograniczaj SSH/firewall.

Założenia

  • Host ma 1 publiczny interfejs (np. enp1s0).
  • WireGuard interfejs to wg0.
  • Masz dostęp awaryjny do konsoli (IPMI/KVM) na wypadek pomyłki.

Parametry (dostosuj)

export PUBLIC_IFACE="enp1s0"
export WG_IFACE="wg0"

export WG_SERVER_IP="10.66.66.1/24"
export WG_SERVER_IP_ONLY="10.66.66.1"
export WG_PORT="51820"

export WG_CLIENT_IP="10.66.66.2/32"
export WG_CLIENT_PUBKEY="<PASTE_CLIENT_PUBLIC_KEY>"

# Agave/validator ports
export RPC_PORT="8899"
export WS_PORT="8900"
export DYNAMIC_PORT_RANGE="8000:8020"

1) WireGuard (nie ruszaj jeszcze SSH)

Instalacja

apt-get update
apt-get install -y wireguard

Klucze serwera

umask 077
wg genkey | tee /etc/wireguard/server.key >/dev/null
cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub >/dev/null
cat /etc/wireguard/server.pub

Konfiguracja /etc/wireguard/wg0.conf

cat >/etc/wireguard/${WG_IFACE}.conf <<EOF
[Interface]
Address = ${WG_SERVER_IP}
ListenPort = ${WG_PORT}
PrivateKey = $(cat /etc/wireguard/server.key)

[Peer]
PublicKey = ${WG_CLIENT_PUBKEY}
AllowedIPs = ${WG_CLIENT_IP}
EOF

Start:

systemctl enable --now wg-quick@${WG_IFACE}
wg show
ip a show ${WG_IFACE}

Test z klienta (po zestawieniu tunelu): ping 10.66.66.1.

2) UFW: public tylko WG + porty klastra; prywatnie RPC/SSH po wg0

Instalacja:

apt-get install -y ufw

Public: pozwól na WireGuard:

ufw allow ${WG_PORT}/udp

Public: pozwól na porty klastra Agave (żeby node mógł syncować).

Uwaga: Solana/Agave używa głównie UDP w tym zakresie; jeśli będziesz miał problemy z reachability, rozważ dopuszczenie też TCP w tym samym zakresie.

ufw allow in on "${PUBLIC_IFACE}" to any port ${DYNAMIC_PORT_RANGE}/udp

Prywatnie (wg0): RPC/WS:

ufw allow in on "${WG_IFACE}" to any port ${RPC_PORT} proto tcp
ufw allow in on "${WG_IFACE}" to any port ${WS_PORT} proto tcp

Na tym etapie NIE blokuj jeszcze publicznego SSH (żeby się nie zablokować).

Włącz UFW:

ufw enable
ufw status verbose

3) SSH tylko po WireGuard (dopiero gdy WG działa)

3.1) UFW: pozwól na SSH po wg0

ufw allow in on "${WG_IFACE}" to any port 22 proto tcp

3.2) sshd: nasłuch tylko na WG IP

Edytuj sshd_config:

sed -n '1,220p' /etc/ssh/sshd_config

Dodaj (lub ustaw) na końcu pliku:

PasswordAuthentication no
PermitRootLogin no
ListenAddress 10.66.66.1

Zanim zrestartujesz SSH:

  • miej otwartą obecną sesję SSH,
  • zestaw WG na kliencie,
  • przygotuj drugi terminal do testu po 10.66.66.1.

Restart:

systemctl restart ssh
ss -lntp | grep -E ':22\\b' || true

Test z klienta po WG:

ssh <user>@10.66.66.1

Jeśli działa: zablokuj publiczny SSH:

ufw deny 22/tcp
ufw status verbose

4) Kernel/sysctl baseline pod Agave (na tym etapie bez uruchamiania Agave)

Minimalne wartości, które już mamy w Ansible (i kilka dodatkowych bezpiecznych):

cat >/etc/sysctl.d/90-agave.conf <<'EOF'
fs.file-max = 2000000
vm.max_map_count = 1000000
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 250000
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
EOF

sysctl --system

Limity nofile:

cat >/etc/security/limits.d/90-solana.conf <<'EOF'
* soft nofile 1000000
* hard nofile 1000000
EOF

5) Co dalej

  • Instalacja i uruchomienie Agave: patrz doc/etap-007-manual-baremetal-rpc-commands.md.
  • Narzedzia do generowania konfiguracji WireGuard (server/client) + reset wg0: patrz doc/step-001-wireguard-tools.md.
  • Docelowo: bind RPC/WS do WG IP (zamiast 0.0.0.0) i spójne, minimalne reguły firewall.