summaryrefslogtreecommitdiff
path: root/roles/linux-ns/templates/dn42-route-namespace.sh
blob: 6822834278742d795f86af87d0646b9d32fee838 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/bin/sh -x

set -eu

# Set public IPv6 network prefix in the form aaaa:bbbb:cccc:dddd
# (yes, without trailing: or ::)
hoster_prefix_v6="{{ hoster_ipv6_prefix }}"
# hardcoded: use 42 prefix
ns_prefix_v6="${hoster_prefix_v6}:42"

# insert IPv4 address
hoster_addr_v4="{{ hoster_ipv4_address }}"
# hardcoded: net
ns_net_v4="10.42.0.0/24"
# hardcoded: peer address (inside namespace)
ns_addr_peer_v4="10.42.0.2/32"

case $- in
  *x*) debug="-x" ;;
  *)   debug="" ;;
esac

case "$1" in
  start)
    ip netns exec dn42 sh $debug "$0" start-ns
    ip route add ${ns_net_v4} dev vethdn42
    ip a add ${ns_prefix_v6}::1/128 dev vethdn42
    ip route add ${ns_prefix_v6}::2/128 dev vethdn42
    # hardcoded: route for dn42
    ip route replace fd00::/8 via ${ns_prefix_v6}::2 dev vethdn42 src fcee::1
    ;;
  start-ns)
    sysctl -w net.ipv6.conf.all.forwarding=1

    ip -4 route flush dev eth0
    ip -6 route flush dev eth0
    ip -4 a flush dev eth0
    ip -6 a flush dev eth0

    ip a add ${ns_addr_peer_v4} dev eth0
    ip route add ${hoster_addr_v4} dev eth0
    ip route add default via ${hoster_addr_v4} dev eth0

    ip a add ${ns_prefix_v6}::2/128 dev eth0
    ip route add ${ns_prefix_v6}::1 dev eth0
    ip route add default via ${ns_prefix_v6}::1 dev eth0

    # hardcoded: dummy-interface with additional addresses
    ifup dn42_int

    # hardcoded: Additional rules for (policy) routing.
    # tables are filled by bird.
    ip -6 rule add prio 31000 table 210
    ip -6 rule add prio 32000 table 250

    # hardcoded: iptables
    iptables-nft-restore  < /etc/iptables/netns/dn42/iptables.save
    ip6tables-nft-restore  < /etc/iptables/netns/dn42/ip6tables.save
    ;;
  stop)
    ip -6 route flush dev vethdn42
    ip -4 route flush dev vethdn42

    ip -6 a flush dev vethdn42
    ip -4 a flush dev vethdn42

    ip netns exec dn42 sh $debug "$0" stop-ns
    ;;
  stop-ns)
    ifdown dn42_int

    ip -6 route flush dev eth0
    ip -6 a flush dev eth0

    ip -4 route flush dev eth0
    ip -4 a flush dev eth0

    ip -6 rule del prio 31000
    ip -6 rule del prio 32000

    ;;
  *)
    echo "Ignore invalid parameter $1" >&2
    ;;
esac