OUTPUT top
The output of the kernel routing table is organized in the following columns Destination The destination network or destination host. Gateway The gateway address or '*' if none set. Genmask The netmask for the destination net; '255.255.255.255' for a host destination and '0.0.0.0' for the default route. Flags Possible flags include U (route is up) H (target is a host) G (use gateway) R (reinstate route for dynamic routing) D (dynamically installed by daemon or redirect) M (modified from routing daemon or redirect) A (installed by addrconf) C (cache entry) ! (reject route) Metric The 'distance' to the target (usually counted in hops). Ref Number of references to this route. (Not used in the Linux kernel.) Use Count of lookups for the route. Depending on the use of -F and -C this will be either route cache misses (-F) or hits (-C). Iface Interface to which packets for this route will be sent. MSS Default maximum segment size for TCP connections over this route. Window Default window size for TCP connections over this route. irtt Initial RTT (Round Trip Time). The kernel uses this to guess about the best TCP protocol parameters without waiting on (possibly slow) answers. HH (cached only) The number of ARP entries and cached routes that refer to the hardware header cache for the cached route. This will be -1 if a hardware address is not needed for the interface of the cached route (e.g. lo). Arp (cached only) Whether or not the hardware address for the cached route is up to date.
С этим читают
Настройка параметров сетевых интерфейсов
Давайте разберем некоторые аспекты данных команд. Начнем с аналога команды ifconfig — команда ip с параметром link управляет свойствами сетевого интерфейса:
# ip link 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 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:1d:72:01:ab:93 brd ff:ff:ff:ff:ff:ff 3: irda0: <NOARP> mtu 2048 qdisc noop state DOWN qlen 8 link/irda 00:00:00:00 brd ff:ff:ff:ff 4: vboxnet0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff 5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN qlen 3 link/ppp
Вывод данной команды содержит пронумерованный список интерфейсов, присутствующих в системе. Информация об интерфейсе содержит две строки: в первой указывается имя интерфейса (lo, eth0 и др.), установленные флаги состояния (в фигурных скобках < и >), MTU (Maximum Transmission Unit, максимально допустимый размер фрейма в байтах), тип и размер очереди фреймов; во второй строке — тип соединения, MAC-адрес, широковещательный адрес и т. п.
Некоторые флаги состояния:
- UP — устройство подключено и готово принимать и отправлять фреймы;
- LOOPBACK — интерфейс является локальным и не может взаимодействовать с другими узлами в сети;
- BROADCAST — устройство способно отправлять широковещательные фреймы;
- POINTTOPOINT — соединение типа «точка-точка»
- PROMISC — устройство находится в режиме «прослушивания» и принимает все фреймы.
- NOARP — отключена поддержка разрешения имен сетевого уровня.
- ALLMULTI — устройство принимает все групповые пакеты.
- NO-CARRIER — нет связи (не подключен кабель).
- DOWN — устройство отключено.
Можно также вывести информацию о выбранном интерфейсе, задав его имя в параметре dev:
# ip link show dev eth0
или просто:
# ip link show eth0
Команда ip link также позволяет изменять свойства сетевого интерфейса. Для этого используется параметр set:
iproute:~# ip link show dev eth2 3: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 08:00:27:c9:00:f0 brd ff:ff:ff:ff:ff:ff iproute:~# # установка значения MTU iproute:~# ip link set mtu 1400 eth2 iproute:~# # установка MAC адреса iproute:~# ip link set address 00:11:11:12:FE:09 eth2 iproute:~# # "поднятие" интерфейса iproute:~# ip link set up eth2 iproute:~# ip link show dev eth2 3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000 link/ether 00:11:11:12:fe:09 brd ff:ff:ff:ff:ff:ff iproute:~# # отключение интерфейса iproute:~# ip link set down eth2 iproute:~# ip link show dev eth2 3: eth2: <BROADCAST,MULTICAST> mtu 1400 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:11:11:12:fe:09 brd ff:ff:ff:ff:ff:ff
Указанные тут команды являются аналогами «классических» команд из пакета net-tools:
# ifconfig eth2 mtu 1400 # ifconfig eth2 hw ether 00:11:12:13:14:15 # ifconfig eth2 up # ifconfig eth2 down
Одноадресные протоколы маршрутизации
Существует два типа протоколов маршрутизации для маршрутизации одноадресных пакетов:
- Протокол маршрутизации с дистанционным вектором Distance Vector — это простой протокол маршрутизации, который принимает решение о маршрутизации количества переходов между источником и получателем. Лучшим маршрутом считается маршрут с меньшим количеством перелетов. Каждый маршрутизатор рекламирует свои лучшие маршруты для других маршрутизаторов. В конечном счете, все маршрутизаторы создают свою топологию сети на основе рекламы своих одноранговых маршрутизаторов. Например, протокол маршрутизации информации (RIP).
- Протокол маршрутизации состояния канала Протокол состояния канала — это несколько сложный протокол, чем «Вектор расстояния». Он учитывает состояния ссылок всех маршрутизаторов в сети. Этот метод помогает маршрутам строить общий график всей сети. Затем все маршрутизаторы рассчитывают наилучший путь для маршрутизации. Например, Open Shortest Path First (OSPF) и промежуточная система для промежуточной системы (ISIS).
Creating URLs
URLs could be created using . Let’s assume a route is defined like the following:
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Message\ResponseFactoryInterface; use Yiisoft\Yii\Web\SapiEmitter; use Yiisoft\Yii\Web\ServerRequestFactory; use Yiisoft\Yii\Web\NotFoundHandler; use Yiisoft\Router\Route; use Yiisoft\Router\RouteCollection; use Yiisoft\Router\RouteCollectorInterface; use Yiisoft\Router\Fastroute\UrlMatcher; $request = $container->get(ServerRequestFactory::class)->createFromGlobals(); $responseFactory = $container->get(ResponseFactoryInterface::class); $notFoundHandler = new NotFoundHandler($responseFactory); $collector = $container->get(RouteCollectorInterface::class); $collector->addRoute(Route::get('/test/{id:\w+}', static function (ServerRequestInterface $request, RequestHandlerInterface $next) use ($responseFactory) { $id = $request->getAttribute('id'); $response = $responseFactory->createResponse(); $response->getBody()->write('You are at test with param ' . $id); return $response; })->name('test')); $router = new UrlMatcher(new RouteCollection($collector)); $route = $router->match($request); $response = $route->process($request, $notFoundHandler); $emitter = new SapiEmitter(); $emitter->emit($response, $request->getMethod() === Method::HEAD);
Then that is how URL could be obtained for it:
use Yiisoft\Router\UrlGeneratorInterface; function getUrl(UrlGeneratorInterface $urlGenerator, $parameters = []) { return $urlGenerator->generate('test', $parameters); }
Примеры использования ip
Вот теперь мы дошли к самому интересному — примерам использования утилиты ip Linux. То что я здесь опишу на самом деле лишь маленькая капля из всего того что может утилита ip.
1. Просмотр IP адресов
Чтобы посмотреть все IP адреса, связанные с сетевыми интерфейсами используйте такую команду:
Или:
Для просмотра информации в кратком виде используйте опцию -br:
Можно посмотреть IP адреса только по определённому сетевому интерфейсу, например: enp0s3:
Или:
Можно отобразить только статические IP адреса:
Или только динамические:
2. Добавление IP адреса
Чтобы присвоить IP адрес для устройства нужно использовать команду add. Её общий синтаксис такой:
$ ip addr add IP_адрес/маска dev интерфейс
Например, давайте присвоим тому же интерфейсу enp0s3 IP адрес 10.0.2.100 с маской подсети 255.255.255.0:
Маску можно указать и в сокращённом виде:
3. Удаление IP адреса
Чтобы удалить IP адрес из интерфейса надо использовать команду del. Синтаксис её очень похож на предыдущую команду. Например, удалим IP адрес 10.0.2.100:
Можно удалять IP адреса по одному или удалить все сразу с помощью команды flush:
Или же можно удалить адреса только определённой подсети:
Если вы будете применять эти команды к интерфейсу, с помощью которого у вас работает сеть, то сеть пропадёт и чтобы её вернуть надо будет перезагрузить сетевые службы.
Чтобы посмотреть список сетевых интерфейсов используйте объект link:
Или:
5. Включение или выключение интерфейсов
Для решения этой задачи тоже используется объект link, но с командой set. Синтаксис её такой:
$ ip link set dev интерфейс действие
В качестве действия можно использовать up или down. Например, чтобы отключить интерфейс enp0s3 выполните:
А чтобы включить его обратно:
6. Настройка MTU
Параметр MTU означает размер одного пакета, передаваемого по сети. Этот размер можно изменить с помощью команды set. Например, увеличим MTU для enp0s3 до 4000 тысяч байт:
7. Настройка MAC адреса
Адрес MAC — это физический адрес, который используется для определения какому устройству надо передать сетевой пакет в локальной сети. Прежде чем настраивать MAC адрес ваше устройство надо отключить:
Затем можно установить адрес:
А потом включить интерфейс обратно:
8. Таблица ARP
Именно протокол ARP отвечает за преобразование IP адресов в низкоуровневые MAC адреса. Для того чтобы не отправлять ARP запросы каждый раз в сеть, кэш хранится в таблице ARP на протяжении 20-ти минут. Чтобы посмотреть содержимое таблицы ARP используйте такую команду:
Или
9. Добавление записи в таблицу ARP
Обычно записи в эту таблицу попадают автоматически, но вы можете добавить их и вручную. Для этого используйте команду add объекта neigh:
В этом примере я заставил компьютер думать, что узел с IP 192.168.0.105 это 192.168.0.1. Теперь можно попытаться выполнить ping по этому адресу и оно будет работать, несмотря на то, что реально такого узла в сети нет.
10. Очистка таблицы ARP
Вы можете удалять IP адреса по одному с помощью команды del:
Можно удалить все записи для определённого сетевого интерфейса:
Или очистить таблицу полностью командой flush:
Для просмотра таблицы маршрутизации используйте объект route и команду show:
Или:
12. Добавление маршрута
Синтаксис добавления нового маршрута в таблицу маршрутизации такой:
$ ip route add подсеть/маска via шлюз
Вместо шлюза можно указать сетевой интерфейс с помощью которого надо отправлять пакеты:
$ ip route add подсеть/маска dev устройство
Например, добавим новый маршрут для сети через тот же IP адрес:
Или можно указать сетевой интерфейс через который надо отправлять пакеты для определённой сети:
Настройка
Для настройки таблицы маршрутизации будем использовать команду ip route. Добавим временный статический маршрут 192.168.22.0/24 через шлюз 192.168.168.254.
Для проверки необходимо проверить, проходит ли пакет из сети 192.168.22.0. Для этого будем использовать ip route get.
Как говорилось выше, после перезагрузки Linux все эти добавленные адреса сотрутся. Для того, чтобы данные не стирались, необходимо записать их в файле.
Для Debian:
«/etc/network/interfaces»
Для Red Hat:
«/etc/sysconfig/network-scripts/route-ethX»
Пример:
Здесь:
- post-up — запустить команду после включения интерфейса.
- pre-down — запустить команду перед отключением интерфейса.
- net — задает целевую сеть
- netmask — сетевая маска.
- gw — шлюз.
Не так сложно, как могло показаться. После всей выполненной работы присоединенные маршруты будут работать даже после перезагрузки операционной системы Линукс.
Рассмотрим еще несколько примеров.
Изменяем статический маршрут:
Удаление маршрута:
ЗАКЛЮЧЕНИЕ
Подобная работа написана для краткого рассмотрения функционирования маршрутизации в Линукс, как происходит настройка маршрутизации, а также для чего она необходима.
OPTIONS top
-A family use the specified address family (eg `inet'). Use route --help for a full list. You can use -6 as an alias for --inet6 and -4 as an alias for -A inet -F operate on the kernel's FIB (Forwarding Information Base) routing table. This is the default. -C operate on the kernel's routing cache. -v select verbose operation. -n show numerical addresses instead of trying to determine symbolic host names. This is useful if you are trying to determine why the route to your nameserver has vanished. -e use netstat(8)-format for displaying the routing table. -ee will generate a very long line with all parameters from the routing table. del delete a route. add add a new route. target the destination network or host. You can provide an addresses or symbolic network or host name. Optionally you can use prefixlen notation instead of using the netmask option. -net the target is a network. -host the target is a host. netmask NM when adding a network route, the netmask to be used. gw GW route packets via a gateway. NOTE: The specified gateway must be reachable first. This usually means that you have to set up a static route to the gateway beforehand. If you specify the address of one of your local interfaces, it will be used to decide about the interface to which the packets should be routed to. This is a BSDism compatibility hack. metric M set the metric field in the routing table (used by routing daemons) to M. If this option is not specified the metric for inet6 (IPv6) address family defaults to '1', for inet (IPv4) it defaults to '0'. You should always specify an explicit metric value to not rely on those defaults - they also differ from iproute2. mss M sets MTU (Maximum Transmission Unit) of the route to M bytes. Note that the current implementation of the route command does not allow the option to set the Maximum Segment Size (MSS). window W set the TCP window size for connections over this route to W bytes. This is typically only used on AX.25 networks and with drivers unable to handle back to back frames. irtt I set the initial round trip time (irtt) for TCP connections over this route to I milliseconds (1-12000). This is typically only used on AX.25 networks. If omitted the RFC 1122 default of 300ms is used. reject install a blocking route, which will force a route lookup to fail. This is for example used to mask out networks before using the default route. This is NOT for firewalling. mod, dyn, reinstate install a dynamic or modified route. These flags are for diagnostic purposes, and are generally only set by routing daemons. dev If force the route to be associated with the specified device, as the kernel will otherwise try to determine the device on its own (by checking already existing routes and device specifications, and where the route is added to). In most normal networks you won't need this. If dev If is the last option on the command line, the word dev may be omitted, as it's the default. Otherwise the order of the route modifiers (metric netmask gw dev) doesn't matter.
Таблицы маршрутизации
Вывести таблицы маршрутизации. Ядро принимает решение о применении той или иной таблицы на основании адреса источника пакета. Эти таблицы применимы для всех пакетов.
# ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
Вывести содержимое таблицы local.
# ip route show table local
Таблица local. Пакет при выборе пути к месту назначения проверяется правилом с наименьшим приоритетом. Правило 0 отправит поиск маршрута в таблицу «local».
Таблица local проверяет не адресован ли пакет локальной машине (широковещательный или сетевой адреса интерфейсов). Таблицу local автоматически заполняют команды конфигурации сетевых интерфейсов.
- Таблица main — является основной и именно она используется, если в команде, связанной с маршрутизацией, не указано какую таблицу использовать. При поднятии интерфейсов в неё прописываются маршруты к подсетям интерфейсов, стартовые скрипты также заносят в эту таблицу значение шлюза по-умолчанию. Использование команды route add администратором также может дополнить таблицу маршрутами. В общем случае, таблица main всегда содержит подходящий для пакета маршрут (например шлюз по-умолчанию).
- Таблица default изначально пуста.
-
Модификация таблицы маршрутизации:
Добавление маршрута через шлюз: ip route add 172.16.10.0/24 via 192.168.1.1 Добавление маршрута через интерфейс: ip route add 172.16.10.0/24 dev eth0 Маршрут с метрикой: ip route add 172.16.10.0/24 dev eth0 metric 100
Кроме add также поддерживаются и другие действия: del — удалить маршрут; replace — заменить маршрут другим; change — изменить параметры маршрута.
Policy-Routing. Маршрутизация для двух ISP
-
Статическая маршрутизация в Linux
-
Роутинг и policy-routing в Linux при помощи iproute2
-
Принцип работы Routing Policy DataBase
Пример 1. Создание таблицы для маршрутизации пакетов с определенного IP- адреса. Локальная сеть 10.26.95.0/24 имеет выход в Интернет с двух разных провайдеров – основной ISP1 (статика) и резервный ISP2 (Настройка DHCP сервера Linux, FreeBSD).
В файле /etc/iproute2/rt_tables для удобства задаются символьные имена таблиц, это не обязательно так как все таблицы имеют цифровые идентификаторы. Напримерecho ’82 velton’ >> /etc/iproute2/rt_tables
-
Маршрут по умолчанию для таблицы ’82 velton’
ip route add default via 82.117.232.1 table 82
-
Внесем правила маршрутизация для пользователя с IP 10.26.95.5, после чего эта таблица станет доступна в выводе команды ip rule list. Теперь все пользователи шлют пакеты через ISP1, кроме пользователя с IP 10.26.95.251
ip rule add from 10.26.95.25132 table 82
-
Очистить кеш маршрутизатора для вступления в силу сделанных изменений
ip route flush cache
Пример 2. Создание таблицы для маршрутизации, когда часть сетей (AS) нужно маршрутизировать через резервного провайдер ISP2. Например, это может быть дешевая точка обменом трафика или ресурсы провайдера.
-
Создаем как в предыдущем примере маршрут по умолчанию для таблицы ’82 velton’
ip route add default via 82.117.232.1 table 82
-
Прописываем статические маршруты на сети ISP2
ip route add 82.117.224.019 via 82.117.234.15 ip route add 85.90.192.019 via 82.117.234.15
-
Добавим rule для всех сетей
ip rule add to 82.117.224.019 table 82 ip rule add to 85.90.192.019 table 82
-
Очистить кеш маршрутизатора для вступления в силу сделанных изменений
ip route flush cache
Синтаксис и основные опции
Основное назначение команды route – добавление и удаление сетевых маршрутов для системного ядра, а также просмотр содержимого таблицы маршрутизации. Эта команда, хотя и работает в разных UNIX-подобных системах одинаково, однако имеет резко отличающийся синтаксис в зависимости от используемой системы.
В общем случае прототипом команды route является следующая запись:
route add <IP/Net> netmask gw <Gateway IP> dev <Int>X
Например:
$ route add -net 127.0.0.0 netmask 255.0.0.0 metric 1024 dev lo
Эта команда добавит шлюз с обратной связью через виртуальное устройство lo, которое используется для этой цели в Linux-системах. Опции -net и -host используются для указания адреса, характеризующего либо сеть, либо узел соответственно как пункты назначения. Для определения подсети служит опция netmask, для задания приоритета шлюза — опция metric. Сетевой интерфейс обозначается опцией dev. Кроме описанных выше для команды route также существуют и другие используемые ей опции, которые приведены в следующей таблице:
Опция |
Назначение |
del |
Удаление маршрута |
gw |
Шлюз, через который должны достигаться сеть или узел. Задаётся в виде имени узла или точечной записи адреса. |
mss |
Устанавливает значение MTU (максимальную величину пакета) в байтах. |
window |
Устанавливает размер TCP-окна для задаваемого шлюза в байтах. Обычно используется в сетях AX.25. |
irtt |
Устанавливает начальное время отклика для TCP-соединений по данному маршруту в миллисекундах. |
reject |
Задаёт блокирующий маршрут, который должен приводить к остановке процедуры поиска маршрутов. Полезно при скрытии сетей для использования в них шлюз по-умолчанию. |
-F |
Заставляет работать с таблицей маршрутизации ядра. Эта опция в большинстве систем используется по-умолчанию, поэтому часто опускается. |
-C |
Заставляет работать с кэшем маршрутизации ядра. |
-v |
Включает подробный режим работы команды route. |
-n |
Использование числового формата адресов вместо попыток определения символьных наименований узлов. Можно использовать в случае определения проблем с соединениями к DNS. |
-e |
Использовать формат вывода команды netstat для отображения содержимого таблицы маршрутов. Опция -ee сгенерирует самый подробный отчёт с полными наименованиями параметров таблицы маршрутов. |
Уровни сетей и модель OSI
Обычно, сети обсуждаются в горизонтальной плоскости, рассматриваются протоколы сети интернет верхнего уровня и приложения. Но для установки соединений между двумя компьютерами используется множество вертикальных слоев и уровней абстракции. Это означает, что существует несколько протоколов, которые работают друг поверх друга для реализации сетевого соединения. Каждый следующий, более высокий слой абстрагирует передаваемые данные и делает их проще для восприятия следующим слоем, и в конечном итоге приложением.
Существует семь уровней или слоев работы сетей. Нижние уровни будут отличаться в зависимости от используемого вами оборудования, но данные будут передаваться одни и те же и будут иметь один и тот же вид. На другую машину данные всегда передаются на самом низком уровне. На другом компьютере, данные проходят все слои в обратном порядке. На каждом из слоев к данным добавляется своя информация, которая поможет понять что делать с этим пакетом на удаленном компьютере.
Модель OSI
Так сложилось исторически, что когда дело доходит до уровней работы сетей, используется модель OSI или Open Systems Interconnect. Она выделяет семь уровней:
- Уровень приложений — самый верхний уровень, представляет работу пользователя и приложений с сетью Пользователи просто передают данные и не задумываются о том, как они будут передаваться;
- Уровень представления — данные преобразуются в более низкоуровневый формат, чтобы быть такими, какими их ожидают получить программы;
- Уровень сессии — на этом уровне обрабатываются соединения между удаленным компьютерами, которые будут передавать данные;
- Транспортный уровень — на этом уровне организовывается надежная передача данных между компьютерами, а также проверка получения обоими устройствами;
- Сетевой уровень — используется для управления маршрутизацией данных в сети пока они не достигнут целевого узла. На этом уровне пакеты могут быть разбиты на более мелкие части, которые будут собраны получателем;
- Уровень соединения — отвечает за способ установки соединения между компьютерами и поддержания его надежности с помощью существующих физических устройств и оборудования;
- Физический уровень — отвечает за обработку данных физическими устройствами, включает в себя программное обеспечение, которое управляет соединением на физическом уровне, например, Ehternet или Wifi.
Как видите, перед тем, как данные попадут к аппаратному обеспечению им нужно пройти множество слоев.
Модель протоколов TCP/IP
Модель TCP/IP, еще известная как набор основных протоколов интернета, позволяет представить себе уровни работы сети более просто. Здесь есть только четыре уровня и они повторяют уровни OSI:
- Приложения — в этой модели уровень приложений отвечает за соединение и передачу данными между пользователям. Приложения могут быть в удаленных системах, но они работают как будто бы находятся в локальной системе;
- Транспорт — транспортный уровень отвечает за связь между процессами, здесь используются порты для определения какому приложению нужно передать данные и какой протокол использовать;
- Интернет — на этом уровне данные передаются от узла к узлу по сети интернет. Здесь известны конечные точки соединения, но не реализуется непосредственная связь. Также на этом уровне определяются IP адреса;
- Соединение — этот уровень реализует соединение на физическом уровне, что позволяет устройствам передавать между собой данные не зависимо от того, какие технологии используются.
Эта модель менее абстрактная, но мне она больше нравиться и ее проще понять, поскольку она привязана к техническим операциям, выполняемым программами. С помощью каждой из этих моделей можно предположить как на самом деле работает сеть. Фактически, есть данные, которые перед тем, как будут переданы, упаковываются с помощью нескольких протоколов, передаются через сеть через несколько узлов, а затем распаковываются в обратном порядке получателем. Конечные приложения могут и не знать что данные прошли через сеть, для них все может выглядеть как будто обмен осуществлялся на локальной машине.
Изменить маршрут по умолчанию
Вы можете удалить маршрут по-умолчаню с помощью команды ip route del:
# ip route del default via 192.168.1.1 dev enp0s3
1 | # ip route del default via 192.168.1.1 dev enp0s3 |
Чтобы указать новый маршрут по-умолчанию в CentOS используется команда:
# ip route add default via 192.168.1.2 (маршрут через IP адрес шлюза)
1 | # ip route add default via 192.168.1.2 (маршрут через IP адрес шлюза) |
# ip route add default via enp0s3 (маршрут через имя устройства)
1 | # ip route add default via enp0s3 (маршрут через имя устройства) |
Чтобы изменить параметры маршрута по умолчанию, используется команда:
# ip route replace default via 192.168.1.2
1 | # ip route replace default via 192.168.1.2 |
Локальные пакеты
ВходящиеИсходящие
Заключение
БлагодарностиАлександру КлипперуАндрею ГлазковуМарату БабаянуАртёму Чернобаю13. Сети для самых матёрых. Часть тринадцатая. MPLS Traffic Engineering12. Сети для самых матёрых. Часть двенадцатая. MPLS L2VPN11.1. Сети для самых маленьких. Микровыпуск №6. MPLS L3VPN и доступ в Интернет11. Сети для самых маленьких. Часть Одиннадцатая. MPLS L3VPN10. Сети для самых маленьких. Часть десятая. Базовый MPLS9. Сети для самых маленьких. Часть девятая. Мультикаст8.1 Сети для Самых Маленьких. Микровыпуск №3. IBGP8. Сети для самых маленьких. Часть восьмая. BGP и IP SLA7. Сети для самых маленьких. Часть седьмая. VPN6. Сети для самых маленьких. Часть шестая. Динамическая маршрутизация5. Сети для самых маленьких: Часть пятая. NAT и ACL4. Сети для самых маленьких: Часть четвёртая. STP3. Сети для самых маленьких: Часть третья. Статическая маршрутизация2. Сети для самых маленьких. Часть вторая. Коммутация1. Сети для самых маленьких. Часть первая. Подключение к оборудованию cisco0. Сети для самых маленьких. Часть нулевая. Планирование
Iptables
iptables — это утилита фильтрации пакетов, подобная брандмауэру, которая может разрешать или блокировать определенный трафик. Область применения этой утилиты очень широка; вот несколько наиболее распространенных вариантов ее использования.
Syntax:
iptables -L выводит все существующие правила iptables.
iptables -F удаляет все существующие правила.
Следующие команды разрешают трафик с указанного порта на указанный интерфейс:
iptables -A INPUT -i <interface> -p tcp –dport <port-number> -m state –state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o <interface> -p tcp -sport <port-number> -m state – state ESTABLISHED -j ACCEPT
Следующие команды разрешают прохождение трафика с заданного порта к заданному интерфейсу:
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
Этап 3: Привязка сокета к паре IP-адрес/Порт
Сокет уже существует, но еще неполноценный, т.к. ему не назначен внешний адрес, по которому его будут находить транспортные протоколы по заданию подключающихся процессов, а также не назначен порт, по которому эти подключающиеся процессы будут идентифицировать процесс-получатель.
Такое назначение делается с помощью функции , имеющей следующий прототип:
Функция возвращает , если удалось успешно привязать сокет к адресу и порту, и код ошибки в ином случае, который можно расшифровать вызовом — см. итоговый код Этапа 3 далее.
Тут надо немножно притормозить и разобраться в том, что за такая структура типа передается вторым аргументом в функцию . Она очень важна, но достаточно запутанная.
Итак, если посмотреть в её внутренности, то выглядят они очень просто: в ней всего два поля – (1) первое поле хранит семейство адресов, с которыми мы уже встречались выше при инициализации сокета, а (2) второе поле хранит некие упакованные последовательно и упорядоченные данные в размере 14-ти байт. Бессмысленно разбираться детально как именно эти данные упакованы, достаточно лишь понимать, что в этих 14-ти байтах указан и адрес, и порт, а также дополнительная служебная информация для других системных функций .
Но как же явно указать адрес и порт для привязки сокета? Для этого нужно воспользоваться другой структурой, родственной , которая легко приводится к этому типу — структурой типа .
В ней уже более понятные пользователю поля, а именно:
-
Семейство адресов — опять оно ()
-
Порт ()
-
Вложенная структура типа , в которой будет храниться сам сетевой адрес ()
-
Технический массив на 8 байт ()
При приведении типа к нужному нам типу для использования в функции поля Порт (2 байта), Сетевой адрес (4 байта) и Технический массив (8 байт) как раз в сумме дают нам 14 байт, помещающихся в 14 байт, находящихся во втором поле структуры . Первые поля у указанных типов совпадают – это семейство адресов сокетов (указываем ). Из этого видно, что структуры данных типа и тождественны, содержат одну и ту же информацию, но в разной форме для разных целей.
Соответственно, ввод данных для структуры типа выглядит следующим образом:
-
Создание структуры типа :
-
Заполнение полей созданной структуры
-
порт всегда указывается через вызов функции , которая переупаковывает привычное цифровое значение порта типа в побайтовый порядок понятный для протокола TCP/IP (протоколом установлен порядок указания портов от старшего к младшему байту или «big-endian»).
-
Далее нам надо указать сетевой адрес для сокета. Тип этого поля – структура типа , которая по своей сути представляет просто особый «удобный» системным функциям вид обычного строчного IPv4 адреса. Таким образом, чтобы указать этому полю обычный IPv4 адрес, его нужно сначала преобразовать в особый числовой вид и поместить в структуру типа .
Благо существует функция, которая переводит обычную строку типа , содержащую IPv4 адрес в привычном виде с точками-разделителями в структуру типа – функция . Прототип функции следующий:
В случае ошибки функция возвращает значение меньше 0.
Соответственно, если мы хотим привязать сокет к локальному серверу, то наш код по преобразованию IPv4 адреса будет выглядеть так:
Результат перевода IP-адреса содержится в структуре И далее мы передаем уже в нашу переменную типа значение преобразованного адреса:
Вся нужная информация для привязки сокета теперь у нас есть, и она хранится в структуре . Можно смело вызывать функцию , не забыв при этом привести из типа в требуемый функции. Тогда итоговый код Этапа 3 (слава богу закончили) выглядит так: