Мой сервер NFS имеет 3 интерфейса: 0: 1Гб, 1: 10Гб, 2: 10Гб.
Iface 0 используется только для административных целей, а 1/2 - для двух разных креплений.
Все интерфейсы находятся в одной подсети (/ 24).
| сервер | ----> iface 0/1/2 ----> | частный коммутатор | ----> | все клиенты |
Мои клиенты настроены для подключения к nfs через интерфейсы 1 и 2.
$ mount
...
iface1:/home on /home type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.1.1.3,local_lock=none,addr=172.1.1.1)
iface2:/scratch on /scratchlair type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.1.1.3,local_lock=none,addr=172.1.1.2)
...
Где iface 1 и 2 равны 172.1.1. {1,2} соответственно. Iface 0 - это 172.1.1.5.
Моя проблема в том, что на сервере я вижу весь трафик, идущий на iface 0через nload. Ifaces 1 и 2 не показывать пробок.
То же самое для всех 10 клиентов, подключенных к серверу nfs.
Что заставляет трафик уходить на iface 0, и как я могу заставить трафик клиента nfs проходить через настроенный интерфейс?
Чтобы это работало, вам необходимо настроить отдельные таблицы маршрутизации и правила для всех трех интерфейсов inet и включить arp_filter
.
Вы также можете сначала протестировать это в среде виртуальной машины, так как вы можете легко прервать любое соединение на следующих шагах, и определенно будут некоторые проблемы.
Сначала включите arp_filter
.
sysctl net.ipv4.conf.default.arp_filter=1
Чтобы сделать его постоянным, добавьте это в свой /etc/sysctl.conf
. В зависимости от вашего дистрибутива вы также можете поместить его в файл ниже /etc/sysctl.d/
.
echo net.ipv4.conf.default.arp_filter = 1 >> /etc/sysctl.conf
Теперь добавим таблицы маршрутизации.
cat << TABLES >> /etc/iproute2/rt_tables
101 rt1
102 rt2
103 rt3
TABLES
Если у вас есть /24
netmask и ваш шлюз по умолчанию 172.1.1.254
. Кроме того, интерфейсы 0, 1 и 2 являются eth0
, eth1
и eth2
в следующем примере, который может не соответствовать вашей настройке, поэтому вам придется принять его.
ip route add 172.1.1.0/24 dev eth0 src 172.1.1.5 table rt1
ip route add table rt1 default via 172.1.1.254 dev eth0
ip rule add table rt1 from 172.1.1.5
ip route add 172.1.1.0/24 dev eth1 src 172.1.1.1 table rt2
ip route add table rt2 default via 172.1.1.254 dev eth1
ip rule add table rt2 from 172.1.1.1
ip route add 172.1.1.0/24 dev eth2 src 172.1.1.2 table rt3
ip route add table rt3 default via 172.1.1.254 dev eth2
ip rule add table rt2 from 172.1.1.2
Чтобы сделать эти таблицы маршрутизации и правила постоянными, вам необходимо добавить указанные выше шаги в конфигурацию вашей сетевой карты. В системе на основе RHEL это будет следующим образом.
Маршруты и правила для eth0
.
cat << ROUTE > /etc/sysconfig/network-scripts/route-eth0
172.1.1.0/24 dev eth0 src 172.1.1.5 table rt1
table rt1 default via 172.1.1.254 dev eth0
ROUTE
cat << RULE > /etc/sysconfig/network-scripts/rule-eth0
table rt1 from 172.1.1.5
RULE
Маршруты и правила для eth1
.
cat << ROUTE > /etc/sysconfig/network-scripts/route-eth1
172.1.1.0/24 dev eth1 src 172.1.1.1 table rt2
table rt2 default via 172.1.1.254 dev eth1
ROUTE
cat << RULE > /etc/sysconfig/network-scripts/rule-eth1
table rt2 from 172.1.1.1
RULE
Маршруты и правила для eth2
.
cat << ROUTE > /etc/sysconfig/network-scripts/route-eth2
172.1.1.0/24 dev eth2 src 172.1.1.2 table rt3
table rt3 default via 172.1.1.254 dev eth2
ROUTE
cat << RULE > /etc/sysconfig/network-scripts/rule-eth2
table rt3 from 172.1.1.2
RULE
Возможно, было бы проще, как уже говорилось в комментариях, просто использовать разные подсети для интерфейсов и назначать IP-псевдонимы на клиентах для разных подсетей.
Я протестировал это в среде виртуальной машины с сервером CentOS7 NFS.