Skip to content

Instantly share code, notes, and snippets.

@ilyaevseev
Last active April 28, 2019 23:40
Show Gist options
  • Save ilyaevseev/9dcc2b11a0e4a7d30439ccd5744653bd to your computer and use it in GitHub Desktop.
Save ilyaevseev/9dcc2b11a0e4a7d30439ccd5744653bd to your computer and use it in GitHub Desktop.
VRF in Linux using namespaces
#!/bin/sh
# 2017-feb-13
NSNAME="vrf1"
LINK1="${NSNAME}_10" # ..my link to VRF
LINK2="${NSNAME}_11" # ..VRF link to me
IP1="10.20.30.10"
IP2="10.20.30.11"
MASK="24"
GATE="10.20.30.1"
EXT_IFACE="eth0"
RTABLE="123"
VrfExec() { ip netns exec "$NSNAME" ip "$@"; }
VrfCreate() {
ip netns add "$NSNAME"
ip link add name "$LINK1" type veth peer name "$LINK2"
ip link set dev "$LINK2" netns "$NSNAME"
ip link set dev "$LINK1" up
VrfExec link set dev "$LINK2" up
VrfExec link set dev lo up
ip addr add "$IP1/32" dev "$LINK1"
ip route add "$IP2/32" dev "$LINK1"
VrfExec addr add "$IP2/$MASK" dev "$LINK2"
VrfExec route add default via "$GATE"
ip rule add iif "$LINK1" table "$RTABLE"
ip route add default via "$GATE" table "$RTABLE"
sysctl "net.ipv4.conf.$EXT_IFACE.proxy_arp"=1
sysctl "net.ipv4.conf.$LINK1.proxy_arp"=1
}
VrfDelete() {
ip netns delete "$NSNAME"
ip route delete default via "$GATE" table "$RTABLE"
ip rule delete iif "$LINK1" table "$RTABLE"
ip link delete "$LINK1"
sysctl "net.ipv4.conf.$EXT_IFACE.proxy_arp"=0
}
case "$1" in
create|add ) VrfCreate ;;
delete|del ) VrfDelete ;;
exec|run|r ) shift; ip netns exec "$NSNAME" "$@" ;;
test ) ip netns exec "$NSNAME" ping 8.8.8.8 ;;
* ) echo "Usage: ${0##*/} cmd ..cmd = create, delete, run" ;;
esac
## END ##
#!/bin/sh -e
EXT_IFACE="$(ip route get 1.2.3.4 | awk '$4 == "dev" {print $5}')"
EXT_IPADDR="$(ip route get 1.2.3.4 | awk '$6 == "src" {print $7}')"
VRF_NET="10.250"
test -n "$1" && VRFNUM="$1" || VRFNUM="1"
VRF="vrf$VRFNUM"
VrfExec() { ip netns exec "${VRF}" ip "$@"; }
ip netns add "${VRF}"
ip link add name "${VRF}a" type veth peer name "${VRF}b"
ip link set dev "${VRF}b" netns "${VRF}"
ip link set dev "${VRF}a" up
VrfExec link set dev "${VRF}b" up
VrfExec link set dev lo up
ip addr add "$VRF_NET.$VRFNUM.1/30" dev "${VRF}a"
VrfExec addr add "$VRF_NET.$VRFNUM.2/30" dev "${VRF}b"
VrfExec route add default via "$VRF_NET.${VRFNUM}.1"
iptables-save | grep -q -- "-A POSTROUTING -s $VRF_NET.${VRFNUM}.2 -o $EXT_IFACE -j SNAT --to-source $EXT_IPADDR" ||
iptables -t nat -A POSTROUTING -s "$VRF_NET.${VRFNUM}.2" -o "$EXT_IFACE" -j SNAT --to-source "$EXT_IPADDR"
sysctl net.ipv4.ip_forward=1
## END ##
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment