Det här sätter du upp
Varje server hos Melonslab är isolerad från de andra servrarna i sitt lokala nätverk, så att ingen annan kunds server kan nå din direkt. Din server tror ändå att de andra adresserna i nätverket finns alldeles intill, och försöker nå dem direkt. Det misslyckas: två servrar i samma nätverk kan inte nå varandra förrän trafiken går via gatewayen, routern som varje server redan använder för internet.
Det här behövs bara mellan två servrar hos Melonslab i samma nätverk. En server någon annanstans, eller en server hos Melonslab i ett annat nätverk, går redan via gatewayen.
Varje steg nedan har körts på två nyinstallerade servrar hos Melonslab med Debian 13:
- Före ändringen misslyckades varje IPv4-anslutning mellan dem med
No route to host. Över IPv6 misslyckades de flesta medNo route to hostellerTLS handshake timeout. - Efter ändringen gick 60 ping i rad och 20 anslutningar i rad fram, över både IPv4 och IPv6, åt båda hållen.
- Båda servrarna nådde fortfarande sin gateway och internet, och allt fungerade även efter en omstart.
Innan du börjar
Du behöver två servrar hos Melonslab med Debian 13, och root-åtkomst till båda. Gör varje steg på båda servrarna.
Exemplen använder 203.0.113.10 och 2001:db8:0:10::a för den ena servern, 203.0.113.20 och 2001:db8:0:20::a för den andra, och 203.0.113.1 för gatewayen. Byt ut dem mot dina egna.
1. Hitta ditt nätverk och din gateway
ip -4 route
default via 203.0.113.1 dev eth0 onlink
203.0.113.0/24 dev eth0 proto kernel scope link src 203.0.113.10
Den andra raden är serverns lokala nätverk, 203.0.113.0/24, som den försöker nå direkt. Den första raden anger gatewayen, 203.0.113.1. Om den andra serverns IPv4-adress inte ligger i samma nätverk behöver IPv4 ingen ändring, och du kan gå till steg 3.
2. Skicka IPv4 via gatewayen
På en server hos Melonslab sätts nätverket upp av Debians ifupdown, från en fil som cloud-init skriver, /etc/network/interfaces.d/50-cloud-init. Filens första rad varnar för att ändringar i den kanske inte består, så låt den vara. ifupdown kör också varje skript i /etc/network/if-up.d varje gång en nätverksanslutning kommer upp. Skapa /etc/network/if-up.d/via-gateway, med ditt nätverk och din gateway:
#!/bin/sh
# Melonslab isolates servers from each other on the local network:
# send traffic for the rest of the /24 through the gateway.
[ "$IFACE" = eth0 ] && [ "$ADDRFAM" = inet ] || exit 0
ip route replace 203.0.113.0/24 via 203.0.113.1 dev eth0 onlink
Det här ersätter routen för hela nätverket, så att varje server i det, nu och senare, nås via gatewayen. En route för varje enskild adress fungerar också, men då måste du lägga till en på båda servrarna för varje ny server. Gatewayen går fortfarande att nå: onlink talar om för servern att den finns alldeles intill, precis som standardrouten redan gör.
Gör skriptet körbart, och kör det en gång nu:
chmod 755 /etc/network/if-up.d/via-gateway
IFACE=eth0 ADDRFAM=inet /etc/network/if-up.d/via-gateway
ip -4 route
default via 203.0.113.1 dev eth0 onlink
203.0.113.0/24 via 203.0.113.1 dev eth0 onlink
3. Skicka IPv6 via gatewayen
Varje server hos Melonslab har ett eget IPv6-nätverk, så IPv6 går redan via gatewayen och behöver ingen route. Men gatewayen skickar ett meddelande till servrarna, en så kallad redirect, som säger åt dem att prata direkt med varandra, och då misslyckas det igen. Låt servern ignorera redirects. Skapa /etc/sysctl.d/60-no-redirects.conf:
# Send traffic to other servers in the same network through the router.
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.eth0.accept_redirects = 0
Raden för eth0 behövs: utan den var inställningen på igen för eth0 efter en omstart. Tillämpa den, och glöm de redirects som servern redan har tagit emot:
sysctl --system
ip -6 route flush cache
Att ignorera redirects är också en vanlig rekommendation för att härda en server. IPv4 behövde ingen sådan inställning i vårt test, när routen från steg 2 väl var på plats.
4. Testa
När du har gjort steg 2 och 3 på båda servrarna, kör från den första servern:
ping -c 3 203.0.113.20
ping -c 3 2001:db8:0:20::a
3 packets transmitted, 3 received, 0% packet loss, time 2050ms
Gör sedan samma sak från den andra servern till den första. Så här ser du vilken väg servern skickar trafiken:
ip route get 203.0.113.20
203.0.113.20 via 203.0.113.1 dev eth0 src 203.0.113.10 uid 0
via 203.0.113.1 betyder att den går via gatewayen. Starta om båda servrarna en gång och testa igen: routen och inställningen kommer tillbaka av sig själva.
Felsökning
No route to host, eller Destination Host Unreachable, mellan två servrar hos Melonslab. Trafiken går inte via gatewayen. Kontrollera ip route get från steg 4 på båda servrarna: svaret ska innehålla via och gatewayen. Ett svar måste hitta tillbaka, så båda servrarna behöver ändringen.
IPv6 fungerar en stund, och misslyckas sedan med No route to host eller TLS handshake timeout. Servern har tagit emot en redirect. Kontrollera att sysctl net.ipv6.conf.eth0.accept_redirects visar 0, och kör ip -6 route flush cache.
Routen är borta efter en omstart. Skriptet är inte körbart, eller så innehåller namnet en punkt, och då hoppar ifupdown över det. Kontrollera med ls -l /etc/network/if-up.d/via-gateway.