Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| navody:vps:kvm [2018/07/30 11:21] – swez | navody:vps:kvm [2026/08/17 11:09] (aktuální) – Napojení na revizi zdroje a testy virtualizace aither | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| < | < | ||
| - | ====== Používání KVM a na vpsFree.cz | ||
| - | Tato info stránka obsahuje návody pro zprovoznění KVM na Alpine Linux 3.4+, CentOS 7 a Debian 8. | + | < |
| + | source=" | ||
| + | test=" | ||
| + | /> | ||
| - | Nejprve je potřeba ve vpsAdminu, v detailu vaší | + | ====== KVM a libvirt uvnitř VPS ====== |
| - | * Bridge – povolí vytvoření síťového bridge, do kterého následně připojíte KVM virtuály, | + | ===== Instalace libvirt ===== |
| - | * TUN/TAP - povolí vytváření virtuálních interface, které jsou pak bridgovány, | + | |
| - | * iptables – povolí použití iptables, které jsou potřeba pro nastavení IP maškarády, | + | |
| - | * KVM – povolí použití KVM (pro HW podporu virtualizace). | + | |
| - | Na vpsFree | + | vpsAdminOS provozuje VPS v kontejnerech, |
| + | uvnitř VPS proto není vnořená virtualizace: | ||
| + | hardwarovou virtualizaci fyzického nodu přímo. | ||
| + | Tento návod používá aktuální šablonu **Debian | ||
| + | spojení '' | ||
| + | < | ||
| + | Pro virtualizaci je potřeba funkce **KVM**. **TUN/TAP** je potřeba pro síťová | ||
| + | rozhraní virtuálních strojů typu TAP. Obě funkce jsou u nových VPS zapnuté ve | ||
| + | výchozím nastavení v sekci **Funkce** v detailu VPS ve vpsAdminu. | ||
| + | </ | ||
| - | ===== KVM na Alpine Linuxu | + | {{: |
| - | Připravu hypervizoru lze provést automatizovaně pomocí [[http:// | + | Nainstaluj QEMU, libvirt a '' |
| - | [[https://gist.github.com/HalisCz/ | + | <code bash> |
| - | * [[navody: | + | #!/usr/bin/env bash |
| - | * [[navody: | + | set -euo pipefail |
| - | ==== Instalace balíčků a konfigurace hypervizoru ==== | + | apt-get update |
| + | apt-get install --yes \ | ||
| + | iptables \ | ||
| + | libvirt-clients \ | ||
| + | libvirt-daemon-system \ | ||
| + | qemu-system-x86 \ | ||
| + | qemu-utils \ | ||
| + | virtinst | ||
| - | Nainstalujte potřebné balíčky (ip6tables je volitelný): | + | virsh --connect |
| - | + | ||
| - | <code shell> | + | |
| - | apk update | + | |
| - | apk add qemu-system-x86_64 | + | |
| </ | </ | ||
| - | Nastavte potřebná práva pro přístup ke KVM a TUN (do skupin | + | Používej systémové spojení '' |
| + | libvirt přes SSH, například '' | ||
| + | klíčem. Nezveřejňuj nešifrovaný libvirt TCP socket do internetu. | ||
| - | <code shell> | + | ===== Diskové obrazy a ZFS ===== |
| - | chown :kvm /dev/kvm | + | |
| - | chmod g+rw /dev/kvm | + | |
| - | chown :netdev / | + | |
| - | chmod g+rw / | + | |
| - | </ | + | |
| - | Nakonfigurujte bridge pro Qemu/KVM virtuály; vytvořte soubor /// | + | Pro obrazy disků použij samostatný [[navody: |
| + | vlastnosti pak můžeš změnit bez zásahu do kořenového datasetu VPS. Úložiště | ||
| + | připrav takto: | ||
| - | <code shell> | + | * <vpsadmin-nav id=" |
| - | auto br0 | + | * < |
| - | iface br0 inet static | + | |
| - | pre-up brctl addbr br0 | + | |
| - | | + | |
| - | netmask 255.255.255.0 | + | |
| - | post-down brctl delbr br0 | + | |
| - | </code> | + | |
| - | Jelikož OpenVZ poněkud neohrabaně přepisuje soubor /// | + | Například z běžné kapacity 120 GiB můžeš ponechat 20 GiB kořenovému datasetu |
| + | a 100 GiB přidělit datasetu '' | ||
| + | můžeš přidělit například 80 GiB a ponechat 20 GiB volných pro jeho růst a | ||
| + | snapshoty. | ||
| - | Povolte uživateli ve skupině //qemu// spravovat vytvořený bridge: | + | Subdataset se [[navody: |
| + | VPS. | ||
| - | <code shell> | + | {{:cs: |
| - | echo "allow br0" > / | + | |
| - | chown root:qemu / | + | |
| - | chmod 0640 / | + | |
| - | </ | + | |
| - | Nastavte IP maškarádu pro přístup Qemu/KVM virtuálů ven do veřejného Internetu. | + | Připojený adresář |
| - | Pokud už máte nakonfigurované iptables, tak jen přidejte pravidlo: | + | <code bash> |
| + | # | ||
| + | set -euo pipefail | ||
| - | < | + | virsh --connect qemu:/// |
| - | iptables | + | vm-images dir --target / |
| + | virsh --connect qemu:/// | ||
| + | virsh --connect qemu:/// | ||
| + | virsh --connect qemu:///system pool-info vm-images | ||
| </ | </ | ||
| - | V opačném případě můžete postupovat např. podle odstavce [[# | + | Disky pak vytvářej prostřednictvím libvirt, '' |
| + | '' | ||
| + | ZFS vlastnosti subdatasetu ponech na výchozích hodnotách, dokud měření | ||
| + | neukáže důvod ke změně. Komprese je ve výchozím nastavení zapnutá. Výchozí | ||
| + | '' | ||
| + | používá i menší záznamy. Změna '' | ||
| + | vytvořených souborů. | ||
| - | ==== Vytvoření a spuštění virtuálu ==== | + | Pro obrazy na ZFS je vhodnou výchozí volbou formát '' |
| + | další copy-on-write vrstvu. '' | ||
| + | files, interní snapshoty nebo jiné funkce obrazového formátu. | ||
| - | V tomto návodu předpokládám použití [[https:// | + | Podrobnosti k ladění podle zátěže popisuje |
| - | Vytvoření nového virtálu spočívá pouze v přípravě image disku, vytvoření symlinku pro init skript a úpravě jednoduchého konfiguračního skriptu. Nechť se nový virtuál jmenuje třeba „myvirt.“ | + | ===== Síť virtuálních strojů ===== |
| - | Připravte raw image pro myvirt o potřebné velikosti: | + | Síťové rozhraní VPS je k nodu připojené směrovaným spojem na třetí vrstvě. |
| + | Nepřidávej proto rozhraní VPS do bridge spravovaného libvirt. Pro připojení | ||
| + | virtuálních strojů k síti jsou vhodná dvě zapojení: | ||
| - | <code shell> | + | ^ Zapojení ^ Adresy v doméně ^ Výhody ^ Nevýhody ^ |
| - | mkdir -p / | + | | NAT v libvirt | Privátní IPv4 a privátní ULA IPv6 | Funguje s běžnými adresami VPS, snadno obslouží více domén. | Příchozí služby potřebují |
| - | qemu-img create -f raw / | + | | Směrované veřejné adresy | Veřejná IPv4 '' |
| - | chown qemu: | + | |
| - | chmod 0600 / | + | |
| - | </ | + | |
| - | Zkopírujte výchozí konfigurák /etc/conf.d/qemu do /etc/conf.d/ | + | NAT je obvykle jednodušší pro jednu nebo několik domén s malým počtem |
| + | zveřejněných služeb. Směrované adresy použij, když má mít doména vlastní | ||
| + | veřejné adresy, všechny porty nebo protokoly, které se přes port forwarding | ||
| + | obsluhují špatně. Pro čistě vnitřní komunikaci mezi doménami můžeš přidat další | ||
| + | izolovanou síť libvirt; přístup ven nadále řeší jedno z uvedených zapojení. | ||
| - | <code shell> | + | ==== Veřejné adresy na VPS a dvouprotokolový NAT ==== |
| - | cd / | + | |
| - | cp qemu qemu.myvirt | + | |
| - | vi qemu.myvirt | + | |
| - | </ | + | |
| - | Zejména tedy přidejte | + | Veřejná IPv4 ''/ |
| + | '' | ||
| + | '' | ||
| + | NAT66. Výchozí síť '' | ||
| + | IPv4 a používá '' | ||
| + | dvouprotokolovou síť s odlišnou IPv4 podsítí. NAT66 se v XML zapíná pomocí | ||
| + | ''< | ||
| + | [[https:// | ||
| - | <code shell> | + | ULA '' |
| - | disk1_file=" | + | více privátních sítí později propojovat pomocí VPN nebo směrování, |
| - | disk1_format=" | + | každou z nich vlastní náhodný ULA '' |
| - | </code> | + | '' |
| - | A zřejmě také instalační CD některé distribuce, které jste si předem stáhli: | + | Podstatnou |
| - | < | + | < |
| - | cdrom0_file="/var/lib/ | + | < |
| + | < | ||
| + | <forward mode=' | ||
| + | <nat ipv6=' | ||
| + | </forward> | ||
| + | <bridge name=' | ||
| + | <ip address=' | ||
| + | <ip family=' | ||
| + | </ | ||
| </ | </ | ||
| - | Vytvořte symlink pro init skript | + | Vytvořenou doménu připoj k '' |
| + | '' | ||
| + | nastav stabilní adresy | ||
| - | < | + | < |
| - | cd /etc/init.d | + | auto ens3 |
| - | ln -s qemu qemu.myvirt | + | iface ens3 inet static |
| + | address 192.168.124.10/ | ||
| + | | ||
| - | rc-service qemu.myvirt start | + | iface ens3 inet6 static |
| + | address fd5f: | ||
| + | gateway fd5f: | ||
| </ | </ | ||
| - | <note important> | + | Přesměrování portu se skládá z DNAT na adresu domény a povolení odpovídajícího |
| - | Pokud máte problémy s tím, že při větším provozu | + | forwardu. Pro web na IPv4 jsou podstatou například tyto dva příkazy: |
| - | < | + | < |
| - | + | iptables | |
| - | stabilitu je možno otestovat iperf-em, na testovanem stroji: | + | -j DNAT --to-destination 192.168.124.10:80 |
| - | + | iptables | |
| - | <code shell> | + | |
| - | + | ||
| - | na hostiteli pak: | + | |
| - | <code shell> | + | |
| - | iperf -c 172.17.1.X -P 20 | + | |
| </ | </ | ||
| - | </ | ||
| - | ==== Nastavení iptables ==== | + | Stejná pravidla je potřeba vytvořit i pomocí '' |
| + | zadaná pravidla však libvirt při změnách sítě nezachová. Následující úplný | ||
| + | skript proto vytvoří síť, soubor s přesměrováním a hook, který pravidla obnoví | ||
| + | při spuštění nebo znovupřipojení sítě. Ve výchozím nastavení zveřejní web na | ||
| + | portu 80 a SSH domény na portu 2222 pro IPv4 i IPv6. | ||
| - | Pokud nepoužíváte žádný nástroj pro generování iptables pravidel (jako např. [[https://github.com/ | + | Ulož jej například jako '' |
| + | s jednou veřejnou IPv4 a jednou adresou | ||
| - | Stáhněte upravenou šablonu pravidel s přidanou maškarádou pro náš bridge do / | + | < |
| - | + | PUBLIC_IPV4=VPS_IPV4 PUBLIC_IPV6=VPS_IPV6 \ | |
| - | < | + | |
| - | rmdir /etc/iptables | + | |
| - | wget -O / | + | |
| </ | </ | ||
| - | Upravte konfigurák /etc/conf.d/iptables (IPv4): | + | Skript se spouští při prvním vytvoření sítě a znovu při změně jeho vstupních |
| + | hodnot, ne po každém restartu VPS. Síť má zapnutý autostart a pravidla při jejím | ||
| + | spuštění načte hook. | ||
| - | < | + | < |
| - | # /etc/conf.d/iptables | + | #!/usr/bin/env bash |
| + | set -euo pipefail | ||
| - | IPTABLES_SAVE="/ | + | : "${PUBLIC_IPV4:? |
| - | # | + | : "${PUBLIC_IPV6:? |
| - | SAVE_ON_STOP=" | + | |
| - | IPFORWARD=" | + | |
| - | </ | + | |
| - | …a /etc/conf.d/ip6tables | + | guest_ipv4=${GUEST_IPV4: |
| + | guest_ipv6=${GUEST_IPV6: | ||
| + | host_ipv4=${HOST_IPV4: | ||
| + | host_ipv6=${HOST_IPV6: | ||
| + | connection=qemu:/// | ||
| + | network=dualstack-nat | ||
| + | hook=/etc/libvirt/ | ||
| + | config=/ | ||
| + | xml=$(mktemp) | ||
| + | trap 'rm -f " | ||
| - | <code shell> | + | network_uuid=$(virsh --connect " |
| - | # /etc/conf.d/ip6tables | + | uuid_element= |
| + | if [[ -n $network_uuid ]]; then | ||
| + | uuid_element=" | ||
| + | fi | ||
| + | cat >" | ||
| + | < | ||
| + | < | ||
| + | $uuid_element | ||
| + | <forward mode=' | ||
| + | <nat ipv6=' | ||
| + | </ | ||
| + | <bridge name=' | ||
| + | <ip address=' | ||
| + | < | ||
| + | <range start=' | ||
| + | </ | ||
| + | </ | ||
| + | <ip family=' | ||
| + | </ | ||
| + | EOF | ||
| - | IP6TABLES_SAVE="/ | + | if virsh --connect |
| - | SAVE_RESTORE_OPTIONS=" | + | | grep -Fx "$network" |
| - | SAVE_ON_STOP="no" | + | |
| - | IPFORWARD="yes" | + | |
| - | </code> | + | exit 1 |
| + | fi | ||
| - | Spusťte iptables a ip6tables a přidejte je do runlevel boot: | + | install -d -m 0755 / |
| + | install -d -m 0755 / | ||
| + | cat >" | ||
| + | # | ||
| + | set -euo pipefail | ||
| - | <code shell> | + | PATH=/ |
| - | rc-service iptables start | + | network=${1-} |
| - | rc-service ip6tables start | + | action=${2-} |
| - | rc-update add iptables boot | + | config=/ |
| - | rc-update add ip6tables boot | + | nat_chain=VPSFREE_KVM_DNAT |
| - | </ | + | filter_chain=VPSFREE_KVM_FWD |
| + | [[ $network == dualstack-nat ]] || exit 0 | ||
| + | exec 9>/ | ||
| + | flock 9 | ||
| - | ===== KVM na CentOS 7 ===== | + | delete_jumps() { |
| + | local tool | ||
| + | for tool in iptables ip6tables; do | ||
| + | while " | ||
| + | " | ||
| + | done | ||
| + | while " | ||
| + | " | ||
| + | done | ||
| + | done | ||
| + | } | ||
| - | <note warning> | + | delete_chains() { |
| - | Tento návod platí pouze pro CentOS 7.1. Na CentOS 7.2 aktuálně nefunguje interní síť mezi VPS a VM. Použijte buď CentOS 7.1 nebo Debian 8, než bude tento problém vyřešen. | + | local tool |
| + | for tool in iptables ip6tables; do | ||
| + | if " | ||
| + | " | ||
| + | " | ||
| + | fi | ||
| + | if " | ||
| + | " | ||
| + | " | ||
| + | fi | ||
| + | done | ||
| + | } | ||
| - | 2018-03-26 | + | cleanup() { |
| - | </ | + | |
| + | delete_chains | ||
| + | } | ||
| - | KVM používám prostřednictvím libvirt na aktualizovaném CentOS 7. | + | valid_ip_address() { |
| + | local family=$1 address=$2 | ||
| - | Doporučuju CentOS 7 plně aktualizovat, nakonfigurovat a nainstalovat potřebný software. Z důvodu povolení iptables je potřeba nakonfigurovat nebo vypnout firewalld. | + | perl -MSocket=AF_INET,AF_INET6, |
| + | my ($family, $address) = @ARGV; | ||
| + | my $af = $family eq " | ||
| + | exit(defined(inet_pton($af, | ||
| + | ' " | ||
| + | } | ||
| - | <code shell> | + | if [[ $action == stopped ]]; then |
| - | yum group install virtualization-host-environment | + | |
| - | yum install virt-manager xauth | + | exit 0 |
| - | systemctl enable libvirtd | + | fi |
| - | systemctl disable firewalld | + | [[ $action == started || $action == reconnect ]] || exit 0 |
| - | reboot | + | |
| - | </ | + | |
| - | ==== Vytvoření virtuálu pomocí virt-manager na straně serveru | + | entries=() |
| + | while read -r family protocol public_ip public_port guest_ip guest_port extra \ | ||
| + | || [[ -n ${family:-} ]]; do | ||
| + | [[ -n ${family:-} && $family != \#* ]] || continue | ||
| + | [[ $family | ||
| + | printf ' | ||
| + | exit 1 | ||
| + | } | ||
| + | [[ $protocol == tcp || $protocol == udp ]] || { | ||
| + | printf ' | ||
| + | exit 1 | ||
| + | } | ||
| + | for address in " | ||
| + | valid_ip_address " | ||
| + | printf ' | ||
| + | " | ||
| + | exit 1 | ||
| + | } | ||
| + | done | ||
| + | [[ $public_port =~ ^[0-9]{1,5}$ && $guest_port | ||
| + | printf ' | ||
| + | exit 1 | ||
| + | } | ||
| + | public_port=$((10# | ||
| + | guest_port=$((10# | ||
| + | ((public_port >= 1 && public_port <= 65535)) || exit 1 | ||
| + | ((guest_port >= 1 && guest_port <= 65535)) || exit 1 | ||
| + | [[ -z ${extra:-} ]] || { | ||
| + | printf 'Too many fields in %s\n' " | ||
| + | exit 1 | ||
| + | } | ||
| + | entries+=(" | ||
| + | done <" | ||
| - | Motivace: Když pracujete na pomalém | + | cleanup |
| + | for tool in iptables ip6tables; do | ||
| + | " | ||
| + | " | ||
| + | done | ||
| + | for entry in " | ||
| + | IFS=' | ||
| + | <<<" | ||
| + | tool=iptables | ||
| + | destination=" | ||
| + | if [[ $family == ipv6 ]]; then | ||
| + | tool=ip6tables | ||
| + | destination=" | ||
| + | fi | ||
| + | " | ||
| + | --dport " | ||
| + | " | ||
| + | --dport " | ||
| + | done | ||
| + | for tool in iptables ip6tables; do | ||
| + | " | ||
| + | " | ||
| + | done | ||
| + | HOOK | ||
| + | chmod 0755 " | ||
| - | <code shell> | + | cat >" |
| - | ssh root@your-host-name -Y virt-manager | + | # RODINA PROTOKOL VEŘEJNÁ_IP VEŘEJNÝ_PORT IP_DOMÉNY PORT_DOMÉNY |
| - | </ | + | ipv4 tcp $PUBLIC_IPV4 80 $guest_ipv4 80 |
| + | ipv4 tcp $PUBLIC_IPV4 2222 $guest_ipv4 22 | ||
| + | ipv6 tcp $PUBLIC_IPV6 80 $guest_ipv6 80 | ||
| + | ipv6 tcp $PUBLIC_IPV6 2222 $guest_ipv6 22 | ||
| + | EOF | ||
| - | Na vzdáleně spuštěné instanci lze zahájit instalaci, ale nefunguje mi zobrazení instalátoru pomocí výchozího spice. Protože mi přijde krajně nepraktické přepínat libvirt na VNC, takže doporučuju pro instalaci a další používání spustit virt-manager lokálně a přidat cestu k serveru. | + | virsh --connect " |
| - | + | virsh --connect " | |
| - | + | systemctl restart libvirtd.service | |
| - | ===== KVM na Debian 8 ===== | + | if ! virsh --connect " |
| - | + | | grep -Fx "$network" | |
| - | Tento návod je prováděn na Debianu 8. Měl by být plně funkční také na CentOS (s jinými příkazy viz. výše). Pokoušel jsem se KVM rozchodit i na Ubuntu 14.04, ale tam bohužel marně. | + | virsh --connect " |
| - | + | fi | |
| - | Pokud používáte Windows, je potřeba nainstalovat a zapnout XMing (pokud budete chtít minimálně virtuál nainstalovat a nastavit skrz grafické rozhraní jako já). Poté zapneme putty (nezapomeňte si zapnout XMing a zaškrtnout „Enable X11 forwarding“) a můžeme kouzlit. Stačí také přes "apt install xrdp" | + | " |
| - | + | virsh --connect " | |
| - | Začneme klasikou: | + | |
| - | + | ||
| - | <code shell> | + | |
| - | apt-get update | + | |
| - | apt-get upgrade | + | |
| </ | </ | ||
| - | Poté nainstalujeme libvirt knihovnu: | + | Další port přidáš |
| - | <code shell> | + | '' |
| - | apt-get install qemu-kvm libvirt-bin | + | HTTPS dostupné |
| - | apt-get install virt-manager | + | |
| - | </ | + | |
| - | Celkově mají tyto dva balíčky asi 320 MB. Dále je potřeba si někam na disk stáhnout image distribuce, kterou chcete do virtuálu nainstalovat. Já jsem instaloval Ubuntu server 14.04. Vyberte si adresář, | + | |
| - | <code shell> | + | |
| - | cd /home | + | |
| - | wget http://releases.ubuntu.com/ | + | |
| - | </ | + | |
| - | Zapněte virt-managera. | + | |
| - | <code shell> | + | |
| - | virt-manager | + | |
| - | </ | + | |
| - | Díky XMingu můžete teď na dálku z Windows nastavit a spustit instalaci virtuálního serveru uvnitř své VPS. Upozorňuji, | + | |
| - | < | + | |
| - | virsh -c qemu:///system net-start default | + | |
| - | virsh -c qemu:/// | + | |
| - | virsh -c qemu:/// | + | |
| - | virsh -c qemu:/// | + | |
| - | </ | + | |
| - | Pokud nechcete pokaždé zadávat přepínač -c pro příkazy virsh a používáte pouze lokální hypervisor, je potřeba v tomto souboru / | + | < |
| - | < | + | ipv4 tcp VPS_IPV4 8443 192.168.124.10 443 |
| - | uri_default = "qemu:/// | + | ipv6 tcp VPS_IPV6 8443 fd5f: |
| </ | </ | ||
| - | Poté příkazy virsh dále používáme již bez přepínače -c tedy následně: | + | Podporované protokoly jsou '' |
| - | <code shell> | + | odmítne dříve, než se změní aktivní pravidla. Po změně souboru pravidla |
| - | virsh net-start default | + | |
| - | virsh net-autostart default | + | |
| - | virsh net-list --all | + | |
| - | virsh list | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Konfigurace sítě KVM na Debian 8 ==== | + | |
| - | === * Routování veřejné IPv4 přes lokální rozsah do KVM virtuálu, lokální IPv4 u VPS === | + | |
| - | + | ||
| - | Tento návod byl otestován na VPS Debian 8 OpenVZ kontejneru, jako KVM virtuál byl použit systém Ubuntu 16.04.1 LTS x86_64. | + | |
| - | + | ||
| - | Máme pouze jednu veřejnou IPv4 adresu | + | |
| - | + | ||
| - | VPS má pouze privátní / lokální IPv4 adresu '' | + | |
| - | + | ||
| - | <note warning> | + | |
| - | </ | + | |
| - | Dále nakonfigurujte bridge '' | + | |
| - | Vytvořte tedy soubor '' | + | <code bash> |
| - | <code shell> | + | /etc/ |
| - | auto br0 | + | |
| - | iface br0 inet static | + | |
| - | address 172.16.20.12 | + | |
| - | netmask 255.255.255.255 | + | |
| - | bridge_ports venet0:0 | + | |
| - | bridge_stp on | + | |
| - | bridge_fd 0.0 | + | |
| - | dad-attempts 0 | + | |
| - | accept_ra 0 | + | |
| </ | </ | ||
| - | Vzhledem k tomu že OpenVZ již po této úpravě automaticky nevloží do ''/ | + | Port 2222 byl zvolen proto, aby SSH domény nekolidovalo s SSH samotné VPS. |
| - | <code shell> | + | Pravidla firewallu |
| - | auto venet0:0 | + | |
| - | iface venet0:0 inet static | + | |
| - | address 185.8.164.43 | + | |
| - | netmask 255.255.255.255 | + | |
| - | </ | + | |
| - | Soubor ''/ | + | ==== Privátní IPv4 na VPS a veřejné adresy v doméně ==== |
| - | Například pomocí | + | V tomto zapojení má VPS privátní IPv4 '' |
| - | <code shell> | + | '' |
| - | IP adresa: 172.16.20.13 | + | ''/ |
| - | Maska sítě: | + | VPS funguje ve vnitřní síti vpsFree.cz a na internet odchází přes NAT na našich |
| - | Brána: | + | routerech; veřejné adresy domény se v libvirt nepřekládají. |
| - | DNS servery: 37.205.9.100, | + | |
| - | </ | + | |
| - | A k danému rozhraní ještě | + | Pro IPv4 nejprve požádej podporu o přidělení privátní IPv4 '' |
| - | <code shell> | + | |
| - | IP adresa: | + | |
| - | Maska sítě: | + | |
| - | </code> | + | |
| - | Vrátíme se ke konfiguraci souboru | + | < |
| - | <code shell> | + | V části **Síť → Routované adresy** pak vyber veřejnou |
| - | auto venet0:0 | + | **Adresa**, privátní adresu VPS v poli **Přes** |
| - | iface venet0:0 inet static | + | adresa se tím nenastaví na žádném rozhraní uvnitř VPS; vpsAdminOS ji k VPS |
| - | address 185.8.164.43 | + | směruje přes privátní adresu. |
| - | netmask 255.255.255.255 | + | </vpsadmin-nav> |
| - | </code> | + | |
| - | Místo toho do souboru | + | < |
| + | Pro IPv6 použij další | ||
| + | k dispozici, a nastav její směrování přes adresu z běžné '' | ||
| + | máš směrovanou větší síť, například '' | ||
| + | samostatnou ''/ | ||
| + | bridge libvirt; například pro '' | ||
| + | '' | ||
| + | </ | ||
| - | Správný tvar pro privátní rozsah | + | Tok IPv4 paketů používá malou tranzitní síť pouze mezi VPS a doménou: |
| - | <code shell> | + | |
| - | up ip route add 172.16.20.0/ | + | |
| - | down ip route del 172.16.20.0/ | + | |
| - | </ | + | |
| - | Přidáme routování pro privátní / lokální IPv4 adresu KVM virtuálu na daný bridge tedy '' | + | < |
| - | < | + | internet → veřejná /32 → VPS → 192.168.123.1/30 |
| - | up ip route add 172.16.20.13 dev br0 | + | ↓ |
| - | down ip route del 172.16.20.13 dev br0 | + | 192.168.123.2/30 → veřejná /32 v doméně |
| - | up ip route add 185.8.164.43 dev br0 | + | |
| - | down ip route del 185.8.164.43 dev br0 | + | |
| </ | </ | ||
| - | Povolíme | + | V XML libvirt je veřejná IPv4 samostatná trasa přes tranzitní adresu domény. |
| - | <code shell> | + | Směrovaná IPv6 ''/ |
| - | post-up echo 1 > / | + | |
| - | post-up echo 1 > / | + | |
| - | dns-nameservers | + | |
| - | </ | + | |
| - | Nastavíme směrování portu 1022 pro SSH VPS (nezapomeňte nastavit také port 1022 u samotné služby SSH na VPS), abychom neztratili přístup k SSH u VPS, vhledem k tomu že síťový provoz bude zcela směrován jen na veřejnou IPv4 adresu KVM virtuálu. Do souboru ''/ | + | <code xml> |
| - | <code shell> | + | <network> |
| - | up iptables -t nat -A PREROUTING -p tcp --dport 1022 -d 185.8.164.43 -j DNAT --to 172.16.20.12 | + | < |
| - | up iptables -t nat -A POSTROUTING -p tcp --sport 1022 -d 172.16.20.12 -j SNAT --to 185.8.164.43 | + | <forward mode='open'/> |
| - | down iptables -t nat -D PREROUTING -p tcp --dport 1022 -d 185.8.164.43 -j DNAT --to 172.16.20.12 | + | <bridge name=' |
| - | down iptables -t nat -D POSTROUTING -p tcp --sport 1022 -d 172.16.20.12 -j SNAT --to 185.8.164.43 | + | < |
| + | < | ||
| + | < | ||
| + | | ||
| + | </ | ||
| </ | </ | ||
| - | Soubor ''/ | + | Na VPS musí být povolené |
| - | + | ||
| - | === * Lokální IPv4 adresa KVM virtuálu za NATem, veřejná IPv4 u VPS === | + | |
| - | + | ||
| - | Tento návod byl otestován na VPS Debian 8 OpenVZ kontejneru, jako KVM virtuál byl použit systém Ubuntu 16.04.1 LTS x86_64. | + | |
| - | + | ||
| - | Máme lokální IPv4 adresu '' | + | |
| - | + | ||
| - | VPS má vlastní veřejnou IPv4 adresu '' | + | |
| - | + | ||
| - | <note warning> | + | |
| - | + | ||
| - | Dále nakonfigurujte bridge '' | + | |
| - | Vytvořte tedy soubor ''/ | + | < |
| - | < | + | sysctl -w net.ipv4.ip_forward=1 |
| - | auto br0 | + | sysctl -w net.ipv6.conf.all.forwarding=1 |
| - | iface br0 inet static | + | |
| - | address 192.168.122.1 | + | |
| - | netmask 255.255.255.255 | + | |
| - | bridge_ports venet0:0 | + | |
| - | bridge_stp on | + | |
| - | bridge_fd 0.0 | + | |
| </ | </ | ||
| - | Do souboru | + | Následující skript vytvoří tuto síť a uloží forwarding do |
| - | <code shell> | + | ''/ |
| - | up ip route add 192.168.122.0/ | + | '' |
| - | down ip route del 192.168.122.0/ | + | adresou routované IPv6 ''/ |
| - | </ | + | |
| - | Povolíme předávání datagramů z jednoho síťového rozhraní na druhé (ip_forward) a nastavíme NAT a IP maškarádu mezi bridge '' | + | < |
| - | < | + | PUBLIC_IPV4=PUBLIC_IPV4 \ |
| - | post-up echo 1 > /proc/sys/ | + | IPV6_GATEWAY=ROUTED_IPV6_PREFIX:: |
| - | up iptables | + | |
| - | up iptables --append FORWARD --in-interface br0 -j ACCEPT | + | |
| </ | </ | ||
| - | Vzhledem k tomu že OpenVZ již po této úpravě automaticky nevloží do ''/ | + | Stejně jako u NAT se skript spouští při vytvoření sítě nebo změně adres. |
| - | <code shell> | + | Autostart sítě a nastavení v ''/ |
| - | auto venet0:0 | + | |
| - | iface venet0:0 inet static | + | |
| - | address 185.8.164.43 | + | |
| - | netmask 255.255.255.255 | + | |
| - | dns-nameservers | + | |
| - | </ | + | |
| + | <code bash> | ||
| + | # | ||
| + | set -euo pipefail | ||
| - | Soubor '' | + | : " |
| + | : " | ||
| - | Například pomocí '' | + | host_transit_ipv4=${HOST_TRANSIT_IPV4: |
| - | <code shell> | + | guest_transit_ipv4=${GUEST_TRANSIT_IPV4:-192.168.123.2} |
| - | IP adresa: 192.168.122.2 | + | connection=qemu:///system |
| - | Maska sítě: 255.255.255.0 | + | network=public-routed |
| - | Brána: 192.168.122.1 | + | forwarding_config=/ |
| - | DNS servery: 37.205.9.100, | + | xml=$(mktemp) |
| - | </ | + | trap 'rm -f " |
| + | export LC_ALL=C | ||
| + | network_uuid=$(virsh --connect " | ||
| + | uuid_element= | ||
| + | if [[ -n $network_uuid ]]; then | ||
| + | uuid_element=" | ||
| + | fi | ||
| + | cat >" | ||
| + | < | ||
| + | < | ||
| + | $uuid_element | ||
| + | <forward mode=' | ||
| + | <bridge name=' | ||
| + | <ip address=' | ||
| + | <ip family=' | ||
| + | <route family=' | ||
| + | | ||
| + | </ | ||
| + | EOF | ||
| - | Nyní je čas na nastavení směrování portů (port forwarding) pro dané služby na KVM virtuálu, které boudou na daných portech dostupné na veřejné IPv4 adrese VPS. Toto nastavení provedeme pomocí skriptu (tento skript je převzat a upraven dle oficiálního návodu k libvirt, zdroj [[https:// | + | if virsh --connect |
| - | + | | grep -Fx "$network" | |
| - | Vytvoříme tedy soubor ''/ | + | |
| - | <code shell> | + | |
| - | # | + | exit 1 |
| - | # used some from advanced script to have multiple ports: use an equal number of guest and host ports | + | |
| - | + | ||
| - | # Update the following variables to fit your setup | + | |
| - | Guest_name=' | + | |
| - | Guest_ipaddr=' | + | |
| - | Guest_port=( ' | + | |
| - | Host_ipaddr=' | + | |
| - | Host_port=( | + | |
| - | + | ||
| - | length=$(( ${# | + | |
| - | if [ "${1}" | + | |
| - | if [ "${2}" | + | |
| - | for i in `seq 0 $length`; do | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | fi | + | |
| - | if [ "${2}" | + | |
| - | for i in `seq 0 $length`; do | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | fi | + | |
| fi | fi | ||
| - | </ | ||
| - | |||
| - | V souboru ještě před uložením skriptu ''/ | ||
| - | <code shell> | ||
| - | Guest_name=' | ||
| - | Guest_ipaddr=' | ||
| - | Guest_port=( ' | ||
| - | Host_ipaddr=' | ||
| - | Host_port=( | ||
| - | </ | ||
| - | V příkladu výše, se směruje port 80 a 443 pro webserver na KVM virtuálu, z veřejné IPv4 adresy VPS (port 80 a 443) na lokální IPv4 adresu (port 80 a 443) KVM virtuálu. Pokud chceme mít také přístup na SSH u KVM virtuálu, je třeba doplnit také dané porty pro SSH na KVM virtuálu (pozor na to , aby port pro SSH nebyl stejný jako je aktuálně SSH u VPS). Vstupní a výstupní port samozřejmě nemusí být stejný. | + | install -d -m 0755 "$(dirname " |
| + | cat >" | ||
| + | net.ipv4.ip_forward = 1 | ||
| + | net.ipv6.conf.all.forwarding = 1 | ||
| + | EOF | ||
| + | sysctl --quiet --load " | ||
| - | Soubor ''/ | + | virsh --connect " |
| - | <code shell> | + | virsh --connect " |
| - | chmod +x / | + | virsh --connect " |
| + | virsh --connect " | ||
| </ | </ | ||
| - | V tuto chvíli | + | Pokud je síť již aktivní, skript ji nezmění. Vypni připojené domény, zastav |
| + | síť příkazem '' | ||
| + | opět zapni. Skript zachová UUID existující sítě. | ||
| - | === * Routování veřejné IPv4 do KVM virtuálu, veřejná IPv4 u VPS === | + | Doménu připoj k '' |
| + | následující konfiguraci | ||
| + | '' | ||
| + | skutečnými hodnotami: | ||
| - | Tento návod byl otestován na VPS Debian 8 OpenVZ kontejneru, jako KVM virtuál byl použit systém Ubuntu 16.04.1 LTS x86_64. | + | <code conf> |
| + | auto ens3 | ||
| + | iface ens3 inet static | ||
| + | address 192.168.123.2/30 | ||
| + | up ip address add PUBLIC_IPV4/ | ||
| + | up ip route replace default via 192.168.123.1 src PUBLIC_IPV4 | ||
| + | down ip address del PUBLIC_IPV4/ | ||
| - | Máme veřejnou IPv4 adresu '' | + | iface ens3 inet6 static |
| - | + | address | |
| - | VPS má vlastní veřejnou IPv4 adresu '' | + | |
| - | + | ||
| - | <note warning> | + | |
| - | + | ||
| - | Dále nakonfigurujte bridge '' | + | |
| - | + | ||
| - | Vytvořte tedy soubor ''/ | + | |
| - | <code shell> | + | |
| - | auto br0 | + | |
| - | iface br0 inet static | + | |
| - | address | + | |
| - | netmask 255.255.255.255 | + | |
| - | bridge_ports venet0:0 | + | |
| - | bridge_stp on | + | |
| - | bridge_fd 0.0 | + | |
| - | dad-attempts 0 | + | |
| - | accept_ra 0 | + | |
| </ | </ | ||
| - | Do souboru | + | '' |
| + | VPS. Povol jen provoz, který má být doméně dostupný, a nezapomeň na pravidla | ||
| + | pro IPv4 i IPv6. Veřejná IPv4 je nakonfigurovaná pouze v doméně. IPv6 brána a | ||
| + | adresy domén jsou z druhé, směrované ''/ | ||
| + | jen adresa z její běžné | ||
| + | NAT. | ||
| - | Správný tvar pro veřejný rozsah k dané veřejné IPv4 adrese nalezneme ve vpsAdminu [[https:// | + | ===== Instalační ISO na NFS ===== |
| - | <code shell> | + | |
| - | up ip route add 185.8.164.0/ | + | |
| - | down ip route del 185.8.164.0/ | + | |
| - | </ | + | |
| - | Přidáme routování pro veřejnou IPv4 adresu KVM virtuálu | + | Instalační ISO je bezpečnější nejprve zkopírovat na lokální dataset. U staršího |
| - | <code shell> | + | NFSv3 exportu bez funkčního síťového zamykání může QEMU při čekání |
| - | up ip route add 185.8.164.43 dev br0 | + | uvíznout nebo skončit chybou jako '' |
| - | down ip route del 185.8.164.43 dev br0 | + | '' |
| - | </ | + | |
| - | Povolíme | + | Pouze pro jednoho klienta a pouze pro instalační ISO připojené pro čtení lze |
| - | <code shell> | + | použít |
| - | post-up echo 1 > / | + | |
| - | post-up echo 1 > / | + | |
| - | dns-nameservers | + | |
| - | </ | + | |
| - | Soubor '' | + | <code bash> |
| + | #!/usr/bin/env bash | ||
| + | set -euo pipefail | ||
| - | V systému KVM virtuálu nakonfigurujeme jeho síť dle vzoru se správnými parametry (veřejnou IPv4 adresu pro KVM virtuál jsme si již vybrali v předchozím kroku, zadáme stejnou a brána je IPv4 adresa VPS již zvolená pro bridge '' | + | : " |
| - | <code shell> | + | : " |
| - | IP adresa: 185.8.164.43 | + | |
| - | Maska sítě: 255.255.255.255 | + | |
| - | Brána: 185.8.164.36 | + | |
| - | DNS servery: | + | |
| - | </ | + | |
| - | A je hotovo. | + | mountpoint=${ISO_MOUNTPOINT: |
| + | install -d -m 0755 " | ||
| + | mount -t nfs -o ro, | ||
| + | " | ||
| - | === * Routování veřejné IPv6 do KVM virtuálu, veřejná IPv6 u VPS === | + | findmnt --noheadings --output FSTYPE,OPTIONS --target " |
| - | + | ||
| - | Tento návod byl otestován na VPS Debian 8 OpenVZ kontejneru, jako KVM virtuál byl použit systém Ubuntu 16.04.1 LTS x86_64. | + | |
| - | + | ||
| - | Máme veřejnou IPv6 adresu '' | + | |
| - | + | ||
| - | VPS má vlastní veřejnou IPv6 adresu '' | + | |
| - | <note warning> | + | |
| - | Následující návod předpokládá již provedení kroků konfigurace IPv4 pomocí jednoho z následujících postup v těchto odstavcích: | + | |
| - | + | ||
| - | * „Routování veřejné IPv4 přes lokální rozsah do KVM virtuálu, lokální IPv4 u VPS“, | + | |
| - | + | ||
| - | * „Lokální IPv4 adresa KVM virtuálu za NATem, veřejná IPv4 u VPS“ či | + | |
| - | + | ||
| - | * „Routování veřejné IPv4 do KVM virtuálu, veřejná IPv4 u VPS“ | + | |
| - | + | ||
| - | tohoto návodu výše. | + | |
| - | + | ||
| - | Bez těchto předchozích kroků nelze následující návod pro IPv6 použít v této formě! | + | |
| - | </ | + | |
| - | + | ||
| - | Do existujícího souboru ''/ | + | |
| - | <code shell> | + | |
| - | iface br0 inet6 static | + | |
| - | address 2a03: | + | |
| - | netmask 128 | + | |
| - | autoconf 0 | + | |
| - | dad-attempts 0 | + | |
| - | accept_ra 0 | + | |
| </ | </ | ||
| - | Do souboru | + | '' |
| - | + | zámky. Nikdy jej nepoužívej pro zapisovatelný nebo sdílený disk virtuálního | |
| - | Správný tvar pro rozsah IPv6 nalezneme ve vpsAdminu [[https:// | + | stroje. U NFSv4 je zamykání součástí protokolu |
| - | + | [[https://man7.org/linux/man-pages/man5/nfs.5.html|nfs(5)]]. | |
| - | Do souboru ''/ | + | |
| - | <code shell> | + | |
| - | up route -A inet6 add 2a03: | + | |
| - | down route -A inet6 del 2a03: | + | |
| - | up route -A inet6 add 2a03: | + | |
| - | down route -A inet6 del 2a03: | + | |
| - | </ | + | |
| - | + | ||
| - | Povolíme předávání datagramů z jednoho | + | |
| - | <code shell> | + | |
| - | post-up echo 1 > / | + | |
| - | dns-nameservers 2a01: | + | |
| - | </ | + | |
| - | + | ||
| - | V systému KVM virtuálu nakonfigurujeme jeho síť dle vzoru se správnými parametry (veřejnou IPv6 adresu pro KVM virtuál jsme si již vybrali v předchozím kroku, zadáme stejnou a brána je IPv6 adresa již zvolená | + | |
| - | <code shell> | + | |
| - | IP adresa: | + | |
| - | Maska sítě: | + | |
| - | Brána: | + | |
| - | DNS servery: | + | |
| - | </ | + | |
| - | + | ||
| - | Soubor ''/ | + | |
| - | + | ||
| - | ===== KVM na Debian 9 ===== | + | |
| - | Nefunguje více info v https://lists.vpsfree.cz/pipermail/community-list/2017-July/004532.html | + | |
| - | ===== Kontakty ===== | + | |
| - | < | ||
| - | pavlix (CentOS, Debian) | ||
| - | jirutka (Alpine Linux) | ||
| - | </ | ||