Hi.
On Sat, Dec 29, 2018 at 01:31:02PM +0800, Simon Jones wrote:
> Hi all,
>
> This is my OS:
>
> > # uname -a
> > Linux dut211 4.9.0-7-amd64 #1 SMP Debian 4.9.110-3+deb9u2 (2015-12-19)
> > x86_64 GNU/Linux
That's not a kernel 4.3, for starters. And it's outdated, consider
upgrading. Does not affect your problem though.
> Now I have to rewrite /etc/network/interfaces to implement this function,
> but I got errors, so I want to know if there is demo about how to define
> VRF interface and implement VRF function in /etc/network/interfaces.
>
> As I follow your man file, I don't know how to do, and gots errors.
Usual debugging of interfaces(5) involves 'ifup -v' and 'ifdown -v'.
> This is my try on this feature, rewrite /etc/network/interfaces like this
>
> iface eth0 inet static
> > address 172.18.8.211
> > netmask 255.255.255.0
> > ## management network policy routing rules
> > # management port up rules
> > up ip -4 link add mgmtvrf type vrf table 10
> > up ip -4 link set dev mgmtvrf up
> > up ip -4 link set dev eth0 master mgmtvrf
> > up ip -4 route add default via 172.18.8.1 dev eth0 table 10
> > up ip -4 route add 172.18.8.0/24 dev eth0 table 10
> > up ip -4 rule add from 172.18.8.211/32 table 10
> > post-up sysctl -w net.ipv4.tcp_l3mdev_accept=1
> > # management port down rules
> > down ip -4 route delete default via 172.18.8.1 dev eth0 table 10
> > down ip -4 route delete 172.18.8.0/24 dev eth0 table 10
> > down ip -4 rule delete from 172.18.8.211/32 table 10
> > down ip -4 link set dev eth0 nomaster
'-4' is redundant here (you either modify L2 entities or it can be
guessed from the context), you might remove it as well.
> This is errors I got
>
> Dec 29 02:38:48 dut211 ifup[8690]: RTNETLINK answers: File exists
This. Everything else in your log is useless.
A simple test shows that:
$ ifup -v eth0
ifup: configuring interface eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 172.18.8.211/255.255.255.0 broadcast 172.18.8.255
dev eth0 label eth0
/bin/ip link set dev eth0 up
ip -4 link add mgmtvrf type vrf table 10
ip -4 link set dev mgmtvrf up
ip -4 link set dev eth0 master mgmtvrf
ip -4 route add default via 172.18.8.1 dev eth0 table 10
ip -4 route add 172.18.8.0/24 dev eth0 table 10
RTNETLINK answers: File exists
ifup: failed to bring up eth0
So, it's all good until you try to add an additional route to
172.18.8.0/24, because this route is there already:
$ ip ro l table 10
broadcast 172.18.8.0 dev eth0 proto kernel scope link src 172.18.8.211
172.18.8.0/24 dev eth0 proto kernel scope link src 172.18.8.211
local 172.18.8.211 dev eth0 proto kernel scope host src 172.18.8.211
broadcast 172.18.8.255 dev eth0 proto kernel scope link src 172.18.8.211
And you've got your 'down' rules wrong, you should delete your custom
'mgmtvrf' interface:
# ifdown eth0
# ip a l dev mgmtvrf
5: mgmtvrf: mtu 65536 qdisc noqueue state UP
group default qlen 1000
link/ether 4a:dc:f1:71:c7:00 brd ff:ff:ff:ff:ff:ff
And, of course, there's a leftover kernel knob:
# /sbin/sysctl net.ipv4.tcp_l3mdev_accept
net.ipv4.tcp_l3mdev_accept = 1
Summing all this up:
iface eth0 inet static
address 172.18.8.211
netmask 255.255.255.0
## management network policy routing rules
# management port up rules
up ip link add mgmtvrf type vrf table 10
up ip link set dev mgmtvrf up
up ip link set dev eth0 master mgmtvrf
up ip route add default via 172.18.8.1 dev eth0 table 10
up ip rule add from 172.18.8.211/32 table 10
post-up sysctl -qw net.ipv4.tcp_l3mdev_accept=1
# management port down rules
down ip -4 route delete default via 172.18.8.1 dev eth0 table 10
down ip -4 route delete 172.18.8.0/24 dev eth0 table 10
down ip -4 rule delete from 172.18.8.211/32 table 10
down ip -4 link set dev eth0 nomaster
down ip -4 link del mgmtvrf
post-down sysctl -qw net.ipv4.tcp_l3mdev_accept=0
Reco