У меня есть компьютер (ядро 3.2.0-23-generic ), который 192.168.1.2/24
настроен для eth0
интерфейса, а также использует 192.168.1.1
и 192.168.1.2
адреса для tun0
интерфейса:
root@T42:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:41:54:01:93 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.2/24 scope global eth0
inet6 fe80::216:41ff:fe54:193/64 scope link
valid_lft forever preferred_lft forever
3: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
4: irda0: <NOARP> mtu 2048 qdisc noop state DOWN qlen 8
link/irda 00:00:00:00 brd ff:ff:ff:ff
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:13:ce:8b:99:3e brd ff:ff:ff:ff:ff:ff
inet 10.30.51.53/24 brd 10.30.51.255 scope global eth1
inet6 fe80::213:ceff:fe8b:993e/64 scope link
valid_lft forever preferred_lft forever
6: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc pfifo_fast state DOWN qlen 100
link/none
inet 192.168.1.1 peer 192.168.1.2/32 scope global tun0
root@T42:~# ip route show dev eth0
192.168.1.0/24 proto kernel scope link src 192.168.1.2
root@T42:~#
Как видно выше, tun0
административно отключен ( ip link set dev tun0 down
). Теперь, когда я получаю запросы ARP 192.168.1.2
, ПК не отвечает на эти запросы:
root@T42:~# tcpdump -nei eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:30:34.875427 00:1a:e2:ae:cb:b7 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.1.2 tell 192.168.1.1, length 46
15:30:36.875268 00:1a:e2:ae:cb:b7 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.1.2 tell 192.168.1.1, length 46
15:30:39.138651 00:1a:e2:ae:cb:b7 > 00:1a:e2:ae:cb:b7, ethertype Loopback (0x9000), length 60:
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
root@T42:~#
Только после того, как я удаляю tun0
интерфейс ( ip link del dev tun0
) компьютер будет отвечать на запрос ARP для 192.168.1.2
на eth0
интерфейсе.
Таблица маршрутизации выглядит одинаково до и после ip link del dev tun0
:
root@T42:~# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.30.51.254 0.0.0.0 UG 0 0 0 eth1
10.30.51.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.1.0 192.168.1.2 255.255.255.0 UG 0 0 0 eth0
root@T42:~# ip link del dev tun0
root@T42:~# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.30.51.254 0.0.0.0 UG 0 0 0 eth1
10.30.51.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.1.0 192.168.1.2 255.255.255.0 UG 0 0 0 eth0
root@T42:~#
Запись о маршрутизации ниже удаляется ip link set dev tun0 down
командой:
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
Однако, хотя таблицы маршрутизации абсолютно одинаковы до и после ip link del dev tun0
команды, реальные решения по маршрутизации, которые примет ядро, не являются:
T42:~# ip route get 192.168.1.1
local 192.168.1.1 dev lo src 192.168.1.1
cache <local>
T42:~# ip link del dev tun0
T42:~# ip route get 192.168.1.1
192.168.1.1 dev eth0 src 192.168.1.2
cache ipid 0x8390
T42:~#
Это ожидаемое поведение? Почему ядро игнорирует таблицу маршрутизации?
источник
tun0
интерфейс отключен, но присутствует. Смотрите выводip route get
команд в моем обновленном первоначальном посте. Однако почему ядро ведет себя так?Ответы:
Ваша таблица маршрутизации точно не игнорируется. Он отменяется таблицей маршрутизации с более высоким приоритетом.
В чем дело
Таблица маршрутизации, которую вы видите при вводе
ip route show
, не единственная таблица маршрутизации, используемая ядром. Фактически, по умолчанию есть три таблицы маршрутизации, и они ищутся в порядке, показанномip rule
командой:Таблица, с которой вы больше всего знакомы
main
, но таблица маршрутизации с самым высоким приоритетомlocal
. Эта таблица управляется ядром для отслеживания локальных и широковещательных маршрутов: другими словами,local
таблица сообщает ядру, как маршрутизировать адреса своих собственных интерфейсов. Это выглядит примерно так:Проверьте эту линию ссылки
tun0
. Это то, что вызывает ваши странные результатыroute get
. Он говорит, что 192.168.1.1 является локальным адресом, что означает, что если мы хотим отправить ответ ARP на 192.168.1.1, это просто; мы отправляем это себе. И поскольку мы нашли маршрут вlocal
таблице, мы прекращаем поиск маршрута и не пытаемся проверить таблицыmain
илиdefault
.Почему несколько таблиц?
Как минимум, приятно иметь возможность печатать
ip route
и не видеть все эти «очевидные» маршруты, загромождающие дисплей (попробуйте набрать текстroute print
на машине с Windows). Это также может служить некоторой минимальной защитой от неправильной конфигурации: даже если основная таблица маршрутизации перепутана, ядро все еще знает, как общаться с самим собой.(Зачем в первую очередь поддерживать локальные маршруты? Поэтому ядро может использовать тот же код поиска для локальных адресов, что и для всего остального. Это упрощает внутреннюю ситуацию.)
Есть и другие интересные вещи, которые вы можете сделать с помощью этой схемы с несколькими столами. В частности, вы можете добавлять свои собственные таблицы и указывать правила их поиска. Это называется «политикой маршрутизации», и если вы когда-нибудь хотели направить пакет на основе его исходного адреса, это как сделать это в Linux.
Если вы делаете особенно сложные или экспериментальные вещи, вы можете добавлять или удалять
local
маршруты самостоятельно, указавtable local
вip route
команде. Если вы не знаете, что делаете, вы, вероятно, перепутаете ядро. И, конечно же, ядро все равно будет продолжать добавлять и удалять свои собственные маршруты, поэтому вам нужно следить за тем, чтобы ваши не перезаписывались.Наконец, если вы хотите увидеть все таблицы маршрутизации одновременно:
Для получения дополнительной информации посетите
ip-rule(8)
страницу руководства или документы iproute2 . Вы также можете попробовать HOWTO Advanced Routing and Traffic Control, чтобы получить примеры того, что вы можете сделать.источник
ip link set dev tun0 down
local 192.168.1.1 dev tun0 proto kernel scope host src 192.168.1.1
local
ip link del dev tun0
ip(8)
: «ip
Написал Алексей Николаевич Кузнецоф и добавил в Linux 2.2».Ваша конфигурация фильтрации обратного пути , вероятно, является проблемой. RFC3704 - раздел 2.4
В дистрибутивах Enterprise Linux (RHEL, CentOS, Scientific Linux и др.), Вероятно, лучший способ решить эту проблему - это изменить
/etc/sysctl.conf
с помощьюrp_filter = 2
Когда в RHEL настроено несколько IP-адресов, из удаленной сети доступен только один. Или почему RHEL игнорирует пакеты, когда маршрут для исходящего трафика отличается от маршрута входящего трафика?
источник
for rp_filter_file in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > "$rp_filter_file"; done
ядро не используетeth0
интерфейс для маршрутизации пакетов на 192.168.1.1. Только после удаленияtun0
интерфейса сip link del dev tun0
ядром начинает использоватьeth0
интерфейс.