Несколько интерфейсов Ethernet
У меня есть две сетевые карты, настроенные так:
eth0 Link encap:Ethernet HWaddr 00:19:d1:31:08:e8
inet addr:192.168.5.104 Bcast:192.168.5.255 Mask:255.255.255.0
inet6 addr: fe80::219:d1ff:fe31:8e8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4564126 errors:590 dropped:0 overruns:0 frame:329
TX packets:9707383 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1151788275 (1.0 GiB) TX bytes:189318786 (180.5 MiB)
Interrupt:20 Memory:e0300000-e0320000
eth1 Link encap:Ethernet HWaddr 00:e0:4c:51:0d:55
inet addr:85.255.103.4 Bcast:85.255.103.255 Mask:255.255.255.0
inet6 addr: fe80::2e0:4cff:fe51:d55/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5466 errors:0 dropped:0 overruns:0 frame:0
TX packets:499 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:518961 (506.7 KiB) TX bytes:34236 (33.4 KiB)
Interrupt:22 Base address:0x1000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:136 errors:0 dropped:0 overruns:0 frame:0
TX packets:136 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:15556 (15.1 KiB) TX bytes:15556 (15.1 KiB)
IP-маршрут:
$ ip route
192.168.5.0/24 dev eth0 proto kernel scope link src 192.168.5.104
85.255.103.0/24 dev eth1 proto kernel scope link src 85.255.103.4
default via 192.168.5.1 dev eth0
default via 85.255.103.1 dev eth1
Когда я пингую IP-адрес eth1, я не получаю ответа.
С помощью tcpdump я понял, что на все эхо-запросы ICMP, отправленные на eth1, отвечают через интерфейс eth0.
Как мне добиться, чтобы оба интерфейса работали правильно? Если я пингую eth1, он должен вернуть ответ и на eth1.
У eth0 более быстрое интернет-соединение, я просто хочу сохранить eth1 и проходить через него, когда приложение привязывается к этому конкретному ip.
3 ответа
Удалите шлюз, определенный для eth0 (192.168.5.1). Если вам нужно несколько маршрутов по умолчанию, вам придется использовать iproute2 для создания политики для него.
Кажется, вам нужно удалить второй шлюз по умолчанию:
route del default 192.168.5.1
После этого 85.255.103.4 IP будет работать, но у вас будут проблемы с подсетью 192.168.5.0/24. Чтобы это исправить, вам нужно направить все пакеты с исходным IP-адресом 192.168.5.10 через 192.168.5.1. Для этого используйте политику маршрутизации:
echo '300 eth0tbl' >> /etc/iproute2/rt_tables
ip route add default via 192.168.5.1 table eth0tbl
ip rule add from 192.168.5.10 table eth0tbl
В таких ситуациях лучше всего быть явным.
Существует множество причин, по которым вы не сможете выполнить ping или ssh к IP на eth1, но для начала вам следует настроить маршрутизацию на основе политик, которая заставляет трафик использовать тот же интерфейс для TX, который использовался для RX.
Вы хотите, чтобы трафик использовал eth0 для более быстрого соединения, поэтому мы оставим это для маршрута по умолчанию.
Далее мы определим таблицы, создадим правила и затем создадим маршруты.
Определите две таблицы в /etc/iproute2/rt_tables следующим образом:
100 eth0if 101 eth1if
Создайте два правила (трафик TX из 192.168.5.104 принудительно использует таблицу eth0if и т. Д.):
from 192.168.5.104 table eth0if from 85.255.103.4 table eth1if
Затем создайте маршруты для каждого интерфейса:
Для eth0:
default via 192.168.5.1 dev eth0 table eth0if 192.168.5.0/24 via 192.168.5.104 dev eth0 table eth0if 192.168.5.0/24 via 192.168.5.104 dev eth0 table main
Для eth1:
default via 85.255.103.1 dev eth1 table eth1if 85.255.103.0/24 via 85.255.103.4 dev eth1 table eth1if 85.255.103.0/24 via 85.255.103.4 dev eth1 table main
Теперь любое сокетное соединение с eth1 должно отвечать от eth1 и быть успешным. Однако любое удаленное соединение, выполненное из этого ящика, которое не предназначено для 85.255.103.0/24, все равно будет использовать маршрут по умолчанию (eth0).
ПРАВИЛО: (Если маршрут не существует, используется по умолчанию)
Если вам нужно использовать eth1 для исходящих соединений, когда вы используете программное обеспечение, которое не позволяет вам определить исходный интерфейс /IP, вам придется создать маршруты для него.
Например, если вам нужен маршрут хоста к определенному серверу Google, вы должны использовать:
74.125.224.194/32 via 85.255.103.1 dev eth1 src 85.255.103.4 table eth1if
Или, если вы хотите сделать то же самое с подсетью, вы бы:
74.125.224.0/24 via 85.255.103.1 dev eth1 src 85.255.103.4 table eth1if