KVM - nastavení sítě IPV4/IPV6

ahoj doufám, že mi zde někdo chytrý poradí. mám aktuálně vps na kterém běží alpine linux na kterém hostuju kvm ubuntu 22.04. problém je v tom, že jsem docela nehezky řešil nastavení sítě, tak aby vps a kvm měli přístup z/do internetu jak z ipv4, tak i z ipv6. momentálně musím mít 2 interface(jeden je pro ipv4, druhý pro ipv6) nejradši kdyby to šlo nějak sloučit do jednoho interface se zachováním stejné konektivity vps i kvm.
Kdyby měl někdo myšlenku, či nápad, tak to vyzkouším na playground, až budu mít chvilku.
VPS je přístupný pouze na portech 1022(ssh),5900(vnc-defaultně zakázané v iptables- kdyby selhalo připojení KVM do sítě), zbytek udp/tcp portů je směrovaných do KVM
/etc/network/interfaces

# This file is generated by osctld from vpsAdminOS every time the container
# starts. Do not edit this file, your changes will be lost!
#
# Your custom configuration can be placed in /etc/network/interfaces.head
# and /etc/network/interfaces.tail, their contents will be embedded
# at the beginning and at the end of this file, respectively.
# If directory /etc/network/interfaces.d exists, all files from this directory
# are also sourced.
#
# To stop osctld from manipulating this file, run
#
#   chmod u-w /etc/network/interfaces
#
# See interfaces(5), ifup(8) and ifdown(8).

# Autogenerated configuration
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address 37.205.9.7
  netmask 255.255.255.255
  up ip -4 route add 255.255.255.254 dev eth0
  up ip -4 route add default via 255.255.255.254 dev eth0
iface eth0 inet6 static
  address 2a03:3b40:fe:234::1
  netmask 64
  up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_dad
  up ip -6 route add fe80::fc9e:13ff:feff:eac0 dev eth0
  up ip -6 route add default via fe80::fc9e:13ff:feff:eac0 dev eth0


# Contents of /etc/network/interfaces.tail
auto br0
iface br0 inet static
     pre-up brctl addbr br0
     address 172.18.1.1
     netmask 255.255.255.0
     hwaddress FE:1F:77:02:57:58
     post-down brctl delbr br0
     up iptables -t nat -A POSTROUTING -s 172.18.1.0/24 ! -o br0 -j MASQUERADE
     down up iptables -t nat -D POSTROUTING -s 172.18.1.0/24 ! -o br0 -j MASQUERADE
     up iptables -A FORWARD -i br0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
     up iptables -A FORWARD -i br0 -o eth0 -j ACCEPT
     down iptables -D FORWARD -i br0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
     down iptables -D FORWARD -i br0 -o eth0 -j ACCEPT
up iptables -t nat -A PREROUTING -d 37.205.9.7 -p tcp --dport 1:1021 -j DNAT --to 172.18.1.2
up iptables -I FORWARD -d 172.18.1.2/24 -p tcp -m state --state NEW -m tcp --dport 1:1021 -j ACCEPT
up iptables -t nat -A PREROUTING -d 37.205.9.7 -p udp --dport 1:1021 -j DNAT --to 172.18.1.2
up iptables -I FORWARD -d 172.18.1.2/24 -p udp -m state --state NEW -m udp --dport 1:1021 -j ACCEPT
up iptables -t nat -A PREROUTING -d 37.205.9.7 -p tcp --dport 1023:5899 -j DNAT --to 172.18.1.2
up iptables -I FORWARD -d 172.18.1.2/24 -p tcp -m state --state NEW -m tcp --dport 1023:5899 -j ACCEPT
up iptables -t nat -A PREROUTING -d 37.205.9.7 -p udp --dport 1023:5899 -j DNAT --to 172.18.1.2
up iptables -I FORWARD -d 172.18.1.2/24 -p udp -m state --state NEW -m udp --dport 1023:5899 -j ACCEPT
up iptables -t nat -A PREROUTING -d 37.205.9.7 -p tcp --dport 5901:65535 -j DNAT --to 172.18.1.2
up iptables -I FORWARD -d 172.18.1.2/24 -p tcp -m state --state NEW -m tcp --dport 5901:65535 -j ACCEPT
up iptables -t nat -A PREROUTING -d 37.205.9.7 -p udp --dport 5901:65535 -j DNAT --to 172.18.1.2
up iptables -I FORWARD -d 172.18.1.2/24 -p udp -m state --state NEW -m udp --dport 5901:65535 -j ACCEPT
up iptables -t nat -A PREROUTING -p icmp -d 37.205.9.7 -j DNAT --to-destination 172.18.1.2
up iptables -A FORWARD -p icmp -d 172.18.1.2 -j ACCEPT
down iptables -t nat -D PREROUTING -d 37.205.9.7 -p tcp --dport 1:1021 -j DNAT --to 172.18.1.2
down iptables -I FORWARD -d 172.18.1.2/24 -p tcp -m state --state NEW -m tcp --dport 1:1021 -j ACCEPT
down iptables -t nat -D PREROUTING -d 37.205.9.7 -p udp --dport 1:1021 -j DNAT --to 172.18.1.2
down iptables -I FORWARD -d 172.18.1.2/24 -p udp -m state --state NEW -m udp --dport 1:1021 -j ACCEPT
down iptables -t nat -D PREROUTING -d 37.205.9.7 -p tcp --dport 1023:5899 -j DNAT --to 172.18.1.2
down iptables -I FORWARD -d 172.18.1.2/24 -p tcp -m state --state NEW -m tcp --dport 1023:5899 -j ACCEPT
down iptables -t nat -D PREROUTING -d 37.205.9.7 -p udp --dport 1023:5899 -j DNAT --to 172.18.1.2
down iptables -I FORWARD -d 172.18.1.2/24 -p udp -m state --state NEW -m udp --dport 1023:5899 -j ACCEPT
down iptables -t nat -D PREROUTING -d 37.205.9.7 -p tcp --dport 5901:65535 -j DNAT --to 172.18.1.2
down iptables -I FORWARD -d 172.18.1.2/24 -p tcp -m state --state NEW -m tcp --dport 5901:65535 -j ACCEPT
down iptables -t nat -D PREROUTING -d 37.205.9.7 -p udp --dport 5901:65535 -j DNAT --to 172.18.1.2
down iptables -I FORWARD -d 172.18.1.2/24 -p udp -m state --state NEW -m udp --dport 5901:65535 -j ACCEPT
down iptables -t nat -D PREROUTING -p icmp -d 37.205.9.7 -j DNAT --to-destination 172.18.1.2
down iptables -D FORWARD -p icmp -d 172.18.1.2 -j ACCEPT
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
dns-nameservers  1.1.1.1 1.0.0.1
auto venet0
auto br1
iface br1 inet6 static
pre-up brctl addbr br1
post-up bash /etc/network/setup6.sh
address 2a03:3b40:3::29
hwaddress AA:48:06:45:D3:DC
netmask 64
pre-down brctl delif br1 eth0
post-down brctl delbr br1

/etc/network/setup6.sh

#!/bin/bash
IP4=$(ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')
IP4route=$(ip -4 route | grep default | cut -d ' ' -f 3)
IP61=$(ip a show eth0 | grep 'inet6 2' | awk '{print $2}' | cut -d "/" -f 1)
IP62=$(ip a show eth0 | grep 'inet6 f' | awk '{print $2}' | cut -d "/" -f 1)
IP6route=$(ip -6 route | grep default | cut -d ' ' -f 3)
echo $IP4
echo $IP4route
echo $IP61
echo $IP62
echo $IP6route
echo "flushing"
echo "1"
ip -6 a flush dev eth0
echo "2"
ip -6 a flush dev br1
echo "3"
ip a flush dev eth0
echo "4"
ip a flush dev br1
echo "5"
ip r flush dev eth0
echo "6"
ip r flush dev br1
echo "7"
ip -6 r flush dev eth0
echo "8"
ip -6 r flush dev br1
echo "add bridge"
brctl addif br1 eth0
echo " add ipv4"
ip a add $IP4 dev br1
echo "add ipv4 route"
ip r add $IP4route dev br1
ip r add default via $IP4route dev br1
echo "add ipv61"
ip -6 a add $IP61/64 dev br1
echo "echo add ipv62"
ip -6 a add $IP62/64 dev br1
echo "add ipv6 route"
ip -6 r add $IP6route dev br1
ip -6 r add default via $IP6route dev br1

síť v KVM
/etc/systemd/network/eth0.network

[Match]
MACAddress=aa:48:06:45:d3:dd

[Network]
Address=172.18.1.2/24
Gateway=172.18.1.1
DHCP=no
IPv6AcceptRA=false
LinkLocalAddressing=ipv6
DNS=1.1.1.1

[DHCP]
CriticalConnection=false
ClientIdentifier=mac
RouteMetric=100
UseMTU=false

/etc/systemd/network/eth1.network

[Match]
MACAddress=aa:48:06:45:d3:de

[Network]
Address= 2a03:3b40:25::1/48
netmask=48
Gateway=fe80::a848:6ff:fe45:d3dc
DHCP=no
IPv6AcceptRA=false
LinkLocalAddressing=ipv6

[DHCP]
CriticalConnection=false
ClientIdentifier=mac
RouteMetric=100
UseMTU=false

Neuvazoval jsi moznost na VPS chodit jenom pres v6 a tu v4 adresu nechat celou tomu KVM? Ve vpsAdminu by sis mohl prihodit privatni IPv4 adresu a pres ni naroutovat tu verejnou, pak bys tu verejnou mohl prehodit celou do toho KVM ve stejnym stylu konfigurace, jako to ma ted VPS - akorat bys nemusel pouzit nejakou tu vymyslenou default gw IP jako mame tu 255.255.255.254, ale mohl bys pouzit rovnou tu interni IP, kterou priradis tomu zakladnimu VPS. Tim by cca odpadlo reseni s iptables uplne.

(Oskar Ti rad udela pristup na v6 tunely viz tu Tunelování IPv6 [Znalostní báze])

Jenže potom nebude vps přístupná přes v4 a i kdybych nasměroval portu na interní ip z kvm do vps, tak mi to stejně nepůjde, kdyby byl nějaký průser s kvm. Chci se vyvarovat situaci, kdybych neměl přístup přes v6 a nemusel jsem to opravovat přes konzoli ve vpsadmin.
Takhle, snažím se myslet na všechny scénáře :smiley:, dokonce i ty velice nepravděpodobné.

Jinak nebylo by možné někdy udělat jinou konzoli(něco ve stylu jako má třeba google cloud)? Jakože na pc to jakž takž jde(myslím, že tabování pro autocomplete moc dobře nefunguje a i jiné věci myslím). a dělat v konzoli přes telefon to je úplný horror(myslím jen v situacích, kdy mám při ruce jen mobil :smiley:).

Problém je že když dám vše do bridge tak mi nefunguje NAT, tudíž KVM není přístup přes v4 ale jen přes v6. a brigde mezi KVM a výstupní sítí musí být kvůli fungování v6(bez bridge jsem to nezprovoznil vůbec).

Jinak při restartu vps je pokaždé jiná v6 gateway, což mi oproti statické 255.255.255.254 v4 gateway příjde nelogické. Teda nevím jestli se něco nezměnilo od doby kdy jsem s tím experimentoval.

Misto bridgovani mrkni na toto, jestli to pro Tebe nebude lepsi:

https://utcc.utoronto.ca/~cks/space/blog/linux/ModernProxyIPv6AndARP

Tu konzoli jsme nevyvijeli, je to docela dost komplexni zalezitost, udelat to od nuly… je to prevzate z projektu shellinabox. Kdybys vedel o nejake lepsi/modernejsi/kamaradstejsi s mobilem, sem s tim, muzem zkusit integrovat neco lepsiho :slight_smile:

Je to proto, ze v6 ma koncept link-local adres, co v4 tak uplne nema, proto se na v4 musi takhle strasne nestandardne prasit, u v6 jsme si rikali, ze takovou prasarnu delat nebudem, kdyz to neni potreba :smiley: Menici se adresu bychom umeli doresit, kdyby Ti to pomohlo; ted to neni staticke jenom proto, ze LXC to neumi a jeden z tech veth koncu meni mac adresu pri kazdem startu VPS. Ale dalo by se to dodelat, kdyby Ti to nejak vyrazne pomohlo.

Předem upozorňuji že nejsem expert a mé nazvosloví může být trochu jiné :smiley:.
Po té konzoli se mrknu.
Dřív jsem NDP zkoušel, ale neuspěšně
jinak ten blog je trošku špatně, ale navedl mě na myšlenku
v blogu je

echo 1 >/proc/sys/net/ipv6/conf/em0/proxy_arp

jenže ARP je u ipv4 ale ne u ipv6, tam je NDP
takže jsem našel klíč

/proc/sys/net/ipv6/conf/eth0/proxy_ndp
o kterém jsem nevěděl tak možná si s tím pohraju.
jinak nevíš o nějakém funkčním skriptu který má být údajně v /etc/qemu-ifup?
je to kvůli tomu když jsem do qemu nastavil síť tap tak to padá na /etc/qemu-ifup a ikdyž jsem tam zkoušel snad cokoliv tak bez úspěchu a vždy to spadlo na tento skript.

ten blog je potreba procist, protoze se to prave mezi v4 a v6 lisi a je potreba to trochu nasat :slight_smile:

jinac Aither prave rikal, ze by se dalo zkusit toto - https://xtermjs.org/ - ale narozdil od toho shellinabox to vubec nema on-screen keyboard, hmmm…

Problém s NDP je ten že přes něj nejspíš neroutnu celý rozsah co mám. takže NDP asi padá.

Jinak ten xtermjs vypadá dobře a na mobilu to i funguje :smiley:.
Za zkoušku by to určitě stálo.

u v6 si zas muzes rict treba o dalsi /48 a neni problem, kdyz to zduvodnis nejak rozumne, tak muze bejt aj vic, klidne udelame celou zadost prefixu od RIPE :smiley: … a s nasim ASN budeme taky mit moznost propagovat dalsi ASka, takze i to by se dalo…

EDIT: cim chci rict, ze v6 jde routovat uplne nativne snadno, pokud netrvas na deleni na drobky…

u VPS by mi stačila jedna /128 a do KVM bych chtěl /48 (mám jednu) akorát nevim jak na to, a na internetu jsem nic nenašel, nebo jsem špatně hledal.

takze +1x /64 a v6 bude solved :slight_smile:

Vlastně i jednu /64 mám, ale to furt neřeší, že nevim jak na to :smiley:.
A taky to nemám k dispozici na playground pro vyzkoušení.
Na produkčním stroji to zkoušet nehodlám, když jsem rád, že mi to jede :smiley:.

No jenze tady potrebujes site dve, jednu priradis VPS primo na interface ve vpsAdminu, druhou nechas jako routovanou a tu pak vesele priradis na interface nejbliz k tomu QEMU a proste >routujes< :smiley: neni co resit :slight_smile:

  • teda toto neni podpora@vpsfree.cz, tady to Kerryk necte, protoze na podpore toho ma dost :slight_smile: o ty IPv6 prefixy navic teda prosim pripadne napis mailem mimo tady tu diskuzi :slight_smile: jestli ti chybi resourcy na zkouseni na pgnd, tak to spravi jedna veta smerem podpora@ :slight_smile:

Aha, ja vím že toto není podpora@vpsfree.cz, jen jsem chtěl nějak nasměrovat, protože jsem vůbec neměl tušení jak na to. Díky za nasměrování. Možná se mi i povede zbavit se 2 interface na KVM a budu jen s jednou.

ja jsem to taky nemyslel nijak zle, jen ze tady si toho vsimne nekdy za dlouho, jestli :slight_smile: a pridelovani resourcu pokud jede vsechno normalne resi prave Kerryk. Playground a staging jsou proste k dispozici, kdyz je to nekomu na neco potreba, staci si rict. Stejne se to flaka, ohledne prostredku, kterych je dost a nehrozi, ze dojdou nejak snadno, neni co resit :slight_smile:

13 posts were split to a new topic: Konzole ve vpsAdminu přes xterm.js

Tak zpět k původnímu tématu :smiley: pokročil jsem s testováním a mám úspěch a podařilo se mi vše dát do jednoho bridge se stejnou konfigurací že VPS a KVM mají v4 a v6. Zkoušel jsem snad všechno (ip neigh add proxy, SOLICITATION, různé routy apod.) abych zprovoznil v6 komunikaci mezi tap0 a eth0 a následně ven ale bez výsledku.
jsem rád alespoň, že se mi tohle povedlo. Trochu jsem bojoval s NATem ale nakonec jsem to ukecal :smiley:.
Dotaz nemůže to být tim, že je nějaká chyba v jádře? Třeba že to na fyzickém stroji funguje, ale už ne ve VPS kontejnerech?

Opět zpět k tématu jestli to ještě někdo čte :smiley:.
Povedlo se mi zprovoznit i verzi bez bridge. čistě KVM s tap0 bez bridge br0.
Možná tam nechám tu verzi s bridge. Ono to vyjde tak nějak na stejno (pro mě hlavní bylo se zbavit 2 interface pro KVM a mít jen jednu), ale alespoň jsem se přiučil novým věcem a to jak správně routovat a taky že link-local adresy nejsou routovatelný. Zajímavý, že na internetu toho moc není co se týká routovaní a nebo se to týká jiné situace.

1 Like