Таблица ip-маршрутизации
Содержание:
- Дополнительные возможности маршрутизации
- Добавление альтернативного маршрута для «избранных» хостов
- How to view or display Linux routing table
- Linux Set Up Routing with ip command and save it to a configuration file
- Получение информации о построенном маршруте
- How to Modify a Static Route Entry on Windows 10
- View the Windows Routing Table
- Forwarding Information Base
- Встроенные средства создания и настройки маршрутных таблиц в Linux
- Построение маршрута с возможностью вызвать такси
- Wildcard Routes
Дополнительные возможности маршрутизации
Я уже упоминал команду Route Print, но существует множество вариантов использования команды ROUTE. Ее синтаксис следующий:
Переключатель –f
является необязательным. Он указывает Windows на необходимость очистить таблицы маршрутизации от пунктов шлюза. Если данный переключатель используется совместно с другими командами, то пункты шлюза будут удалены перед выполнением других инструкций, содержащихся в команде.
Переключатель –р
делает определенный маршрут постоянным. Обычно при перезагрузке сервера, любые определенные через команду ROUTE маршруты удаляются. Переключатель –р указывает на необходимость сохранять данный маршрут даже при перезагрузке системы.
Командная часть в синтаксисе ROUTE проста. Она может состоять из 4 вариантов: PRINT, ADD, DELETE, и CHANGE. Я уже говорил о команде ROUTE PRINT, но и у нее могут быть варианты. Например можно использовать специальные символы в команде. Если нужно напечатать маршруты для подсети 192.x.x.x, можно воспользоваться командой ROUTE PRINT 192*.
Команда ROUTE DELETE работает также как и ROUTE Print. Просто введите ROUTE DELETE, а следом место назначения или шлюз, который необходимо удалить из таблицы маршрутизации. Например, при желании удалить шлюз 192.0.0.0 введите ROUTE DELETE 192.0.0.0.
Все выше сказанное касается и команд ROUTE CHANGE и ROUTE ADD. При введении данной команды следует определить место назначения, маску подсети и шлюз. Также можно указать метрики и интерфейс. Например, добавить место назначения с простым синтаксисом можно следующим образом:
В данной команде 147.0.0.0 является местом назначения, 255.0.0.0 – маской подсети для места назначения, а 148.100.100.100 – адресом шлюза. Можно расширить команду с помощью параметров METRIC и IF:
Параметр metric необязателен, но он определяет метрику и количество отрезков для маршрута. Параметр IF указывает Windows, какой адаптер использовать. В нашем случае Windows использует сетевой адаптер, который связан с ним в качестве интерфейса 1. При отсутствии данного параметра используется лучший интерфейс.
Добавление альтернативного маршрута для «избранных» хостов
Рассмотрим классический пример, когда в локальной сети необходимо направить избранные хосты по альтернативному маршруту. Предположим, что в локальной сети 10.0.0.0/24 имеется некоторый шлюз с двумя интерфейсами, имеющими IP-адреса 10.0.0.1/24 — смотрит в локальную сеть, 12.13.14.15/24 — смотрит в глобальную сеть. Маршрут по умолчанию проходит через IP 12.13.14.1. При этом необходимо, чтобы хост 10.0.0.100 был направлен по маршруту 12.13.14.100. Для решения этой задачи, необходимо:
Добавить описание дополнительной в файл /etc/iproute2/rt_tables (это действие необязательно, можно использовать просто номер таблицы)
# echo 100 newtable >> /etc/iproute2/rt_tables
Добавить , которое будет направлять пакеты с адресом отправителя 10.0.0.100 в описанную на прошлом шаге
# ip rule add from 10.0.0.100 lookup newtable # # или # ip rule add from 10.0.0.100 lookup 100 # # после выполнения данной команды список правил примет следующий вид # ip rule show 0: from all lookup local 32765: from 10.0.0.100 lookup newtable 32766: from all lookup main 32767: from all lookup default
Добавить по умолчанию, отправляющий пакеты на хост 12.13.14.100 в новую
# ip route add default via 12.13.14.100 dev eth1 table newtable # # после внесенных изменений необходимо очистить кэш маршрутов, чтобы ядро обновило информацию о новых маршрутах # ip route flush cache # # после данных изменений таблица newtable (id 100) будет иметь следующий вид # ip route show table 100 default via 12.13.14.100 dev eth1
Давайте рассмотрим путь пакета, согласно наших правил. Хост 10.0.0.100 отправляет пакет некоторому узлу 7.8.9.10, соответственно, в заголовках пакета источник — 10.0.0.100, назначение — 7.8.9.10. На хосте 10.0.0.100 шлюз по умолчанию — 10.0.0.1, согласно данного правила пакет попадает на шлюз 10.0.0.1. Ядро, получив пакет последовательно с нулевого правила просматривает соответствие пакета заданным в правилах фильтрам/критериям. Пакет подходит под действие правила 0 (0: from all lookup local) и направляется в таблицу маршрутизации local. Но т.к. пакет не принадлежит локальной системе и он не широковещательный, то маршрут в данной таблице не найден и пакет возвращается в RPDB для просмотра следующего правила. Следующее правило на пути пакета — 32765: from 10.0.0.100 lookup newtable. Пакет под критерии данного правила подходит, поэтому направляется в таблицу newtable (id 100). Согласно данной таблицы все пакеты направляются на единственный маршрут по умолчанию — 12.13.14.100. Пакет уходит согласно этого правила на указанный хост. Следующие правила не обрабатываются
Обращаю внимание, что в данном разборе я не учитывал прохождение пакета через
Краткие итоги
В статье я рассмотрел работу механизма Routing Policy DataBase (RPDB) — маршрутизации на основе политик. Я долго вникал в работу этого механизма и постарался изложить свое понимание всего происходящего в ядре. Доходчивой документации на русском языке по данному вопросу в сети я не нашел. Даже всеми хваленый LARTC не дает прозрачного понимания RPDB. Надеюсь, что мои мысли помогут вам понять основные принципы. Подводя итог всему вышесказанному можно свести основной смысл к тому, что пакет в порядке приоритета правил (от 0 до 32767) сверяется с каждым правилом и в случае, если подходит под заданные условия, над пакетом совершается какое-либо действие (обычно отправляется в указанную таблицу). Если пакет в заданной таблице находит свой маршрут, то он отправляется по заданному маршруту. Если не находит — возвращается к списку правил для обработки в следующем правиле. Управление всем этим делом осуществляется командой ip с различными параметрами. В дальнейших статьях я постараюсь рассмотреть более интересные примеры реализации маршрутизации на основе политик. Кроме того, я бы обязательно посоветовал вам почитать приведенные ниже ссылки для более глубокого ознакомления.
Что еще почитать
Хорошая статья о том,ч то такое маршрут по умолчанию — http://xgu.ru/wiki/Маршрут_по_умолчанию
RFC 1394 (что такое TOS и с чем его едят) — http://www.ietf.org/rfc/rfc1349.txt
Обязательно к прочтению (Policy Routing With Linux) — http://www.policyrouting.org/PolicyRoutingBook/ONLINE/TOC.html
Guide to IP Layer Network Administration with Linux — http://www.linux-ip.net/html/
Команда ip на буржуйском от русского автора — http://www.linux-ip.net/gl/ip-cref/
Linux Advanced Routing & Traffic Control HOWTO — http://www.opennet.ru/docs/RUS/LARTC/index.html
How to view or display Linux routing table
Type the following command: OR Sample Outputs:
10.0.31.18 dev ppp0 proto kernel scope link src 10.1.3.103 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.1 192.168.1.0/24 dev ra0 proto kernel scope link src 192.168.1.106 169.254.0.0/16 dev eth0 scope link metric 1000 10.0.0.0/8 dev ppp0 scope link default via 192.168.1.1 dev ra0 metric 100
Each entry is nothing but an entry in the routing table (Linux kernel routing table). For example, the following line represents the route for the local network. All network packets to a system in the same network are sent directly through the device ra0:
192.168.1.0/24 dev ra0 proto kernel scope link src 192.168.1.106
Our default route is set via ra0 interface i.e. all network packets that cannot be sent according to the previous entries of the routing table are sent through the gateway defined in this entry i.e 192.168.1.1 is our default gateway.
Linux Set Up Routing with ip command and save it to a configuration file
All routing settings made with the ip tool (or route command) are lost when you reboot Linux server. See our previous article about configuring static routes in a Debian/Ubuntu or CentOS/Red Hat Enteprise Linux systems.
How to add a static route on Ubuntu or Debian
Here is a sample for eth0 displayed using the cat command
# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.2.24 gateway 192.168.2.254 |
Add a static route on CentOS / RHEL
Create a file named /etc/sysconfig/network-scripts/route-eth0 for interface eth0 and add static route entry: Save and close the file. Restart the networking service: OR
Recommended readings:
- Debian Linux Configure Network Interface Cards – IP address and Netmasks
- CentOS / Redhat Enterprise Linux 5 configure network interface card
- How to setup Linux as a router (iptables configuration)
- Man pages: route(8)
Получение информации о построенном маршруте
Информация о построенных маршрутах хранится в мультимаршруте. Получить ссылку на этот объект можно с помощью метода :
Скопировано
Метод возвращает , который будет разрешен объектом multiRouter.MultiRoute или отклонен сообщением об ошибке. Мультимаршрут будет содержать ссылки на построенные маршруты.
Ниже приведен пример, как получить информацию об активном маршруте: длину, время прохождения и сведения о перекрытых участках дорог:
Скопировано
Через объект multiRouter.MultiRoute также можно изменить внешний вид маршрута (например, изменить цвет или толщину линий):
Скопировано
Посмотреть полный код примера
Скопировано
How to Modify a Static Route Entry on Windows 10
Let’s say that after the recent network change, now the network 10.10.10.0 should be routed through 10.10.29.200 gateway. Obviously you have to modify the existing route for this network and change the gateway to 10.10.29.200, how to modify it?
You can’t modify an existing route entry. The simple method is to delete it and add the new route entry. So, in this case, you would perform below commands.
Route delete 10.10.10.0 Route add –p 10.10.10.0 mask 255.255.255.0 10.10.29.200
We hope this simple guide will be helpful in understanding the route add, delete and print commands in Windows 10 client PC and other server Operating Systems. Make sure you open the command prompt or PowerShell as Administrator to perform these commands. If you want to use cosmetic variables to identify the fast hops to reach a network, you can use the metric key as described at Microsoft site here.
View the Windows Routing Table
Before you get started adding routes, it may be helpful to view the routing table first. Fire up Command Prompt by hitting Windows+X and then selecting “Command Prompt (Admin)” on the Power Users menu.
Note: If you see PowerShell instead of Command Prompt on the Power Users menu, that’s a switch that came about with the Creators Update for Windows 10. It’s very easy to switch back to showing the Command Prompt on the Power Users menu if you want, or you can give PowerShell a try. You can do pretty much everything in PowerShell that you can do in Command Prompt, plus a lot of other useful things.
RELATED: How to Put the Command Prompt Back on the Windows+X Power Users Menu
At the Command Prompt, type the following command and hit Enter:
route print
You’ll see a long list of network destinations and the gateways to which packets are forwarded when they are headed to that destination. Unless you’ve already added static routes to the table, everything you see here will be dynamically generated.
Forwarding Information Base
FIB (Forwarding Information Base) contains copy of information that is necessary for packet forwarding:
- all active routes
- policy routing rules
By default (when no routing-mark values are used) all active routes are in the main table, and there is only one hidden implicit rule («catch all» rule) that uses the main table for all destination lookups.
Routing table lookup
FIB uses following information from packet to determine it’s destination:
- source address
- destination address
- source interface
- routing mark
- ToS (not used by RouterOS in policy routing rules, but it is a part of routing cache lookup key)
Possible routing decisions are:
- receive packet locally
- discard packet (either silently or by sending ICMP message to the sender of the packet)
- send packet to specific IP address on specific interface
Results of routing decision are remembered in the routing cache. This is done to improve forwarding performance. When another packet with the same source address, destination address, source interface, routing mark and ToS is routed, cached results are used. This also allows to implement per-connection load balancing using ECMP routes, because values used to lookup entry in the routing cache are the same for all packets that belong to the same connection and go in the same direction.
If there is no routing cache entry for this packet, it is created by running routing decision:
- check that packet has to be locally delivered (destination address is address of the router)
- process implicit policy routing rules
- process policy routing rules added by user
- process implicit catch-all rule that looks up destination in the main routing table
- return result is «network unreachable»
Result of routing decision can be: |
|
Rules that do not match current packet are ignored. If rule has action drop or unreachable, then it is returned as a result of the routing decision process. If action is lookup then destination address of the packet is looked up in routing table that is specified in the rule. If lookup fails (there is no route that matches destination address of packet), then FIB proceeds to the next rule. Otherwise:
- if type of the route is blackhole, prohibit or unreachable, then return this action as the routing decision result;
- if this is a connected route, or route with an interface as the gateway value, then return this interface and the destination address of the packet as the routing decision result;
- if this route has IP address as the value of gateway, then return this address and associated interface as the routing decision result;
- if this route has multiple values of nexthop, then pick one of them in round robin fashion.
Result of this routing decision is stored in new routing cache entry.
Встроенные средства создания и настройки маршрутных таблиц в Linux
Для просмотра текущей таблицы маршрутизации на узле с установленной ОС Linux1 используется команда netstat -r или route:
$ netstat -r
Kernel IP routing table
Destination | Gateway | Genmask | Flags | MSS | Window | irtt | Iface |
---|---|---|---|---|---|---|---|
192.168.10.0 | * | 255.255.255.0 | U | eth0 | |||
default | 192.168.10.254 | 0.0.0.0 | UG | eth0 |
В этом примере в таблице маршрутизации присутствуют только две записи. Первая указывает на наличие доступа в подсеть 192.168.10.0. Так как узел принадлежит данной подсети, в использовании шлюза нет необходимости. Согласно второй записи, весь остальной трафик с этого узла перенаправляется на шлюз 192.168.10.254.
Все настройки сетевого интерфейса eth0 (в данном случае единственного) хранятся в конфигурационном файле /etc/sysconfig/network-scripts/ifcfg-eth0:
DEVICE=eth0 HWADDR=00:1D:60:07:92:28 IPADDR=192.168.10.14 NETMASK=255.255.255.0 BROADCAST=192.168.10.255 ONBOOT=yes
При добавлении второго сетевого интерфейса eth1 с IP-адресом 192.168.11.4 потребуется изменение конфигурации таблицы маршрутизации при помощи утилиты route2:
# route add -net 192.168.11.0 netmask 255.255.255.0 dev eth1 # netstat -r
Kernel IP routing table
Destination | Gateway | Genmask | Flags | MSS | Window | irtt | Iface |
---|---|---|---|---|---|---|---|
192.168.10.0 | * | 255.255.255.0 | U | eth0 | |||
192.168.11.0 | * | 255.255.255.0 | U | eth1 | |||
default | 192.168.10.254 | 0.0.0.0 | UG | eth0 |
Настройки сетевого интерфейса eth1 заносятся в конфигурационный файл /etc/sysconfig/network-scripts/ifcfg-eth1:
DEVICE=eth1 HWADDR=00:0A:48:05:7B:DB IPADDR=192.168.11.4 NETMASK=255.255.255.0 BROADCAST=192.168.11.255 ONBOOT=yes
Маршрутизатор сети 192.168.11.0 может быть связан с другой подсетью 192.168.12.0. В этом случае при необходимости настраивается так называемый транзитный маршрут, по которому пакеты, приходящие на eth1 с назначением в подсеть 192.168.12.0, будут перенаправлены на шлюз 192.168.11.1:
# route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.11.1 # netstat -r
Kernel IP routing table
Destination | Gateway | Genmask | Flags | MSS | Window | irtt | Iface |
---|---|---|---|---|---|---|---|
192.168.10.0 | * | 255.255.255.0 | U | eth0 | |||
192.168.11.0 | * | 255.255.255.0 | U | eth1 | |||
192.168.12.0 | 192.168.11.1 | 255.255.255.0 | UG | eth1 | |||
default | 192.168.10.254 | 0.0.0.0 | UG | eth0 |
Для того чтобы внесенные изменения сохранились после перезагрузки узла, необходимо создать конфигурационный файл /etc/sysconfig/network-scripts/route-eth1, содержащий запись о транзитном маршруте:
192.168.12.0/24 via 192.168.11.1
Для корректной работы двух и более сетевых интерфейсов на одном узле также необходимо в файле /etc/sysctl.conf установить значение параметра net.ipv4.ip_forward равным 1. Последним шагом будет перезагрузка сервиса network:
# /etc/init.d/network restart
1 Здесь и далее под ОС Linux подразумевается дистрибутив CentOS 5.2.
2 Здесь описаны только некоторые команды. Для более подробного изучения см. man route(8).
Построение маршрута с возможностью вызвать такси
Панель маршрутизации позволяет строить маршруты с возможностью вызова такси. На карте показывается схема проезда, а также информация о поездке по данным «Яндекс.Такси» (продолжительность, примерная стоимость). При нажатии на кнопку Заказать такси откроется страница с заданным маршрутом.
Внимание. На сайтах, использующих политику защиты контента, нужно подключить .. Чтобы построить маршрут с возможностью вызова такси, в типе маршрутизации нужно указать «taxi»:
Чтобы построить маршрут с возможностью вызова такси, в типе маршрутизации нужно указать «taxi»:
Скопировано
Посмотреть полный код примера
Скопировано
Wildcard Routes
Wildcard routes allow a route to respond to dynamic segments of a URI. If a route has dynamic URI segments, they will be passed in to the controller as an associative array of arguments.
Dynamic URI segments can also be limited to match certain requirements.
There are several built in conditions for dynamic segments of a URI.
- number
- word
- alphanum_dash
- slug
- uuid
Dynamic segments can also be set as any regular expression such as {id:+}.
For convenience, you can also register your own aliases for a particular regular expression using the method on .
For example:
The above pattern matcher will create an internal regular expression string: , where will interpret to , the variable listed before the colon.