From 51136e804c439170f151027a09ce16fc455da547 Mon Sep 17 00:00:00 2001 From: Sergey Mazein <37579301+semalis@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:41:49 +0300 Subject: [PATCH] Proxmox setup --- Installers/pre_install_proxmos.sh | 23 +++++ Proxmox/Test_NVMe/README.md | 84 +++++++++++++++++ Proxmox/lxc_nat_troubleshooting.md | 147 +++++++++++++++++++++++++++++ 3 files changed, 254 insertions(+) create mode 100644 Proxmox/Test_NVMe/README.md create mode 100644 Proxmox/lxc_nat_troubleshooting.md diff --git a/Installers/pre_install_proxmos.sh b/Installers/pre_install_proxmos.sh index 4742fe4..fe4c7bf 100644 --- a/Installers/pre_install_proxmos.sh +++ b/Installers/pre_install_proxmos.sh @@ -28,6 +28,26 @@ sudo systemctl enable zabbix-agent sudo /etc/init.d/zabbix-agent status #zabbix_agentd -V +echo -e "${C_LGn}Autoupdate IPTable rules ...${RES}" +tee /etc/systemd/system/iptables-restore-custom.service > /dev/null << EOF +[Unit] +Description=Restore iptables rules after Proxmox Firewall +After=pve-firewall.service +Wants=network-online.target +ConditionPathExists=/etc/iptables/rules.v4 + +[Service] +Type=oneshot +ExecStart=/bin/sh -c '/sbin/iptables-restore < /etc/iptables/rules.v4' +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +EOF + +systemctl enable --now iptables-restore-custom.service + + echo -e "${C_LGn}Installing Node Exporter ...${RES}" cd $HOME && \ wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz && \ @@ -79,6 +99,9 @@ chmod 755 /usr/local/bin/renew-pve-certs.sh mkdir /var/lib/vz/extDB && chmod -R 777 /var/lib/vz/extDB +mkdir /var/lib/vz/temp +echo "tmpdir: /var/lib/vz/temp" >> /etc/vzdump.conf + echo "Меняем часовой пояс на Europe/Moscow" sudo timedatectl set-timezone Europe/Moscow date diff --git a/Proxmox/Test_NVMe/README.md b/Proxmox/Test_NVMe/README.md new file mode 100644 index 0000000..1d71bbf --- /dev/null +++ b/Proxmox/Test_NVMe/README.md @@ -0,0 +1,84 @@ +```bash +#!/bin/bash + +echo "🔍 NVMe Disk Health Report" +echo "==========================" +echo + +# Проверка наличия утилиты +if ! command -v nvme &>/dev/null; then + echo "❌ Утилита 'nvme' не найдена. Установите: sudo apt install nvme-cli" + exit 1 +fi + +# Поиск всех NVMe-дисков +NVME_DISKS=$(ls /dev/nvme*n1 2>/dev/null | grep -E '^/dev/nvme[0-9]n1$') + +if [[ -z "$NVME_DISKS" ]]; then + echo "❌ NVMe диски не найдены" + exit 1 +fi + +for DISK in $NVME_DISKS; do + echo "📦 Проверка: $DISK" + echo "--------------------------" + + CONTROLLER="/dev/$(basename "$DISK" | sed 's/n1$//')" + TEMP_FILE=$(mktemp) + + # Получение SMART-лога + nvme smart-log "$CONTROLLER" > "$TEMP_FILE" + + # Парсинг значений + USED=$(grep -i "percentage_used" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9') + TEMP_C=$(grep -i "^temperature[^_]" "$TEMP_FILE" | grep -oP '[0-9]+(?=°C)' | sort -nr | head -n1) + MEDIA_ERR=$(grep -i "media_errors" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9') + NUM_ERR=$(grep -i "num_err_log_entries" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9') + SPARE=$(grep -i "available_spare[^_]" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9') + DATA_WRITTEN=$(grep -i "Data Units Written" "$TEMP_FILE" | grep -oP '\\([0-9\\.]+ TB\\)' | tr -d '()') + POWER_HOURS=$(grep -i "power_on_hours" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9') + UNSAFE_SHUTDOWNS=$(grep -i "unsafe_shutdowns" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9') + + # Расчёт времени наработки + if [[ -n "$POWER_HOURS" && "$POWER_HOURS" -gt 0 ]]; then + DAYS=$((POWER_HOURS / 24)) + YEARS=$(echo "scale=1; $DAYS / 365" | bc) + UPTIME="$POWER_HOURS ч / $DAYS дн / ${YEARS} г" + else + UPTIME="N/A" + fi + + # Вывод + echo "🧠 Износ SSD: ${USED:-N/A}%" + echo "🌡 Температура: ${TEMP_C:-N/A}°C" + echo "💾 Оставшийся запас: ${SPARE:-N/A}%" + echo "📉 Записано всего: ${DATA_WRITTEN:-N/A}" + echo "⏱ Время наработки: $UPTIME" + echo "⚠️ Media Errors: ${MEDIA_ERR:-N/A}" + echo "❗ Controller Errors: ${NUM_ERR:-N/A}" + echo "🔌 Unsafe Shutdowns: ${UNSAFE_SHUTDOWNS:-N/A}" + + # Оценка состояния + echo -n "🔎 Оценка: " + if [[ -n "$USED" && "$USED" -ge 90 ]]; then + echo "❌ SSD почти исчерпан" + elif [[ -n "$TEMP_C" && "$TEMP_C" -ge 60 ]]; then + echo "⚠️ Высокая температура" + elif [[ -n "$NUM_ERR" && "$NUM_ERR" -gt 100 ]]; then + echo "⚠️ Ошибки контроллера превышают норму" + elif [[ -n "$UNSAFE_SHUTDOWNS" && "$UNSAFE_SHUTDOWNS" -gt 10 ]]; then + echo "⚠️ Много аварийных отключений питания" + else + echo "✅ Состояние хорошее" + fi + echo + + # Модель, серийник, прошивка + echo "📄 Инфо:" + nvme id-ctrl "$CONTROLLER" | grep -Ei "mn|sn|fr" + echo + + rm -f "$TEMP_FILE" +done + +``` \ No newline at end of file diff --git a/Proxmox/lxc_nat_troubleshooting.md b/Proxmox/lxc_nat_troubleshooting.md new file mode 100644 index 0000000..ec72602 --- /dev/null +++ b/Proxmox/lxc_nat_troubleshooting.md @@ -0,0 +1,147 @@ + +# На сервер Hezner я добавил доп. IP и после этого у меня LXC контейнеры перестали выходить в интернет. +# ❗️Проблема: LXC контейнеры не имеют доступа в интернет через NAT на Proxmox + +## добавил поддержку внешних IP, через добавление доп интерфейса в /etc/network/interfaces +```bash +auto vmbr0 +iface vmbr0 inet static + address 167.235.103.244 + netmask 255.255.255.192 + gateway 167.235.103.193 + bridge_ports enp195s0 + bridge_stp off + bridge_fd 0 +``` + +## 📍Контекст + +На хост-сервере Proxmox используется bridge-сеть `vmbr100` для подключения LXC-контейнеров с приватными IP (например, `192.168.100.x`). Основной интерфейс `enp195s0` имеет публичный IP (например, `167.235.103.244`). + +На хосте настроено правило NAT, позволяющее контейнерам выходить в интернет через `iptables`: + +```bash +iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp195s0 -j MASQUERADE +``` + +## ❌ Проблема + +После: +- добавления дополнительного публичного IP; +- изменения bridge-интерфейса (`vmbr0`); +- перезапуска сервера; + +контейнеры теряют доступ в интернет. Пинги (например, `ping 8.8.8.8`) не работают, DNS-запросы не уходят. + +### Диагностика + +- `tcpdump` на `vmbr100` показывает, что пакеты уходят из контейнера; +- `tcpdump` на `enp195s0` — показывает, что они **не маршрутизируются наружу**; +- `iptables -t nat -L POSTROUTING -n -v` показывает, что `MASQUERADE`-правило не работает (пакеты = 0); +- `ip route get 8.8.8.8` возвращает маршрут `via vmbr0` — это не работает корректно. + +--- + +## ✅ Решение + +### 1. Удалить старое `MASQUERADE`-правило: +```bash +iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o enp195s0 -j MASQUERADE +``` + +### 2. Добавить `SNAT`-правило c явным IP: +```bash +iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp195s0 -j SNAT --to-source 167.235.103.244 +``` + +### 3. Убедиться, что `FORWARD`-разрешения включены: +```bash +iptables -I FORWARD -s 192.168.100.0/24 -o enp195s0 -j ACCEPT +iptables -I FORWARD -d 192.168.100.0/24 -i enp195s0 -j ACCEPT +``` + +### 4. Проверить, что включена маршрутизация: +```bash +sysctl -w net.ipv4.ip_forward=1 +``` + +Постоянно включить: +```bash +echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf +sysctl -p +``` + +--- + +## 💾 Сохранение правил + +После успешной настройки сохранить правила: +```bash +iptables-save > /etc/iptables/rules.v4 +``` + +--- + +## 🔁 Автоматическое восстановление правил + +### Способ 1: `iptables-persistent` (рекомендуется) + +```bash +apt install iptables-persistent +``` + +Файлы: +- `/etc/iptables/rules.v4` +- `/etc/iptables/rules.v6` + +Восстанавливаются автоматически при загрузке. + +### Способ 2: systemd unit (если используется `pve-firewall`) + +Создать `systemd`-сервис `/etc/systemd/system/iptables-restore-custom.service`: + +```ini +tee /etc/systemd/system/iptables-restore-custom.service > /dev/null << EOF +[Unit] +Description=Restore iptables rules after Proxmox Firewall +After=pve-firewall.service +Wants=network-online.target +ConditionPathExists=/etc/iptables/rules.v4 + +[Service] +Type=oneshot +ExecStart=/bin/sh -c '/sbin/iptables-restore < /etc/iptables/rules.v4' +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +EOF + +systemctl daemon-reexec +systemctl enable --now iptables-restore-custom.service +``` + +Активировать: +```bash +systemctl daemon-reexec +systemctl enable --now iptables-restore-custom.service +``` + +--- + +## 🔐 Дополнительно + +- Убедитесь, что контейнеры имеют в конфиге параметр `gw=192.168.100.1`; +- Проверьте, что bridge `vmbr100` существует и имеет адрес `192.168.100.1`; +- Проверка сети в контейнере: +```bash +ping 192.168.100.1 +ip route +ping 8.8.8.8 +``` + +--- + +## ✅ Результат + +Контейнеры получают доступ в интернет через NAT, трафик корректно маршрутизируется, а правила восстанавливаются автоматически при перезапуске Proxmox.