Korte probleembeschrijving: ik wil forceren dat Solaris een bepaalde netwerkinterface liever vindt dan andere interfaces.
Setup: een machine met een zestal netwerkaansluitingen: twee onboard Broadcom-poorten (bnx0 en bnx1, bnx1 niet in gebruik) en 4 Intel-poorten (e1000g0-3). De Intel-poorten zijn per twee getrunked middels LACP in aggr0 en aggr1. Over aggr0 en aggr1 heen ligt een IPMP-interface, ipmp0.
De machine wordt ingezet als fileserver en draait op Nexenta (OpenSolaris + Debian-userland). De bedoeling is dat al het NFS-verkeer over de IPMP-interface gaat. Die is getrunked voor meer bandbreedte en is verbonden met twee switches voor high availability. De bnx0 interface is alleen bedoeld voor administratieve doeleinden.
Het probleem is dat bnx0 toch gebruikt wordt als uitgaande interface, terwijl alle clients verbinding maken met IP-adressen op de IPMP-interface. Bijvoorbeeld:
Op zich werken de routes naar de clients toe volgens mij wel goed:
Ik heb de reden dat het uitgaande verkeer deels over bnx0 gegooid wordt volgens mij wel gevonden: de arp-table heeft entries voor een boel hosts op bnx0:
Sommige hosts staan zowel op ipmp0 als op bnx0 in de arp-table. Als ik ze echter probeer te verwijderen wordt alleen de entry op ipmp0 verwijderd, die op aggr0 blijft erin staan. Hosts die alleen een entry op aggr0 hebben kunnen niet verwijderd worden:
De vragen: is dit gedrag normaal? Hoe kan ik ervoor zorgen dat al het verkeer over ipmp0 gaat, tenzij er verbonden wordt met een IP-adres op bnx0? Waarom kan ik de entries op bnx0 niet verwijderen uit de arp-table?
Setup: een machine met een zestal netwerkaansluitingen: twee onboard Broadcom-poorten (bnx0 en bnx1, bnx1 niet in gebruik) en 4 Intel-poorten (e1000g0-3). De Intel-poorten zijn per twee getrunked middels LACP in aggr0 en aggr1. Over aggr0 en aggr1 heen ligt een IPMP-interface, ipmp0.
De machine wordt ingezet als fileserver en draait op Nexenta (OpenSolaris + Debian-userland). De bedoeling is dat al het NFS-verkeer over de IPMP-interface gaat. Die is getrunked voor meer bandbreedte en is verbonden met twee switches voor high availability. De bnx0 interface is alleen bedoeld voor administratieve doeleinden.
Het probleem is dat bnx0 toch gebruikt wordt als uitgaande interface, terwijl alle clients verbinding maken met IP-adressen op de IPMP-interface. Bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| root@file4.c1.internal ~ # netstat -I bnx0 -i 1 input bnx0 output input (Total) output packets errs packets errs colls packets errs packets errs colls 25 0 6864 0 0 21055 0 14690 0 0 21 0 6894 0 0 18946 0 14018 0 0 17 0 7130 0 0 18821 0 17747 0 0 30 0 5236 0 0 20773 0 15894 0 0 21 0 6726 0 0 23765 0 20962 0 0 18 0 5915 0 0 29022 0 23077 0 0 31 0 9288 0 0 23635 0 22321 0 0 23 0 7381 0 0 17115 0 16538 0 0 15 0 4650 0 0 24028 0 19622 0 0 |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| root@file4.c1.internal ~ # netstat -I ipmp0 -i 1 input ipmp0 output input (Total) output packets errs packets errs colls packets errs packets errs colls 11987 0 4581 0 0 24004 0 17526 0 0 15910 0 9351 0 0 31843 0 25957 0 0 16343 0 6492 0 0 32711 0 23227 0 0 13541 0 7935 0 0 27098 0 23284 0 0 16862 0 12977 0 0 33746 0 32160 0 0 15509 0 10913 0 0 31037 0 28181 0 0 16112 0 10301 0 0 32255 0 27561 0 0 15274 0 7856 0 0 30611 0 25285 0 0 17114 0 7687 0 0 34297 0 26050 0 0 18909 0 11094 0 0 37859 0 31454 0 0 |
Op zich werken de routes naar de clients toe volgens mij wel goed:
code:
1
2
3
4
5
6
7
8
| root@file4.c1.internal ~ # route get web9.c1.internal route to: web9.c1.internal destination: 10.1.0.0 mask: 255.255.0.0 interface: ipmp0 flags: <UP,DONE> recvpipe sendpipe ssthresh rtt,ms rttvar,ms hopcount mtu expire 0 0 0 0 0 0 1500 0 |
Ik heb de reden dat het uitgaande verkeer deels over bnx0 gegooid wordt volgens mij wel gevonden: de arp-table heeft entries voor een boel hosts op bnx0:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| root@file4.c1.internal ~ # arp -a Net to Media Table: IPv4 Device IP Address Mask Flags Phys Addr ------ -------------------- --------------- -------- --------------- ipmp0 service1.c1.internal 255.255.255.255 00:14:22:7c:b1:4c bnx0 service1.c1.internal 255.255.255.255 00:14:22:7c:b1:4c ipmp0 web7.c1.internal 255.255.255.255 00:1d:09:24:5e:ea bnx0 web4.c1.internal 255.255.255.255 00:1a:a0:15:47:67 bnx0 web5.c1.internal 255.255.255.255 00:1a:a0:17:02:7f bnx0 web8.c1.internal 255.255.255.255 00:1d:09:24:5e:ed bnx0 web9.c1.internal 255.255.255.255 00:1d:09:24:5e:f6 ipmp0 web10.c1.internal 255.255.255.255 00:1d:09:24:64:ef ipmp0 dns1.c1.internal 255.255.255.255 00:1e:c9:2e:a8:e5 bnx0 dns1.c1.internal 255.255.255.255 00:1e:c9:2e:a8:e5 bnx0 web11.c1.internal 255.255.255.255 00:1e:c9:2e:a8:dc |
Sommige hosts staan zowel op ipmp0 als op bnx0 in de arp-table. Als ik ze echter probeer te verwijderen wordt alleen de entry op ipmp0 verwijderd, die op aggr0 blijft erin staan. Hosts die alleen een entry op aggr0 hebben kunnen niet verwijderd worden:
code:
1
2
| root@file4.c1.internal ~ # arp -d web4.c1.internal web4.c1.internal (10.1.1.40) -- no entry |
De vragen: is dit gedrag normaal? Hoe kan ik ervoor zorgen dat al het verkeer over ipmp0 gaat, tenzij er verbonden wordt met een IP-adres op bnx0? Waarom kan ik de entries op bnx0 niet verwijderen uit de arp-table?