owned this note
owned this note
Published
Linked with GitHub
# Setting up IPv6 private network using radvd (router advertisement daemon)
## Setup
:::info
It is assumed libvirt and vagrant are installed on the system with vagrant-libvirt plugins installed.
:::
Using vagrant set up 2 VMs with an additional eth1 interface on which the IPv6 could be configured.
Steps
1. Copy the below Vagrantfile and install.sh ([Refer Appendix](#Appendix)) into a folder.
2. Run the following command with this folder to bring up both the VMs (server0 and server1)
```
vagrant up
```
3 The above step should bring up 2 VMs (server0 and server1 ). This could be tested using the following command
```
vagrant ssh server0
```
If this logs into server0 under vagrant user as below, the setup is ready for use.
```bash=!
root@airship105:/home/ekuamaj/workspace/vagrant/radvdtest# vagrant ssh server0
==> server0: The machine you're attempting to SSH into is configured to use
==> server0: password-based authentication. Vagrant can't script entering the
==> server0: password for you. If you're prompted for a password, please enter
==> server0: the same password you have configured in the Vagrantfile.
Last login: Thu Oct 14 05:09:33 2021 from 192.168.121.1
vagrant@router:~$
```
Repeat the same test for server1.
# Start radvd daemon service
On server0 (the router VM), start the radvd service using the following command.
```
sudo systemctl restart radvd.service
```
If the radvd service is up and running, the eth1 of the server1 should now have a global link IPv6 address as below.
```
root@router:~# ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 fe80::5054:ff:fe97:eb48/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2001:468:181:f100:5054:ff:fe3f:d8fc/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 86391sec preferred_lft 14391sec
inet6 fe80::5054:ff:fe3f:d8fc/64 scope link
valid_lft forever preferred_lft forever
```
## Check server1 VM for an autoconfigured IPv6 address
The radvd daemon ensures that server1 connected in the same network, is assigned a valid IPv6 address on eth1 as below.
```
vagrant@controlnode:~$ ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 fe80::5054:ff:feb5:3ad3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2001:468:181:f100:5054:ff:fe2a:1041/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 86398sec preferred_lft 14398sec
inet6 fe80::5054:ff:fe2a:1041/64 scope link
valid_lft forever preferred_lft forever
```
# Appendix
## Files
* Vagrantfile
```bash=
Vagrant.configure("2") do |config|
config.ssh.insert_key = false
config.vm.box = "generic/ubuntu2010"
config.ssh.insert_key = false
config.ssh.private_key_path = ["~/.ssh/id_rsa", "~/.vagrant.d/insecure_private_key"]
config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/authorized_keys"
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"
config.vm.provision "shell", path: "install.sh"
config.vm.provider :libvirt do |libvirt|
libvirt.cpus = 4
libvirt.memory = 8024
libvirt.machine_virtual_size = 100
end
MACHINE = ["router.dev","controlnode.dev"]
N = 1
(0..N).each do |i|
config.vm.define "server#{i}" do |node|
node.vm.hostname = MACHINE[i]
node.vm.network :private_network, ip: "192.168.4.#{10+i}"
end
end
end
```
* install.sh
```bash=
#!/bin/bash
# Update Packages
apt-get update
apt-get install radvd radvdump
sed 's/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/g' /etc/sysctl.conf | sudo tee /etc/sysctl.conf
sed 's/net.ipv6.conf.all.disable_ipv6 = 1/net.ipv6.conf.all.disable_ipv6 = 0/g' /etc/sysctl.conf | sudo tee /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding=1" | sudo tee -a /etc/sysctl.conf
sysctl -p
cat <<EOF > /etc/radvd.conf
interface eth1
{
AdvSendAdvert on;
MinRtrAdvInterval 5;
MaxRtrAdvInterval 15;
prefix 2001:468:181:f100::/64
{
AdvOnLink on;
AdvAutonomous on;
};
};
EOF
```