Uživatelské nástroje

Nástroje pro tento web


navody:vps:kvm

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
navody:vps:kvm [2018/07/30 11:21] sweznavody:vps:kvm [2026/08/17 11:09] (aktuální) – Napojení na revizi zdroje a testy virtualizace aither
Řádek 1: Řádek 1:
 <page>manuals:vps:kvm</page> <page>manuals:vps:kvm</page>
-====== 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.+<kb-managed 
 +  source="contract/pages/navody-vps-kvm.txt" 
 +  test="kb/kvm#*" 
 +/>
  
-Nejprve je potřeba ve vpsAdminu, v detailu vaší VPS, zapnout následující vlastnosti:+====== 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 není jiná možnost než mít disky pro KVM virtuály v souborech (images). Doporučujeme k tomu vytvořit nový (sub)dataset, **vypnout v něm kompresi** a nastavit velikost bloku (Record size) na 65536 B. Vypnutí komprese je velmi důležitéjinak vám bude image bobtnat bobtnat, přes deklarovanou velikost image, dokud narazí na kvótu datasetu! Pro optimální výkon vytvářejte „raw“ image.+vpsAdminOS provozuje VPS v kontejnerech, nikoli ve virtuálních strojích. KVM 
 +uvnitř VPS proto není vnořená virtualizace: virtuální stroje používají 
 +hardwarovou virtualizaci fyzického nodu přímo. 
 +Tento návod používá aktuální šablonu **Debian (latest)**, libvirt systémové 
 +spojení ''qemu:///system''.
  
 +<vpsadmin-nav id="vps.features.open">
 +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.
 +</vpsadmin-nav>
  
-===== KVM na Alpine Linuxu  =====+{{:cs:screenshots:vpsadmin:vps-details:feature-settings.png?direct|Výchozí funkce VPS}}
  
-Připravu hypervizoru lze provést automatizovaně pomocí [[http://docs.ansible.com/ansible/latest/index.html|Ansible]].+Nainstaluj QEMU, libvirt a ''virt-install'' z Debianu:
  
-[[https://gist.github.com/HalisCz/192955c64c255ee15cc647f6efabd020|Na GitHubu]] jsou dle níže uvedeného návodu automatizovány zatím tyto sekce: +<code bash> 
-  * [[navody:vps:kvm#instalace_balicku_a_konfigurace_hypervizoru|Instalace balíčků a konfigurace hypervizoru]] - tag ''instalace'' +#!/usr/bin/env bash 
-  * [[navody:vps:kvm#nastaveni_iptables|Nastavení iptables]] - tag ''nastaveni-iptables''+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 qemu:///system version
- +
-<code shell> +
-apk update +
-apk add qemu-system-x86_64 qemu-openrc qemu-img bridge iptables ip6tables+
 </code> </code>
  
-Nastavte potřebná práva pro přístup ke KVM a TUN (do skupin //kvm// a //netdev// by měl patřit uživatel //qemu//, pod kterým bude běžet vytvořený virtuál):+Používej systémové spojení ''qemu:///system''. Pro vzdálenou správu použij 
 +libvirt přes SSH, například ''qemu+ssh://root@HOST/system''a chraň SSH 
 +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 /dev/net/tun +
-chmod g+rw /dev/net/tun +
-</code>+
  
-Nakonfigurujte bridge pro Qemu/KVM virtuály; vytvořte soubor ///etc/network/interfaces.tail// (IP adresu si samozřejmě můžete zvolit libovolnou z privátního rozsahu):+Pro obrazy disků použij samostatný [[navody:vps:datasety|subdataset]]Jeho ZFS 
 +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="datasets.edit.open">V detailu VPS u kořenového datasetu použij akci **Upravit** a zmenši jeho referenční kvótu o prostor určený pro obrazy.</vpsadmin-nav> 
-auto br0 +  * <vpsadmin-nav id="datasets.create.open">Pomocí **Vytvořit dataset** vytvoř subdataset ''vm-images'' s uvolněnou kapacitou.</vpsadmin-nav> 
-iface br0 inet static +  <vpsadmin-nav id="datasets.mount.open">U datasetu ''vm-images'' použij **Mount** a připoj jej do VPS jako ''/srv/libvirt/images''.</vpsadmin-nav>
-     pre-up brctl addbr br0 +
-     address 172.17.1.1 +
-     netmask 255.255.255.+
-     post-down brctl delbr br0 +
-</code>+
  
-Jelikož OpenVZ poněkud neohrabaně přepisuje soubor ///etc/network/interfaces// (proto také konfiguraci bridge idáváme do //interfaces.tail//, tak nejjistější je v tuto chvíli kontejner restartovat:/+Například z běžné kapacity 120 GiB můžeš ponechat 20 GiB kořenovému datasetu 
 +a 100 GiB idělit datasetu ''vm-images''. Prvnímu disku virtuálního stroje pak 
 +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:zalohy|snapshotuje]] odděleně od kořenového datasetu 
 +VPS.
  
-<code shell> +{{:cs:screenshots:vpsadmin:vps-details:datasets.png?direct|Datasety VPS}}
-echo "allow br0" > /etc/qemu/bridge.conf +
-chown root:qemu /etc/qemu/bridge.conf +
-chmod 0640 /etc/qemu/bridge.conf +
-</code>+
  
-Nastavte IP maškarádu pro ístup Qemu/KVM virtuálů ven do veřejného Internetu.+Připojený adresář idej do libvirt jako trvalý storage pool:
  
-Pokud už máte nakonfigurované iptables, tak jen přidejte pravidlo:+<code bash> 
 +#!/usr/bin/env bash 
 +set -euo pipefail
  
-<code> +virsh --connect qemu:///system pool-define-as \ 
-iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -o br0 -j MASQUERADE+  vm-images dir --target /srv/libvirt/images 
 +virsh --connect qemu:///system pool-start vm-images 
 +virsh --connect qemu:///system pool-autostart vm-images 
 +virsh --connect qemu:///system pool-info vm-images
 </code> </code>
  
-V opačném případě můžete postupovat např. podle odstavce [[#nastaveni_iptables|Nastavení iptables]].+Disky pak vytvářej prostřednictvím libvirt, ''virt-install'' nebo 
 +''virt-manager'' v poolu ''vm-images''.
  
 +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í
 +''recordsize=128K'' určuje maximální velikost záznamu souboru; ZFS podle potřeby
 +používá i menší záznamy. Změna ''recordsize'' se projeví pouze u nově
 +vytvořených souborů.
  
-==== Vytvoření a spuštění virtuálu ====+Pro obrazy na ZFS je vhodnou výchozí volbou formát ''raw'', protože nepřidává 
 +další copy-on-write vrstvu. ''qcow2'' použij, pokud potřebuješ jeho backing 
 +files, interní snapshoty nebo jiné funkce obrazového formátu.
  
-V tomto návodu předpokládám použití [[https://github.com/jirutka/qemu-openrc|qemu-openrc]] – OpenRC init skript pro startování Qemu/KVM. Na Alpine samozřejmě můžete používat i libvirtale opravdu chcete a potřebujete jeho neohrabané XML konfiguráky a/nebo klikátka nad ním…? ;) Qemu-openrc je výrazně jednodušší a transparentnější řešeníKaždý virtuál je reprezentovaný init skriptem, stejně jako ostatní programy, můžete deklarativně nastavovat závislosti mezi virtuály atd.+Podrobnosti k ladění podle zátěže popisuje [[https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Workload%20Tuning.html|OpenZFS Workload Tuning]], formáty obrazů pak [[https://www.qemu.org/docs/master/system/images|dokumentace QEMU]].
  
-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 -/var/lib/qemu/myvirt/ +| 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í přesměrování portů a provoz prochází NAT44 i NAT66| 
-qemu-img create -f raw /var/lib/qemu/myvirt/disk0.raw 5G +| Směrované veřejné adresy | Veřejná IPv4 ''/32'' a adresy ze samostatné IPv6 ''/64'' | Doména je dostupná přímo, bez NAT a bez překladu portů| Vyžaduje privátní IPv4 na VPS, další směrovanou IPv6 síť a pečlivě nastavený firewall|
-chown qemu:qemu /var/lib/qemu/myvirt/disk0.raw +
-chmod 0600 /var/lib/qemu/myvirt/disk0.raw +
-</code>+
  
-Zkopírujte výchozí konfigurák /etc/conf.d/qemu do /etc/conf.d/qemu.myvirt a upravte dle potřeby:+NAT je obvykle jednodušší pro jednu nebo několik domén s malým počtem 
 +zveřejněných služebSmě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 /etc/conf.d +
-cp qemu qemu.myvirt +
-vi qemu.myvirt  # read comments and edit +
-</code>+
  
-Zejména tedy přidejte ipravený image:+Veřejná IPv4 ''/32'' i IPv6 ''/64'' zůstanou na VPS. Doména dostane 
 +''192.168.124.10/24'' a ''fd5f:6d2e:9c4a:124::10/64'' ze sítě 
 +''dualstack-nat''. Libvirt ekládá odchozí IPv4 pomocí NAT44 a IPv6 pomocí 
 +NAT66. Výchozí síť ''default'' v běžné instalaci libvirt obvykle obsahuje jen 
 +IPv4 a používá ''192.168.122.0/24'', proto zde definujeme vlastní 
 +dvouprotokolovou síť s odlišnou IPv4 podsítí. NAT66 se v XML zapíná pomocí 
 +''<nat ipv6='yes'/>''; podrobnosti jsou v 
 +[[https://libvirt.org/formatnetwork.html|dokumentaci formátu sítí libvirt]].
  
-<code shell> +ULA ''fd5f:6d2e:9c4a::/48'' je příklad pro samostatnou instalaciPokud budeš 
-disk1_file="/var/lib/qemu/myvirt/disk0.raw" +více privátních sítí později propojovat pomocí VPN nebo směrování, vytvoř pro 
-disk1_format="raw" +každou z nich vlastní náhodný ULA ''/48'' a změň ''HOST_IPV6''
-</code>+''GUEST_IPV6'' na adresy ze stejné ''/64''.
  
-A zřejmě také instalační CD některé distribuce, které jste si předem stáhli:+Podstatnou část definice sítě tvoří následující XML:
  
-<code shell+<code xml
-cdrom0_file="/var/lib/qemu/alpine-virt-3.4.1-x86_64.iso"+<network> 
 +  <name>dualstack-nat</name> 
 +  <forward mode='nat'> 
 +    <nat ipv6='yes'/
 +  </forward> 
 +  <bridge name='virbr-nat'/> 
 +  <ip address='192.168.124.1' prefix='24'/> 
 +  <ip family='ipv6' address='fd5f:6d2e:9c4a:124::1' prefix='64'/> 
 +</network>
 </code> </code>
  
-Vytvořte symlink pro init skript spusťte myvirt:+Vytvořenou doménu připoj k ''dualstack-nat'', například volbou 
 +''--network network=dualstack-nat,model=virtio'' ve ''virt-install''. V doméně 
 +nastav stabilní adresy brány:
  
-<code shell+<code conf
-cd /etc/init.d +auto ens3 
-ln -s qemu qemu.myvirt+iface ens3 inet static 
 +    address 192.168.124.10/24 
 +    gateway 192.168.124.1
  
-rc-service qemu.myvirt start+iface ens3 inet6 static 
 +    address fd5f:6d2e:9c4a:124::10/64 
 +    gateway fd5f:6d2e:9c4a:124::1
 </code> </code>
  
-<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 na síťové kartě spadne ve virtuálu sít, skuste použít driver e1000 místo výchozího virtio-net-pci:+forwardu. Pro web na IPv4 jsou podstatou například tyto dva příkazy:
  
-<code shell>net0_device="e1000"</code> +<code bash
- +iptables -t nat -I PREROUTING 1 -p tcp -d VPS_IPV4 --dport 80 \ 
-stabilitu je možno otestovat iperf-em, na testovanem stroji: +  -j DNAT --to-destination 192.168.124.10:80 
- +iptables -t filter -I FORWARD 1 -p tcp -d 192.168.124.10 --dport 80 \ 
-<code shell>iperf -s</code> +  -j ACCEPT
- +
-na hostiteli pak+
-<code shell> +
-iperf -c 172.17.1.-P 20+
 </code> </code>
-</note> 
  
-==== Nastavení iptables ====+Stejná pravidla je potřeba vytvořit i pomocí ''ip6tables'' pro IPv6. Ručně 
 +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/MaxKellermann/ferm|ferm]]), doporučuji vyjít [[https://gist.github.com/jirutka/3742890|připravené šablony pravidel]]. Tyto jsou přímo ve formátu iptables, který je možný načíst pomocí iptables-restore.+Ulož jej například jako ''/root/configure-nat-port-forwards.sh'' a spusť 
 +s jednou veřejnou IPv4 a jednou adresou IPv6 ''/64'' nakonfigurovanou na VPS:
  
-Stáhněte upravenou šablonu pravidel s přidanou maškarádou pro náš bridge do /etc/iptables: +<code bash
- +PUBLIC_IPV4=VPS_IPV4 PUBLIC_IPV6=VPS_IPV6 \ 
-<code shell+  /root/configure-nat-port-forwards.sh
-rmdir /etc/iptables +
-wget -O /etc/iptables https://gist.githubusercontent.com/jirutka/3742890/raw/c9f6bdbfcf597578e562c92ea1e256a9ebcf3a2c/rules-both.iptables+
 </code> </code>
  
-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.
  
-<code shell+<code bash
-# /etc/conf.d/iptables+#!/usr/bin/env bash 
 +set -euo pipefail
  
-IPTABLES_SAVE="/etc/iptables+"${PUBLIC_IPV4:?set PUBLIC_IPV4 to the VPS public IPv4 address}
-#SAVE_RESTORE_OPTIONS="-c" +"${PUBLIC_IPV6:?set PUBLIC_IPV6 to a public IPv6 address of the VPS}"
-SAVE_ON_STOP="no" +
-IPFORWARD="yes" +
-</code>+
  
-…a /etc/conf.d/ip6tables (IPv6):+guest_ipv4=${GUEST_IPV4:-192.168.124.10} 
 +guest_ipv6=${GUEST_IPV6:-fd5f:6d2e:9c4a:124::10} 
 +host_ipv4=${HOST_IPV4:-192.168.124.1} 
 +host_ipv6=${HOST_IPV6:-fd5f:6d2e:9c4a:124::1} 
 +connection=qemu:///system 
 +network=dualstack-nat 
 +hook=/etc/libvirt/hooks/network.d/50-port-forwards 
 +config=/etc/libvirt/port-forwards.conf 
 +xml=$(mktemp) 
 +trap 'rm -f "$xml"' EXIT
  
-<code shell+network_uuid=$(virsh --connect "$connection" net-uuid "$network" 2>/dev/null || :) 
-/etc/conf.d/ip6tables+uuid_element= 
 +if [[ -n $network_uuid ]]; then 
 +  uuid_element="  <uuid>$network_uuid</uuid>" 
 +fi 
 +cat >"$xml" <<EOF 
 +<network> 
 +  <name>$network</name> 
 +$uuid_element 
 +  <forward mode='nat'> 
 +    <nat ipv6='yes'/
 +  </forward> 
 +  <bridge name='virbr-nat' stp='on' delay='0'/> 
 +  <ip address='$host_ipv4' prefix='24'> 
 +    <dhcp> 
 +      <range start='192.168.124.100' end='192.168.124.254'/
 +    </dhcp> 
 +  </ip> 
 +  <ip family='ipv6' address='$host_ipv6' prefix='64'/> 
 +</network> 
 +EOF
  
-IP6TABLES_SAVE="/etc/iptables+if virsh --connect "$connectionnet-list --name \ 
-SAVE_RESTORE_OPTIONS="-T filter+  | grep -Fx "$network" >/dev/null; then 
-SAVE_ON_STOP="no+  printf '%s is active. Shut down its attached domains, run ' "$network>&2 
-IPFORWARD="yes" +  printf 'virsh net-destroy %s, then rerun this script.\n' "$network" >&2 
-</code>+  exit 1 
 +fi
  
-Spusťte iptables a ip6tables a přidejte je do runlevel boot:+install -d -m 0755 /etc/libvirt/hooks/network.d 
 +install -d -m 0755 /etc/libvirt 
 +cat >"$hook" <<'HOOK' 
 +#!/usr/bin/env bash 
 +set -euo pipefail
  
-<code shell> +PATH=/usr/sbin:/usr/bin:/sbin:/bin 
-rc-service iptables start +network=${1-} 
-rc-service ip6tables start +action=${2-} 
-rc-update add iptables boot +config=/etc/libvirt/port-forwards.conf 
-rc-update add ip6tables boot +nat_chain=VPSFREE_KVM_DNAT 
-</code>+filter_chain=VPSFREE_KVM_FWD
  
 +[[ $network == dualstack-nat ]] || exit 0
 +exec 9>/run/lock/vpsfree-kvm-port-forwards.lock
 +flock 9
  
-===== KVM na CentOS 7  =====+delete_jumps() { 
 +  local tool 
 +  for tool in iptables ip6tables; do 
 +    while "$tool" -w -t nat -C PREROUTING -j "$nat_chain" 2>/dev/null; do 
 +      "$tool" -w -t nat -D PREROUTING -j "$nat_chain" 
 +    done 
 +    while "$tool" -w -t filter -C FORWARD -j "$filter_chain" 2>/dev/null; do 
 +      "$tool" -w -t filter -D FORWARD -j "$filter_chain" 
 +    done 
 +  done 
 +}
  
-<note warning> +delete_chains() { 
-Tento návod platí pouze pro CentOS 7.1. Na CentOS 7.aktuálně nefunguje interní síť mezi VPS a VM. Použijte buď CentOS 7.nebo Debian 8, než bude tento problém vyřešen.+  local tool 
 +  for tool in iptables ip6tables; do 
 +    if "$tool" -w -t nat -S "$nat_chain" >/dev/null 2>&1; then 
 +      "$tool" -w -t nat -F "$nat_chain" 
 +      "$tool" -w -t nat -X "$nat_chain" 
 +    fi 
 +    if "$tool" -w -t filter -S "$filter_chain" >/dev/null 2>&1; then 
 +      "$tool" -w -t filter -F "$filter_chain" 
 +      "$tool" -w -t filter -X "$filter_chain" 
 +    fi 
 +  done 
 +}
  
-2018-03-26 (phatinaPripojenie k libvirtd zlyhava: An error occurred, but the cause is unknown. +cleanup() { 
-</note>+  delete_jumps 
 +  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ě aktualizovatnakonfigurovat a nainstalovat potřebný software. Z důvodu povolení iptables je potřeba nakonfigurovat nebo vypnout firewalld.+  perl -MSocket=AF_INET,AF_INET6,inet_pton -e ' 
 +    my ($family, $address) = @ARGV; 
 +    my $af = $family eq "ipv4" ? AF_INET : AF_INET6; 
 +    exit(defined(inet_pton($af, $address)) ? 0 : 1); 
 +  ' "$family" "$address" 
 +}
  
-<code shell> +if [[ $action == stopped ]]; then 
-yum group install virtualization-host-environment +  cleanup 
-yum install virt-manager xauth +  exit 0 
-systemctl enable libvirtd +fi 
-systemctl disable firewalld +[[ $action == started || $action == reconnect ]] || exit 0
-reboot +
-</code>+
  
-==== 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 == ipv4 || $family == ipv6 ]] || { 
 +    printf 'Invalid address family in %s: %s\n' "$config" "$family" >&
 +    exit 1 
 +  } 
 +  [[ $protocol == tcp || $protocol == udp ]] || { 
 +    printf 'Invalid protocol in %s: %s\n' "$config" "$protocol" >&
 +    exit 1 
 +  } 
 +  for address in "$public_ip" "$guest_ip"; do 
 +    valid_ip_address "$family" "$address" || { 
 +      printf 'Invalid %s address in %s: %s\n' \ 
 +        "$family" "$config" "$address" >&
 +      exit 1 
 +    } 
 +  done 
 +  [[ $public_port =~ ^[0-9]{1,5}$ && $guest_port =~ ^[0-9]{1,5}$ ]] || { 
 +    printf 'Invalid port in %s\n' "$config" >&
 +    exit 1 
 +  } 
 +  public_port=$((10#$public_port)) 
 +  guest_port=$((10#$guest_port)) 
 +  ((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' "$config" >&
 +    exit 1 
 +  } 
 +  entries+=("$family|$protocol|$public_ip|$public_port|$guest_ip|$guest_port"
 +done <"$config"
  
-MotivaceKdyž pracujete na pomalém připojení (což O2 ADSL na vsi bezpochyby je), potřebujete minimalizovat datové toky přes váš pracovní počítač. Lokální virt-manager by stahoval minimálně kernel a initramdisk po relativně pomalém downloadu a typicky po ukrutně pomalém uploadu nahrával na hostitelský kontejner.+cleanup 
 +for tool in iptables ip6tables; do 
 +  "$tool" -w -t nat -N "$nat_chain" 
 +  "$tool" -w -t filter -N "$filter_chain" 
 +done 
 +for entry in "${entries[@]}"; do 
 +  IFS='|' read -r family protocol public_ip public_port guest_ip guest_port \ 
 +    <<<"$entry" 
 +  tool=iptables 
 +  destination="$guest_ip:$guest_port" 
 +  if [[ $family == ipv6 ]]; then 
 +    tool=ip6tables 
 +    destination="[$guest_ip]:$guest_port" 
 +  fi 
 +  "$tool" -w -t nat -A "$nat_chain" -"$protocol" -d "$public_ip"
 +    --dport "$public_port" -j DNAT --to-destination "$destination" 
 +  "$tool" -w -t filter -A "$filter_chain" -"$protocol" -d "$guest_ip"
 +    --dport "$guest_port" -j ACCEPT 
 +done 
 +for tool in iptables ip6tables; do 
 +  "$tool" -w -t nat -I PREROUTING 1 -j "$nat_chain" 
 +  "$tool" -w -t filter -I FORWARD 1 -j "$filter_chain" 
 +done 
 +HOOK 
 +chmod 0755 "$hook"
  
-<code shell+cat >"$config" <<EOF 
-ssh root@your-host-name -Y virt-manager +# RODINA PROTOKOL VEŘEJNÁ_IP VEŘEJNÝ_PORT IP_DOMÉNY PORT_DOMÉNY 
-</code>+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 "$connection" net-define "$xml" 
- +virsh --connect "$connection" net-autostart "$network" 
- +systemctl restart libvirtd.service 
-===== KVM na Debian 8  ===== +if ! virsh --connect "$connection" net-list --name \ 
- +  | grep -Fx "$network>/dev/null; then 
-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 "$connection" net-start "$network" 
- +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 xrdpna server nainstalovat podporu remote desktop a od té doby už se z Windows připojovat nativním klientem Remote desktop (mstsc). +"$hook" "$network" started begin 
- +virsh --connect "$connection" net-dumpxml "$network"
-Začneme klasikou: +
- +
-<code shell> +
-apt-get update +
-apt-get upgrade+
 </code> </code>
  
-Poté nainstalujeme libvirt knihovnu: +Další port přidáš do ''/etc/libvirt/port-forwards.conf'' ve tvaru 
-<code shell> +''RODINA PROTOKOL VEŘEJNÁ_IP VEŘEJNÝ_PORT IP_DOMÉNY PORT_DOMÉNY''Například 
-apt-get install qemu-kvm libvirt-bin +HTTPS dostupné na portu 8443 idáš pro oba protokoly takto:
-apt-get install virt-manager +
-</code> +
-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ář, do kterého chcete image stáhnout, a pomocí ''wget'' stáhněte ISO image. +
-<code shell> +
-cd /home +
-wget http://releases.ubuntu.com/14.04.3/ubuntu-14.04.3-server-amd64.iso +
-</code> +
-Zapněte virt-managera+
-<code shell> +
-virt-manager +
-</code> +
-Díky XMingu můžete teď na dálku z Windows nastavit a spustit instalaci virtuálního serveru uvnitř své VPS. Upozorňuji, že pod X11 nefunguje spice displej, takže pokud chcete grafické rozhraní i instalaci virtuálu, je potřeba to v nastavení přepnout na „Display VNC“ a restartnout virtuál. Pokud to uděláte a server restartnete, může ztratit informaci o tom, že byl připojen .iso image pro instalaci, takže musíte opět do nastavení do záložky „CD-ROM“ a tam v „Source-path“ nastavit znova .iso image pro instalaci. Pokud vytvoření KVM mašiny selže s hláškou "Could not start virtual network "default": Unable to set bridge virbr0 forward_delay: Operation not permitted", pak si ve VPS adminu povolte "TUN/TAP". Poté již jen nainstalujte zvolený Linux. Nakonec už zbývá jen na vaší VPS udělat správný portforwarding, aby jste se k virtuálu skrz VPS dostali z venku. Pokud budete chtít používat příkazy virsh, např. pro start a autostart sítě "default", používejte přepínač -c, např.  +
-<code> +
-virsh -c qemu:///system net-start default +
-virsh -c qemu:///system net-autostart default +
-virsh -c qemu:///system net-list --all +
-virsh -c qemu:///system list +
-</code>+
  
-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 /etc/libvirt/libvirt.conf odkomentovat následující příkaz: +<code conf
-<code shell+ipv4 tcp VPS_IPV4 8443 192.168.124.10 443 
-uri_default = "qemu:///system"+ipv6 tcp VPS_IPV6 8443 fd5f:6d2e:9c4a:124::10 443
 </code> </code>
  
-Poté příkazy virsh dále používáme již bez přepínače -c tedy následně: +Podporované protokoly jsou ''tcp'' a ''udp''Řádek s neplatnou syntaxí se 
-<code shell> +odmítne dřívenež se změní aktivní pravidlaPo změně souboru pravidla načti:
-virsh net-start default +
-virsh net-autostart default +
-virsh net-list --all +
-virsh list +
-</code> +
- +
-==== 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 ''185.8.164.43''tu přidělíme KVM virtuálu a síťový provoz plně směrujeme pro veřejnou IPv4 adresu ''185.8.164.43'' z VPS přes privátní / lokální rozsah ''172.16.20.0/24'' / ''192.168.122.0/24'' na veřejnou IPv4 adresu ''185.8.164.43'' KVM virtuálu. Tedy kromě portu 1022ten rezervujeme pro SSH na VPS, aby byla VPS na IPv4 adrese ''185.8.164.43'' přes SSH i nadále dostupná. KVM virtuál má plnou konektivitu z / do internetu přes privátní / lokální IPv4 adresu ''172.16.20.13'' / ''192.168.122.2'' (kromě portu 1022 na IPv4 adrese ''185.8.164.43''). +
- +
-VPS má pouze privátní / lokální IPv4 adresu ''172.16.20.12'' / ''192.168.122.1'' a je z pohledu internetu za NATem v rámci sítě vpsfree.cz a není z internetu dostupná, kromě výše zmíněného portu 1022 (na veřejné IPv4 adrese ''185.8.164.43'' KVM virtuálu) pro přístup na SSH dané VPS. Pokud má VPS privátní IPv4 adresu ''172.16.20.12'' (rozsah v rámci sítě vpsfree.cz), má VPS IPv4 konektivitu do internetu. Pokud má VPS lokální IPv4 adresu ''192.168.122.1'' (rozsah v rámci sítě VPS ⇔ KVM virtuál), nemá VPS IPv4 konektivitu do internetu a není možné například stahovat a instalovat aktualizace přes IPv4 (pouze případně jen přes IPv6).  +
- +
-<note warning>Nejprve je potřeba ve vpsAdminu (v detailu nastavení vaší VPS), zapnout / zkontrolovat vlastnostiBridge, iptables, KVM a TUN/TAP. +
-</note> +
-Dále nakonfigurujte bridge ''br0'' pro KVM virtuál na straně VPS. Jelikož OpenVZ přepisuje soubor ''/etc/network/interfaces'', konfiguraci bridge ''br0'' přidáváme do ''interfaces.tail'', OpenVZ ji pak sám po restartu vloží do ''/etc/network/interfaces''.+
  
-Vytvořte tedy soubor ''/etc/network/interfaces.tail'' a vložte do něj následující kód (privátní IPv4 adresu VPS zaměníte za správnou IPv4 adresu z aktuální nastavené konfigurace ve vpsAdminu, lokální IPv4 adresu VPS si samozřejmě můžete zvolit libovolnou z lokálního rozsahu. Já jsem dále použil privátní IPv4 adresu pro VPS v rámci sítě vpsfree.cz: +<code bash> 
-<code shell> +/etc/libvirt/hooks/network.d/50-port-forwards   dualstack-nat started begin -
-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+
 </code> </code>
  
-Vzhledem k tomu že OpenVZ již po této úpravě automaticky nevloží do ''/etc/network/interfaces'' konfiguraci pro veřejnou IPv4 adresuvložíme ještě na konec souboru ''/etc/network/interfaces.tail'' dočasně konfiguraci pro veřejnou IPv4 adresu VPS. Správnou veřejnou IPv4 adresu zvolíme dle aktuální nastavené konfigurace ve vpsAdminu (tento následující kód budeme v průběhu návodu zase mazattakže na to pamatovat): +Port 2222 byl zvolen protoaby SSH domény nekolidovalo s SSH samotné VPS. 
-<code shell> +Pravidla firewallu VPS dále omez podle tohokdo má mít ke službám přístup.
-auto venet0:0 +
-iface venet0:0 inet static +
- address 185.8.164.43 +
- netmask 255.255.255.255 +
-</code>+
  
-Soubor ''/etc/network/interfaces.tail'' uložíme a v tuto chvíli je nutné VPS tedy OpenVZ kontejner restartovat aby se daná nastavení v souboru ''interfaces.tail'' uplatnila do ''interfaces'' vytvořil se bridge ''br0''.+==== Privátní IPv4 na VPS a veřejné adresy v doméně ====
  
-Například pomocí ''virt-manager'' vytvoříme KVM virtuál nakonfigurujeme síťové rozhraní směřující na bridge ''br0'' VPS (důležité vybrat bridge ''br0''). Nastartujeme OS KVM virtuálu v systému nakonfigurujeme jeho síť dle vzoru se správnými parametry (opět privátní IPv4 adresu KVM virtuálu zvolíte správnou z aktuální konfigurace ve vpsAdminulokální IPv4 adresu KVM virtuálu si zvolíme dle použitého lokálního rozsahu v edchozích krocích. Já jsem zde opět použil privátní IPv4 adresu pro KVM virtuál v rámci sítě vpsfree.cz, kde brána IPv4 je již zvolená IPv4 adresa pro bridge ''br0'', tedy privátní / lokální IPv4 adresa pro VPS OpenVZ kontejner): +V tomto zapojení má VPS privátní IPv4 ''/32''svou běžnou veřejnou IPv6 
-<code shell> +''/64''. Doména dostane veřejnou IPv4 ''/32'' a adresu ze samostatné IPv6 
-IP adresa: 172.16.20.13 +''/64''která je směrovaná es adresu VPS z její první ''/64''Privátní IPv4 
-Maska sítě: 255.255.255.0  (maska pro privátní IPv4, pro lokální IPv4 je nutné pro tuto konfiguraci použít masku 255.255.255.255) +VPS funguje ve vnitřní síti vpsFree.cz a na internet odchází přes NAT na našich 
-Brána: 172.16.20.12 +routerech; veřejné adresy domény se v libvirt nepřekládají.
-DNS servery: 37.205.9.100,  37.205.10.88 +
-</code>+
  
-A k danému rozhraní ještě idáme veřejnou IPv4 adresu:  +Pro IPv4 nejprve požádej podporu o idělení privátní IPv4 ''/32'' k VPS.
-<code shell> +
-IP adresa: 185.8.164.43 (zvolíte správnou z aktuální konfigurace ve vpsAdminu) +
-Maska sítě: 255.255.255.0 (masku zvolíme stejnou jako pro privátní / lokální IPv4 adresu) +
-</code>+
  
-Vrátíme se ke konfiguraci souboru ''/etc/network/interfaces.tail''odebereme dočasnou konfiguraci pro veřejnou IPv4 adresu, tedy vymažeme následující řádky kódu na konci souboru:  +<vpsadmin-nav id="networking.routable-addresses.open"> 
-<code shell> +V části **Síť → Routované adresy** pak vyber veřejnou ''/32'' v poli 
-auto venet0:0 +**Adresa**, privátní adresu VPS v poli **Přes** cílové rozhraní VPS. Veřejná 
-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 ''/etc/network/interfaces.tail'' přidáme routování privátního lokálního rozsahu na rozhraní VPS tedy ''venet0''+<vpsadmin-nav id="networking.routable-addresses.open"> 
 +Pro IPv6 použij další ''/64'', kterou máš v části **Síť → Routované adresy** 
 +k dispozici, a nastav její směrování přes adresu z běžné ''/64'' VPS. Pokud už 
 +máš směrovanou větší síť, například ''/48'', vyber z ní pro doménu 
 +samostatnou ''/64''První adresu této druhé ''/64'' použijeme jako bránu na 
 +bridge libvirt; například pro ''ROUTED_IPV6_PREFIX::/64'' to bude 
 +''ROUTED_IPV6_PREFIX::1''. 
 +</vpsadmin-nav>
  
-Správný tvar pro privátní rozsah IPv4 nalezneme ve vpsAdminu [[https://vpsadmin.vpsfree.cz/?page=networking&action=ip_addresses&list=1&limit=25&offset=0&v=0&vps=&network=0&ip_range=0&location=0|zde]]. Správný tvar rozsahu pro lokální rozsah IPv4 je dle zvolené lokální IPv4 adresy. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky se správným rozsahem za předchozí kód: +Tok IPv4 paketů používá malou tranzitní síť pouze mezi VPS a doménou:
-<code shell> +
- up ip route add 172.16.20.0/24 dev venet0 +
- down ip route del 172.16.20.0/24 dev venet0 +
-</code>+
  
-Přidáme routování pro privátní / lokální IPv4 adresu KVM virtuálu na daný bridge tedy ''br0'' a routování pro veřejnou IPv4 adresu KVM virtuálu na daný bridge ''br0''. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky se správnou privátní / lokální IPv4 adresou a správnou veřejnou IPv4 adresou za výše uvedený kód:  +<code> 
-<code shell+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+
 </code> </code>
  
-Povolíme edávání datagramů z jednoho síťového rozhraní na druhé (ip_forward/ forwarding) a nastavíme DNS servery IPv4 sítě vpsfree.cz. Do souboru ''/etc/network/interfaces.tail''idáme řádky za výše uvedený kód +V XML libvirt je veřejná IPv4 samostatná trasa es tranzitní adresu domény. 
-<code shell> +Směrovaná IPv6 ''/64'' je naproti tomu ímo na bridge:
- post-up echo 1 > /proc/sys/net/ipv4/ip_forward +
- post-up echo 1 > /proc/sys/net/ipv4/conf/all/forwarding +
- dns-nameservers  37.205.9.100  37.205.10.88 +
-</code>+
  
-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 ''/etc/network/interfaces.tail'' přidáme řádky za výše uvedený kód: +<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 +  <name>public-routed</name> 
- 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='virbr-public'/
- down iptables -t nat -D POSTROUTING -p tcp --sport 1022 -d 172.16.20.12 -j SNAT --to 185.8.164.43+  <ip address='192.168.123.1' prefix='30'/> 
 +  <ip family='ipv6' address='ROUTED_IPV6_PREFIX::1' prefix='64'/> 
 +  <route family='ipv4' address='PUBLIC_IPV4' prefix='32' 
 +         gateway='192.168.123.2'/> 
 +</network>
 </code> </code>
  
-Soubor ''/etc/network/interfaces.tail'' uložíme a v tuto chvíli je nutné VPS tedy OpenVZ kontejner restartovat aby se daná nastavení v souboru ''interfaces.tail'' uplatnila a je hotovo. +Na VPS musí být povolené směrování obou protokolů:
- +
-=== * 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 ''192.168.122.2'' (rozsah v rámci sítě VPS ⇔ KVM virtuál) za NATem dané VPS a na tuto lokální IPv4 adresu ''192.168.122.2'' směrujeme jednotlivé porty pro jednotlivé dané služby běžící na KVM virtuálu. KVM virtuál má plnou konektivitu pouze do internetu přes lokální IPv4 adresu ''192.168.122.2'', směrem z internetu jsou dostupné pouze předem dané porty služeb běžících na KVM virtuálu a to přes veřejnou IPv4 adresu ''185.8.164.43'' VPS. +
- +
-VPS má vlastní veřejnou IPv4 adresu ''185.8.164.43'' a má plnou konektivitu z / do internetu přes veřejnou IPv4 adresu ''185.8.164.43'' (kromě portů směrovaných na služby KVM virtuálu). VPS má také lokální IPv4 adresu ''192.168.122.1'' (rozsah v rámci sítě VPS ⇔ KVM virtuál) která slouží jako brána pro NAT VPS. +
- +
-<note warning>Nejprve je potřeba ve vpsAdminu (v detailu nastavení vaší VPS), zapnout / zkontrolovat vlastnostiBridge, iptables, KVM a TUN/TAP.</note> +
- +
-Dále nakonfigurujte bridge ''br0'' pro KVM virtuál na straně VPS. Jelikož OpenVZ přepisuje soubor ''/etc/network/interfaces'', konfiguraci bridge ''br0'' přidáváme do ''interfaces.tail'', OpenVZ ji pak sám po restartu vloží do ''/etc/network/interfaces''.+
  
-Vytvořte tedy soubor ''/etc/network/interfaces.tail'' a vložte do něj následující kód (lokální IPv4 adresu VPS si samozřejmě můžete zvolit libovolnou z lokálního rozsahu. Já jsem použil lokální IPv4 adresu v rámci rozsahu ''192.168.122.0'': +<code bash
-<code shell+sysctl -w net.ipv4.ip_forward=
-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+
 </code> </code>
  
-Do souboru ''/etc/network/interfaces.tail'' přidáme routování lokálního rozsahu na rozhraní bridge ''br0''. Správný tvar rozsahu pro lokální rozsah IPv4 je dle zvolené lokální IPv4 adresy v předchozím kroku. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky se správným rozsahem za předchozí kód: +Následující skript vytvoří tuto síť a uloží forwarding do 
-<code shell> +''/etc/sysctl.d/90-libvirt-routing.conf''. Ulož jej například jako 
- up ip route add 192.168.122.0/24 dev br0 +''/root/configure-routed-network.sh'' a spusť jej s routovanou IPv4 a první 
- down ip route del 192.168.122.0/24 dev br0 +adresou routované IPv6 ''/64'':
-</code>+
  
-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 ''br0'' a rozhraní VPS tedy ''venet0''. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky za výše uvedený kód: +<code bash
-<code shell+PUBLIC_IPV4=PUBLIC_IPV4 \ 
- post-up echo /proc/sys/net/ipv4/ip_forward +IPV6_GATEWAY=ROUTED_IPV6_PREFIX::
- up iptables --table nat --append POSTROUTING --out-interface venet0 -j MASQUERADE +  /root/configure-routed-network.sh
- up iptables --append FORWARD --in-interface br0 -j ACCEPT+
 </code> </code>
  
-Vzhledem k tomu že OpenVZ již po této úpravě automaticky nevloží do ''/etc/network/interfaces'' konfiguraci pro veřejnou IPv4 adresu, vložíme ještě na konec souboru ''/etc/network/interfaces.tail'' konfiguraci pro veřejnou IPv4 adresu VPS dle aktuální nastavené konfigurace ve vpsAdminu a nastavíme DNS servery IPv4 sítě vpsfree.cz: +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 ''/etc/sysctl.d'' se postarají o restarty VPS.
-auto venet0:0 +
-iface venet0:0 inet static +
- address 185.8.164.43 +
- netmask 255.255.255.255 +
- dns-nameservers  37.205.9.100  37.205.10.88 +
-</code>+
  
 +<code bash>
 +#!/usr/bin/env bash
 +set -euo pipefail
  
-Soubor ''/etc/network/interfaces.tail'' uložíme a v tuto chvíli je nutné VPS tedy OpenVZ kontejner restartovat aby se daná nastavení v souboru ''interfaces.tail'' uplatnila do ''interfaces'' a vytvořil se bridge ''br0''.+: "${PUBLIC_IPV4:?set PUBLIC_IPV4 to the routed public IPv4 address}" 
 +: "${IPV6_GATEWAY:?set IPV6_GATEWAY to the first address of the routed IPv6 /64}"
  
-Například pomocí ''virt-manager'' vytvoříme KVM virtuál a nakonfigurujeme síťové rozhraní směřující na bridge ''br0'' VPS (důležité vybrat bridge ''br0''). Nastartujeme OS KVM virtuálu a v systému nakonfigurujeme jeho síť dle vzoru se správnými parametry (lokální IPv4 adresu KVM virtuálu si zvolíme dle použitého lokálního rozsahu v předchozích krocích, kde brána IPv4 je již zvolená IPv4 adresa pro bridge ''br0'', tedy lokální IPv4 adresa pro VPS OpenVZ kontejner): +host_transit_ipv4=${HOST_TRANSIT_IPV4:-192.168.123.1} 
-<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=/etc/sysctl.d/90-libvirt-routing.conf 
-DNS servery: 37.205.9.100,  37.205.10.88 +xml=$(mktemp) 
-</code>+trap 'rm -f "$xml"' EXIT
  
 +export LC_ALL=C
 +network_uuid=$(virsh --connect "$connection" net-uuid "$network" 2>/dev/null || :)
 +uuid_element=
 +if [[ -n $network_uuid ]]; then
 +  uuid_element="  <uuid>$network_uuid</uuid>"
 +fi
 +cat >"$xml" <<EOF
 +<network>
 +  <name>$network</name>
 +$uuid_element
 +  <forward mode='open'/>
 +  <bridge name='virbr-public' stp='on' delay='0'/>
 +  <ip address='$host_transit_ipv4' prefix='30'/>
 +  <ip family='ipv6' address='$IPV6_GATEWAY' prefix='64'/>
 +  <route family='ipv4' address='$PUBLIC_IPV4' prefix='32'
 +         gateway='$guest_transit_ipv4'/>
 +</network>
 +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://wiki.libvirt.org/page/Networking |zde]]) umístěného v souboru ''/etc/libvirt/hooks/qemu''  +if virsh --connect "$connectionnet-list --name \ 
- +  | grep -Fx "$network>/dev/null; then 
-Vytvoříme tedy soubor ''/etc/libvirt/hooks/qemu'' a vložíme následující kód: +  printf '%s is active. Shut down its attached domains, run ' "$network>&
-<code shell> +  printf 'virsh net-destroy %s, then rerun this script.\n' "$network>&
-#!/bin/bash +  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='kvm-virtual' +
-Guest_ipaddr='192.168.122.2' +
-Guest_port=( '80' '443'+
-Host_ipaddr='185.8.164.43' +
-Host_port=(  '80' '443'+
- +
-length=$(( ${#Host_port[@]} 1 )) +
-if [ "${1}"${Guest_name}]; then +
-   if [ "${2}= "stopped" ] || [ "${2}" = "reconnect" ]; then +
-       for i in `seq 0 $length`; do +
-               iptables -t nat -D PREROUTING -d ${Host_ipaddr} -p tcp --dport ${Host_port[$i]} -j DNAT --to ${Guest_ipaddr}:${Guest_port[$i]} +
-               iptables -D FORWARD -d ${Guest_ipaddr}/32 -p tcp -m state --state NEW -m tcp --dport ${Guest_port[$i]} -j ACCEPT +
-               iptables -t nat -D PREROUTING -d ${Host_ipaddr} -p udp --dport ${Host_port[$i]} -j DNAT --to ${Guest_ipaddr}:${Guest_port[$i]} +
-               iptables -D FORWARD -d ${Guest_ipaddr}/32 -p udp -m state --state NEW -m udp --dport ${Guest_port[$i]} -j ACCEPT +
-       done +
-   fi +
-   if [ "${2}= "start" ] || [ "${2}" = "reconnect" ]; then +
-       for i in `seq 0 $length`; do +
-               iptables -t nat -A PREROUTING -d ${Host_ipaddr} -p tcp --dport ${Host_port[$i]} -j DNAT --to ${Guest_ipaddr}:${Guest_port[$i]} +
-               iptables -I FORWARD -d ${Guest_ipaddr}/32 -p tcp -m state --state NEW -m tcp --dport ${Guest_port[$i]} -j ACCEPT +
-               iptables -t nat -A PREROUTING -d ${Host_ipaddr} -p udp --dport ${Host_port[$i]} -j DNAT --to ${Guest_ipaddr}:${Guest_port[$i]} +
-               iptables -I FORWARD -d ${Guest_ipaddr}/32 -p udp -m state --state NEW -m udp --dport ${Guest_port[$i]} -j ACCEPT +
-       done +
-   fi+
 fi fi
-</code> 
- 
-V souboru ještě před uložením skriptu ''/etc/libvirt/hooks/qemu'' musíme nastavit správné konstanty ve skriptu a to následovně: 
-<code shell> 
-Guest_name='kvm-virtual' (vyplňte název virtuálu v libvirt, seznam virtuálů a jejich správné názvy se dají zobrazit příkazem ‚virsh list‘) 
-Guest_ipaddr='192.168.122.2' (je IPv4 lokální adresa již samotného KVM virtuálu) 
-Guest_port=( '80' '443' ) (definice portů běžících služeb na KVM virtuálu) 
-Host_ipaddr='185.8.164.43' (je veřejná IPv4 adresa samotné VPS, na které spustíme virtuál) 
-Host_port=(  '80' '443' ) (definice portů na veřejné IPv4 adrese, směrované na KVM virtuál) 
-</code> 
  
-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 443na lokální IPv4 adresu (port 80 a 443) KVM virtuáluPokud 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 "$forwarding_config")
 +cat >"$forwarding_config" <<'EOF' 
 +net.ipv4.ip_forward = 1 
 +net.ipv6.conf.all.forwarding = 1 
 +EOF 
 +sysctl --quiet --load "$forwarding_config"
  
-Soubor ''/etc/libvirt/hooks/qemu'' uložíme a nastavíme správné atributy souboru skriptu ke spouštění skriptu, příkazem: +virsh --connect "$connection" net-define "$xml" 
-<code shell> +virsh --connect "$connection" net-autostart "$network" 
-chmod +x /etc/libvirt/hooks/qemu+virsh --connect "$connection" net-start "$network" 
 +virsh --connect "$connection" net-dumpxml "$network"
 </code> </code>
  
-V tuto chvíli je nejjistější VPS tedy OpenVZ kontejner restartovat aby se všechna daná nastavení uplatnila je hotovo.+Pokud je síť již aktivní, skript ji nezmění. Vypni připojené domény, zastav 
 +síť příkazem ''virsh net-destroy public-routed'', skript spusť znovu domény 
 +opět zapni. Skript zachová UUID existující sítě.
  
-=== * Routování veřejné IPv4 do KVM virtuáluveřejná IPv4 u VPS ===+Doménu připoj k ''public-routed''. V Debianu v doméně pak například ulož 
 +následující konfiguraci do ''/etc/network/interfaces.d/public-routed''; 
 +''ens3''''PUBLIC_IPV4'', ''GUEST_IPV6'' a ''IPV6_GATEWAY'' nahraď 
 +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/32 dev ens3 
 +    up ip route replace default via 192.168.123.1 src PUBLIC_IPV4 
 +    down ip address del PUBLIC_IPV4/32 dev ens3
  
-Máme veřejnou IPv4 adresu ''185.8.164.43'' a tu přidělíme KVM virtuálu a síťový provoz pro danou veřejnou IPv4 adresu ''185.8.164.43'' KVM virtuálu směrujeme přímo přes veřejnou IPv4 adresu ''185.8.164.36'' VPS na veřejnou IPv4 adresu ''185.8.164.43'' KVM virtuálu. KVM virtuál má plnou konektivitu z / do internetu přes veřejnou IPv4 adresu ''185.8.164.43''+iface ens3 inet6 static 
- +    address GUEST_IPV6/64 
-VPS má vlastní veřejnou IPv4 adresu ''185.8.164.36''a má plnou konektivitu z / do internetu přes veřejnou IPv4 adresu ''185.8.164.36''+    gateway IPV6_GATEWAY
- +
-<note warning>Nejprve je potřeba ve vpsAdminu (v detailu nastavení vaší VPS), zapnout / zkontrolovat vlastnosti: Bridge, iptables, KVM a TUN/TAP.</note> +
- +
-Dále nakonfigurujte bridge ''br0'' pro KVM virtuál na straně VPS. Jelikož OpenVZ přepisuje soubor ''/etc/network/interfaces'', konfiguraci bridge ''br0'' přidáváme do ''interfaces.tail'', OpenVZ ji pak sám po restartu vloží do ''/etc/network/interfaces''+
- +
-Vytvořte tedy soubor ''/etc/network/interfaces.tail'' a vložte do něj následující kód (veřejnou IPv4 adresu VPS zaměníte za správnou IPv4 adresu z aktuální nastavené konfigurace ve vpsAdminu): +
-<code shell> +
-auto br0 +
-iface br0 inet static +
- address 185.8.164.36 +
- netmask 255.255.255.255 +
- bridge_ports venet0:0 +
- bridge_stp on +
- bridge_fd 0.0 +
- dad-attempts 0 +
- accept_ra 0+
 </code> </code>
  
-Do souboru ''/etc/network/interfaces.tail'' přidáme routování veřejného rozsahu na rozhraní VPS tedy ''venet0''.+''forward mode='open''' nechává filtrování forwardovaného provozu na firewallu 
 +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é ''/64''; na vnějším rozhraní VPS zůstává 
 +jen adresa z její běžné ''/64''. Ani jeden protokol v tomto zapojení nepoužívá 
 +NAT.
  
-Správný tvar pro veřejný rozsah k dané veřejné IPv4 adrese nalezneme ve vpsAdminu [[https://vpsadmin.vpsfree.cz/?page=networking&action=ip_addresses&list=1&limit=25&offset=0&v=0&vps=&network=0&ip_range=0&location=0|zde]]. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky se správným rozsahem za předchozí kód: +===== Instalační ISO na NFS =====
-<code shell> +
- up ip route add 185.8.164.0/32 dev venet0 +
- down ip route del 185.8.164.0/32 dev venet0 +
-</code>+
  
-Přidáme routování pro veřejnou IPv4 adresu KVM virtuálu na daný bridge tedy ''br0''. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky se správnou veřejnou IPv4 adresou za výše uvedený kód:  +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í na zámek 
- up ip route add 185.8.164.43 dev br0 +uvíznout nebo skončit chybou jako ''Failed to lock byte 100'' či 
- down ip route del 185.8.164.43 dev br0 +''Failed to get ... lock''.
-</code>+
  
-Povolíme edávání datagramů z jednoho síťového rozhraní na druhé (ip_forward/ forwarding) a nastavíme DNS servery IPv4 sítě vpsfree.cz. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky za výše uvedený kód +Pouze pro jednoho klienta a pouze pro instalační ISO ipojené pro čtení lze 
-<code shell> +použít ''nolock'':
- post-up echo 1 > /proc/sys/net/ipv4/ip_forward +
- post-up echo 1 > /proc/sys/net/ipv4/conf/all/forwarding +
- dns-nameservers  37.205.9.100  37.205.10.88 +
-</code>+
  
-Soubor ''/etc/network/interfaces.tail'' uložíme a v tuto chvíli je nutné VPS tedy OpenVZ kontejner restartovat aby se daná nastavení v souboru ''interfaces.tail'' uplatnila a vytvořil se bridge ''br0''.+<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 ''br0'', tedy veřejná IPv4 adresa pro VPS OpenVZ kontejner): +"${NFS_SERVER:?set NFS_SERVER to the NAS server address}" 
-<code shell> +"${NFS_EXPORT:?set NFS_EXPORT to the exported dataset path}"
-IP adresa: 185.8.164.43 +
-Maska sítě: 255.255.255.255 +
-Brána: 185.8.164.36 +
-DNS servery: 37.205.9.100  37.205.10.88 +
-</code>+
  
-A je hotovo.+mountpoint=${ISO_MOUNTPOINT:-/mnt/installer-iso} 
 +install -d -m 0755 "$mountpoint" 
 +mount -t nfs -o ro,vers=3,nolock \ 
 +  "${NFS_SERVER}:${NFS_EXPORT}" "$mountpoint"
  
-=== * Routování veřejné IPv6 do KVM virtuáluveřejná IPv6 u VPS === +findmnt --noheadings --output FSTYPE,OPTIONS --target "$mountpoint"
- +
-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 ''2a03:3b40:3::52'' a tu přidělíme KVM virtuálu a síťový provoz pro danou veřejnou IPv6 adresu ''2a03:3b40:3::52'' KVM virtuálu směrujeme přímo přes veřejnou IPv6 adresu ''2a03:3b40:3::47'' VPS na veřejnou IPv6 adresu ''2a03:3b40:3::52'' KVM virtuálu. KVM virtuál má plnou konektivitu z / do internetu přes veřejnou IPv6 adresu ''2a03:3b40:3::52''+
- +
-VPS má vlastní veřejnou IPv6 adresu ''2a03:3b40:3::47'' a má plnou konektivitu z / do internetu přes veřejnou IPv6 adresu ''2a03:3b40:3::47''+
-<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ě! +
-</note> +
- +
-Do existujícího souboru ''/etc/network/interfaces.tail'' vložte následující kód za existující kódu pro definování IPv4 bridge ''br0'' (veřejnou IPv6 adresu VPS zvolíte správnou z aktuální nastavené konfigurace ve vpsAdminu): +
-<code shell> +
-iface br0 inet6 static +
- address 2a03:3b40:3::47 +
- netmask 128 +
- autoconf 0 +
- dad-attempts 0 +
- accept_ra 0+
 </code> </code>
  
-Do souboru ''/etc/network/interfaces.tail'' přidáme routování IPv6 rozsahu na rozhraní VPS tedy ''venet0'' a routování pro veřejnou IPv6 adresu KVM virtuálu na daný bridge ''br0''+''nolock'' vypíná síťové zamykání NLM ostatní klienti pak nevidí lokální 
- +zámkyNikdy jej nepoužívej pro zapisovatelný nebo sdílený disk virtuálního 
-Správný tvar pro rozsah IPv6 nalezneme ve vpsAdminu [[https://vpsadmin.vpsfree.cz/?page=networking&action=ip_addresses&list=1&limit=25&offset=0&v=0&vps=&network=0&ip_range=0&location=0|zde]] a danou veřejnou IPv6 adresu pro KVM virtuálu nastavíme správnou dle aktuální nastavené konfigurace ve vpsAdminu. +strojeU NFSv4 je zamykání součástí protokolu tato volba není řešenímViz 
- +[[https://man7.org/linux/man-pages/man5/nfs.5.html|nfs(5)]].
-Do souboru ''/etc/network/interfaces.tail'' přidáme řádky se správným rozsahem a správnou veřejnou IPv6 adresou pro KVM virtuál za předchozí kód: +
-<code shell> +
- up route -A inet6 add 2a03:3b40:3::/128 dev venet0 +
- down route -A inet6 del 2a03:3b40:3::/128 dev venet0 +
- up route -A inet6 add 2a03:3b40:3::52 dev br0 +
- down route -A inet6 del 2a03:3b40:3::52 dev br0 +
-</code> +
- +
-Povolíme předávání datagramů z jednoho síťového rozhraní na druhé (forwarding) nastavíme DNS servery IPv6 sítě vpsfree.cz. Do souboru ''/etc/network/interfaces.tail'' přidáme řádky za výše uvedený kód: +
-<code shell> +
- post-up echo 1 > /proc/sys/net/ipv6/conf/all/forwarding +
- dns-nameservers 2a01:430:17:1::ffff:666 2a01:430:17:1::ffff:588 +
-</code> +
- +
-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á pro bridge ''br0'', tedy veřejná IPv6 adresa pro VPS OpenVZ kontejner): +
-<code shell> +
-IP adresa: 2a03:3b40:3::52 +
-Maska sítě: 128 +
-Brána: 2a03:3b40:3::47 +
-DNS servery: 2a01:430:17:1::ffff:666, 2a01:430:17:1::ffff:588 +
-</code> +
- +
-Soubor ''/etc/network/interfaces.tail'' uložíme a v tuto chvíli je nutné VPS tedy OpenVZ kontejner restartovat aby se daná nastavení v souboru ''interfaces.tail'' uplatnila je hotovo+
- +
-===== KVM na Debian 9  ===== +
-Nefunguje více info v https://lists.vpsfree.cz/pipermail/community-list/2017-July/004532.html +
-===== Kontakty =====+
  
-<maintainers> 
-pavlix (CentOS, Debian) 
-jirutka (Alpine Linux) 
-</maintainers> 
navody/vps/kvm.1532949707.txt.gz · Poslední úprava: autor: swez