Как привязать каждую сетевую карту моего сервера к отдельному IP?

Мой вопрос: "Как мне привязать каждую сетевую карту моего сервера к отдельному IP?"

Мой сервер Ubuntu 12.04 имеет два сетевых адаптера - оба подключены к моей домашней сети.

У сетевых карт есть имена устройств, которые были установлены в /etc/udev/rules.d/70-persistent-net.rules. Я назвал lan0 и lan1. (см. ниже мой 70-persistent-net.rules).

Каждый сетевой адаптер корректно получает свои настройки IP через DHCP от моего маршрутизатора. Назначение IP выполняется на основе MAC-адреса запроса DHCP. lan0 назначается ip 172.23.80.1, а lan1 назначается 172.23.80.2. (см. ниже вывод ifconfig и мой /etc/network/interfaces).

Моя проблема в том, что когда я подключаюсь через ssh с отдельного компьютера, я всегда получаю соединение с того же MAC-адреса сервера, независимо от ip, который я использовал в вызове ssh.

Позвольте мне описать следующий эксперимент, который показывает мою проблему. Я использую три терминала (term1, term2 и term3) на моем настольном компьютере Ubuntu

term1:

arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.0.1               ether   00:50:7f:9d:2d:30   C                     wlan0
172.23.80.1                      (incomplete)                              wlan0

term2:

ssh me@172.23.80.1
me@172.23.80.1's password: 
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686)

* Documentation:  https://help.ubuntu.com/
Last login: Thu Aug 16 12:37:48 2012 from 172.23.128.11
me@FERMI:~$ 

term1:

arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.0.1               ether   00:50:7f:9d:2d:30   C                     wlan0
172.23.80.1              ether   00:0d:61:22:3d:d6   C                     wlan0

term3:

ssh me@172.23.80.2
me@172.23.80.2's password: 
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686)

* Documentation:  https://help.ubuntu.com/
Last login: Thu Aug 16 13:37:12 2012 from 172.23.128.11
me@FERMI:~$ 

term1:

arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.23.80.2              ether   00:0d:61:22:3d:d6   C                     wlan0
172.16.0.1               ether   00:50:7f:9d:2d:30   C                     wlan0
172.23.80.1              ether   00:0d:61:22:3d:d6   C                     wlan0

Как видно из этого последнего arp, оба ssh-соединения обслуживаются одним NIC на сервере, даже если два ip были назначены разным NIC. Это моя проблема.

Вот моя конфигурация сервера:

me@FERMI:~$ ifconfig
lan0      Link encap:Ethernet  HWaddr 00:0d:61:22:3d:d6  
          inet addr:172.23.80.1  Bcast:172.31.255.255  Mask:255.240.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1452 errors:0 dropped:0 overruns:0 frame:0
          TX packets:496 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:113691 (113.6 KB)  TX bytes:72934 (72.9 KB)

lan1      Link encap:Ethernet  HWaddr 00:19:5b:68:93:57  
          inet addr:172.23.80.2  Bcast:172.31.255.255  Mask:255.240.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1103 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:85747 (85.7 KB)  TX bytes:684 (684.0 B)
          Interrupt:22 Base address:0x9000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:700 (700.0 B)  TX bytes:700 (700.0 B)


me@FERMI:~$ cat /etc/network/interfaces 
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto lan0 
iface lan0 inet dhcp

auto lan1 
iface lan1 inet dhcp


me@FERMI:~$ cat /etc/udev/rules.d/70-persistent-net.rules 
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x1186:/sys/devices/pci0000:00/0000:00:1e.0/0000:03:02.0 (sundance)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:19:5b:68:93:57", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="lan1"

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:03.0/0000:02:01.0 (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:61:22:3d:d6", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="lan0"


me@FERMI:~$ route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         OHM.UNIVERSE    0.0.0.0         UG    100    0        0 lan0
172.16.0.0      *               255.240.0.0     U     0      0        0 lan0
172.16.0.0      *               255.240.0.0     U     0      0        0 lan1


me@FERMI:~$ cat /proc/sys/net/ipv4/ip_forward
0


me@FERMI:~$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.23.128.11            ether   00:18:de:02:f0:5c   C                     lan0
172.16.0.1               ether   00:50:7f:9d:2d:30   C                     lan0


me@FERMI:~$ sudo ufw status
Status: inactive

3 ответа

Ваши сетевые карты связаны с отдельными IP-адресами. Проблема в маршруте по умолчанию. Выход из route показывает, что маршрутизация по умолчанию идет через сетевой адаптер lan0.

Чтобы удовлетворить вашу претензию, просто удалите маршрут по умолчанию с ip route del default или же route del default,

Однако после этого вы не сможете маршрутизировать вне вашей сети. Если вы хотите, то полезно создать две подсети, например, 172.23.80.0 и 172.23.81.0 и направить их отдельно через ip route 172.23.80.0/24 via 172.23.80.1 dev lan0 а также ip route 172.23.81.0/24 via 172.23.81.1 dev lan1, Например

# / etc / network / interfaces
# Основной сетевой интерфейс
авто Lan1
iface lan1 inet dhcp
маршрут после дефолта по умолчанию
IP-маршрут post-up 172.23.81.0/24 через 172.23.81.1 dev lan1

Также возможно, но не проверено

маршрут по умолчанию
ip route add 172.23.80.1/32 через 172.23.80.1 dev lan0
ip route add 172.23.80.2/32 через 172.23.80.2 dev lan1

Вы могли бы использовать iptables принудительно изменить исходящие MAC/IP-адреса для пакетов на подключающийся компьютер.

Итак, я хотел бы предварить это, сказав iptables навыки не являются твердыми. Но я считаю, что @chronospoon прав насчет недостатка ответа @bersch, хотя он выглядит почти там.

В любом случае, я немного искал и нашел LARTC (Linux Advanced Routing and Traffic Control). Существует раздел с разделением доступа, который выглядит так, как будто объясняет, что именно вы хотите. Я процитирую:

Во-первых, как маршрутизировать ответы на пакеты, приходящие через определенного поставщика, скажем, провайдера 1, снова возвращаться через того же провайдера.

Давайте сначала установим несколько символических имен. Пусть $IF1 будет именем первого интерфейса (if1 на рисунке выше), а $IF2 - именем второго интерфейса. Затем пусть $IP1 будет IP-адресом, связанным с $IF1, а $IP2 - IP-адресом, связанным с $IF2. Далее, пусть $P1 будет IP-адресом шлюза у провайдера 1, а $P2 - IP-адрес шлюза у провайдера 2. Наконец, пусть $P1_NET будет IP-сетью, в которой находится P1, а $P2_NET - IP-сетью $P2 находится в.

Один создает две дополнительные таблицы маршрутизации, скажем, T1 и T2. Они добавлены в /etc/iproute2/rt_tables. Затем вы настраиваете маршрутизацию в этих таблицах следующим образом:

  ip route add $P1_NET dev $IF1 src $IP1 table T1
  ip route add default via $P1 table T1
  ip route add $P2_NET dev $IF2 src $IP2 table T2
  ip route add default via $P2 table T2

Ничего особенного, просто создайте маршрут к шлюзу и создайте маршрут по умолчанию через этот шлюз, как вы это сделали бы в случае отдельного вышестоящего поставщика, но поместили маршруты в отдельную таблицу для каждого поставщика. Обратите внимание, что сетевого маршрута достаточно, так как он говорит вам, как найти любой хост в этой сети, включая шлюз, как указано выше. Далее вы настраиваете основную таблицу маршрутизации. Хорошая идея направить вещи к непосредственному соседу через интерфейс, связанный с этим соседом. Обратите внимание на аргументы `src', они гарантируют, что выбран правильный исходящий IP-адрес.

    ip route add $P1_NET dev $IF1 src $IP1
    ip route add $P2_NET dev $IF2 src $IP2

Затем, ваши предпочтения для маршрута по умолчанию:

    ip route add default via $P1

Далее вы устанавливаете правила маршрутизации. Они на самом деле выбирают, с какой таблицей маршрутизации идти. Вы хотите убедиться, что вы маршрутизируете данный интерфейс, если у вас уже есть соответствующий адрес источника:

    ip rule add from $IP1 table T1
    ip rule add from $IP2 table T2

Этот набор команд гарантирует, что все ответы на трафик, поступающий на конкретный интерфейс, получат ответы от этого интерфейса.

Предупреждение

Читатель Род Роарк отмечает: "Если $P0_NET является локальной сетью, а $IF0 - ее интерфейсом, желательны следующие дополнительные записи:

    ip route add $P0_NET     dev $IF0 table T1
    ip route add $P2_NET     dev $IF2 table T1
    ip route add 127.0.0.0/8 dev lo   table T1
    ip route add $P0_NET     dev $IF0 table T2
    ip route add $P1_NET     dev $IF1 table T2
    ip route add 127.0.0.0/8 dev lo   table T2

'
Теперь это всего лишь базовая настройка. Он будет работать для всех процессов, запущенных на самом маршрутизаторе, и для локальной сети, если он маскируется. Если это не так, то у вас либо есть IP-пространство от обоих провайдеров, либо вы хотите маскироваться под одного из двух провайдеров. В обоих случаях вы захотите добавить правила, выбирающие, из какого провайдера маршрутизировать, исходя из IP-адреса машины в локальной сети.

Другие вопросы по тегам