Як прописати маршрути для роутера freebsd вручну. Динамічна маршрутизація у FreeBSD, BIRD

Дистрибутив фрюхи часто називають найпридатнішим для вирішення прикладних мережевих завданьу локальній мережі. Сьогодні ми займемося рішенням одного з мережевих завдань - налаштуванням шлюзу на Freebsd 10 для доступу до Інтернету з локалки. Це простий, популярний і популярний функціонал сервера, який можна розширювати додатковими можливостями.

Будемо використовувати наступну версію системи для вирішення нашого завдання з налаштування шлюзу:

# uname -v FreeBSD 10.2-RELEASE-p8 #0 r292756M: Sat Dec 26 22:49:34 MSK 2015 root@freebsd:/usr/obj/usr/src/sys/GENERIC

На сервері встановлені 2 мережні карти:

У наше завдання з налаштування програмного freebsd роутера входитиме налаштування маршрутизації на сервері, встановлення та налаштування ipfw, включення nat, налаштування локального dhcpта dns сервера.

Підготовка сервера до налаштування шлюзу

Інформація про видані leases dhcp сервера dnsmasq можна переглянути у файлі /var/db/dnsmasq.leases.

Аналіз мережної активності у freebsd за допомогою iftop

Іноді хочеться подивитися, що відбувається на роутері і хто використовує інтернет Наразі. За замовчуванням, у системі немає готового засобу отримання цієї інформації. На допомогу нам прийде проста програма iftop, яка дозволяє в режимі реального часу переглянути активність на мережному інтерфейсі.

Встановлюємо iftopна налаштований Freebsd шлюз:

# pkg install iftop

Запускаємо iftop із зазначенням інтерфейсу та відображенням використовуваних портів:

# iftop -i hn1 -P

Бачимо цікаву картину — хто, куди, яким портом і з якою швидкістю лізе.

Я для прикладу на одному із комп'ютерів запустив генератор трафіку інтернету. Він зайняв майже весь канал і це стало чудово видно на роутері за допомогою iftop. Звичайно, ця проста утилітане вирішує всіх питань щодо моніторингу мережевої активностіале для представлення поточної картини підходить, якщо вам не потрібно щось більше.

Висновок

Підіб'ємо підсумок того, що зробили. За короткий час налаштували повноцінний шлюз (насправді програмний роутер) на базі Freebsd 10 для забезпечення виходу в інтернет клієнтів за сервером. При цьому забезпечили автоматичне налаштування. Навіть на скромному віртуальний сервертакий шлюз здатний перетравити досить великий трафік.

Все налаштування займає буквально 10-15 хвилин. Основний час йде на збирання ядра. Чим вища версія Freebsd, тим довше вона збирається, незважаючи на те, що швидкості заліза суттєво зростають.

Пройдемося по пунктах і розберемося з тим, що саме ми зробили:

  1. Підготували сервер до налаштування шлюзу.
  2. Перезбирали ядро ​​з потрібними параметрами.
  3. Налаштували ipfw та nat, включили маршрутизацію.
  4. Встановили та налаштували dnsmasq для роздачі мережевих налаштуваньпо dhcp та dns сервера.
  5. Встановили iftop для найпростішого аналізу активності мережі на зовнішньому інтерфейсі.

Цього достатньо для повноцінної роботишлюзу на Freebsd 10. Якщо є необхідність підрахунку користувальницького трафіку або обмеження доступу до певним ресурсам, Можна до нього.

last updated August 30, 2017 H ow do I modify або налаштовано додаткову route for my FreeBSD server? How do I make default route configuration persistent?

Вам потрібно використовувати route command на FreeBSD для автоматичного поводження з мережею routing tables. It provides six commands as follows:
Adblock detected 😱

My website is made possible by displaying on-line advertisements to my visitors. I get it! Ads annoying but they help keep this website running. Це є hard to keep the site running and producing new content when so many people block ads. Please consider donating money to nixCraft via PayPal/, or become a supporter using Patreon.

  1. add: Add a route
  2. flush:Remove all routes.
  3. delete: Delete a specific route
  4. change: Зміна аспектів route (sub as its gateway).
  5. get: Lookup і відтворення route for destination.
  6. monitor: Незабаром report any changes to routing information base, routing lookup mises, or suspected network partitionings.

Task: View / Display FreeBSD Routing Table

За допомогою netstat command with -r option as follows:
$netstat -r
$ netstat -rn
Sample outputs:

Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 61.221 .xx.yy UGS 0 247 em1 10 10.10.110.5 UGS 0 50 em0 10.10.110/26 link#1 0.0 0.0 d: e6:58 :40 UHLW 2 0 em0 1145 61.221 .xx.yy/29 link#2 UC 0 0 em1 61.221 .xx.yy 00:1b:0d:e6:57 :c0 UHLW 2 02 1 link#2 UC 0 0 em1 127.0.0.1 127.0.0.1 UH 0 0 lo0

Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 61.221.xx.yy UGS 0 247 em1 10 10.10.110.5 UGS 0 50 em0 10.10.110/26 link#1 0 0 0 : e6:58:40 UHLW 2 0 em0 1145 61.221.xx.yy/29 link#2 UC 0 0 em1 61.221.xx.yy 00:1b:0d:e6:57:c0 UHLW 2 0 em1x12 link#2 UC 0 0 em1 127.0.0.1 127.0.0.1 UH 0 0 lo0

The first 2 line displays default routes. Для just print IPv4 routing table, enter:
# netstat -4 -r -n
Sample outputs:

Для just print IPv6 routing table, enter:
# netstat -6 -r -n

Task: FreeBSD Set a default route

Всі мережі пакетів, які можуть бути визначені в попередніх точках routing table є sent через following default gateway:
# route add default 192.168.1.254

How do I save routing information to a configuration file?

Якщо ви будете reboot FreeBSD box, routing configuration will be lost i.e. the routing information will not persist. Вам потрібно edit /etc/rc.conf file to set defaultroute:
# vi /etc/rc.conf
Set default route by editing defaultrouter variable:
defaultrouter="192.168.1.254"
Save and close the file.

Рано чи пізно в мережі з кількома маршрутизаторами виникає потреба у динамічній маршрутизації. Що таке динамічна маршрутизація, і навіщо вона потрібна - не розповідатиму, бо це основи про які можна почитати і в Інтернет, ця тема буде про програмне забезпеченнядля забезпечення динамічної маршрутизації.
Однією з самої з відомих програмДля забезпечення динамічної маршрутизації, безумовно, є знаменита quagga. cisco-style (фу мля, убогість яка) інтерфейс консолі, підтримка RIP, OSPF, BGP, ISIS,… Так, товар відомий. Але він має низку своїх недоліків, наприклад:
- не підтримує множинні таблиці маршрутизації (пародія виду table – це просто знущання);
- під такою мною коханою FreeBSD є низка серйозних косяків. Наприклад, з версії 0.99.16 розламаний протокол OSPF. За наявності у системі кількох таблиць маршрутизації - квага переглядає все, через що виникають неприємні косяки з її прямим призначенням;
- єдиний спосібз рантайму керувати квагою – це користуватися її консоллю;
- практично відсутнє API для розробників.
Під Linux вона звичайно працює краще, але все одно відсутня підтримка численних таблиць маршрутизації.

Отже, поговоримо ми сьогодні про такий проект, як BIRD.
І відразу ж анонс продукту з головної сторінкипроекту:
What do we support: - Both IPv4 and IPv6 (use --enable-ipv6 when configuring) - Multiple routing tables - BGP - RIP - OSPF - Static routes - Inter-table protocol - Command-line interface (using the `birdc' client - Soft reconfiguration -- no online commands for changing the configurationв дуже обмежених способах, тільки edit the configuration file and issue a `configure" command or send SIGHUP and BIRD will start using the new configuration, possibly restarting protocols affected by the configuration changes Powerful language for route filtering
Непогано - "Multiple routing tables", "Inter-table protocol"?

Відразу ліричний відступ у FreeBSD множинні таблиці маршрутизації з'явилися з версії 7.1 аж у 2008 році, що дуже пізно. Наприклад, у Linux вони з'явилися аж 1999 року. На жаль, BIRD не вміє працювати з таблицями маршрутизації FreeBSD, у зв'язку з чим довелося його трохи допилювати. Допила легко. Код легко читаємо та чудово розглянутий API.
Таким чином, ми маємо BIRD з підтримкою множинних таблиць маршрутизації у FreeBSD.

Тепер поговоримо трохи про таку можливість BIRD як Inter-table protocol. Що це таке? У BIRD існує поняття «таблиця маршрутизації», ні, це таблиця маршрутизації системи, це внутрішня таблиця BIRD у якій зберігаються маршрути в якийсь спосіб доставлені в BIRD. А доставити їх можна так: статичне оголошеннямаршрутів, імпорт з таблиці маршрутизації системи, маршрути OSPF/BFP/RIP/…
Всі ці маршрути живуть усередині таблиці BIRD, яка називається «таблицею маршрутизації».
Як можна оголосити таблицю? Легко:
table fib0; table fib2;
Це створить усередині BIRD дві таблиці маршрутизації, fib0 і fib2.

Але порожні таблицінам мало цікаві, заповнимо їх статичними маршрутами. Робиться це дуже легко (це приклади робочого конфігураційного файлу):
protocol static (table fib0; route 10.0.0.0/8 via 10.2.2.1; route 193.33.62.0/23 via 10.2.2.1; route 91.202.20.0/22 ​​via 10.2.2.1; 80.9 route 193.203.60.0/22 ​​via "ng0"; route 78.132.128.0/17 via "ng0"; route 213.135.128.0/19 via "ng0"; route 82.179.144.0/90.9 via "ng0"; ) protocol static ( table fib2; route 0.0.0.0/0 via 192.168.130.2; )
Як бачимо, ми населили таблиці певними маршрутами. Причому видно, що шлюз можна задавати як IP-адресу, а можна як інтерфейс (у випадку з «ng0»). Також нічого не заважає вказувати default-маршрути.

Тож ми заселили наші таблички маршрутами. Резонне питання: а як із цих табличок маршрути поєднати з тим, що є в системі? Для цього існує протокол kernel, приклад:
protocol kernel ( table fib0; scan time 20; import none; export all; kernel table 0; ) protocol kernel ( table fib2; scan time 20; import none; export all; kernel table 2; )
Тут ми прив'язуємо fib0 до системної таблиці маршрутизації 0 (це стандартна для FreeBSD) і fib2 до системної таблиці 2.
import - каже, що ми імпортуватимемо з системної таблиці 0 в fib0 (у даному випадку- нічого імпортувати не будемо), а export - вказує, що ми записуватимемо з fib0 в системну таблицю маршрутизації 0 (у цьому прикладі - ми записуватимемо весь fib2 в системну таблицю маршрутизації).
Для fib2 все аналогічно. Думаю, тут більше питань ніяких не повинно виникнути.
scan time - як часто ми синхронізуватимемо ці таблиці. 20 секунд. Що означає ці 20 секунд? Справа в тому, що можлива ситуація, коли BIRD не зміг отримати подію від системи про зміну системної таблиці маршрутизації. Для запобігання такій ситуації таблиця перечитується раз на 20 секунд. Так, це можна вимкнути.

Тепер поговоримо про «Inter-table protocol», що це таке, і навіщо воно власне потрібне.
Поки ми зупинилися у тому - що до системної таблиці маршрутизації 0 прив'язується fib0, а таблиці 2 - fib2. А раптом нам потрібно віддати частину маршрутів з fib0 до fib2? ця операція спричинить не лише передачу маршрутів з fib0 в fib2, але і як наслідок попадання маршрутів з fib0 в системну таблицю маршрутизації 2. Досягається це так само легко, протокол pipe, приклад:
protocol pipe (table fib2; peer table fib0; export none; import all;)
Таблиця fib2 підключається до fib0, причому вона нічого не експортує в fib0, зате імпортує з fib0 всі маршрути. Такий ось хитрий протокол.

Але все це було б нудно і вирішувалося спокійно і без BIRD, якби не одне але. Але є два сусідні маршрутизатори, з якими ми обмінюємося маршрутами:) З сусідами ми спілкуємося за допомогою BGP. Приклад:
protocol bgp (table fib0; local as 64602; neighbor 192.168.135.2 as 64603; export filter rfc1918_reject; import filter rfc1918_reject; ) protocol bgp (table fib0; local as164 64604; export filter rfc1918_reject; import filter rfc1918_reject ; )
Отже, що це все означає? Наша AS має номер 64602, сусіди 64603 та 64604. На кожного сусіда оголошується свій протокол bgp. Кожен із цих протоколів прив'язаний до таблиці fib0 - тобто. всі маршрути, що прийшли/відправлені по bgp будуть записувати/відправлятися в/з fib0. Думаю із цим питань немає. Отже, у нас таблиця fib0 вже містить як статичні маршрутиі bgp.
Також у параметрах export/import з'явилася зміна - filter rfc1918_reject. Як пишуться фільтри - розглянемо нижче, поки скажу - що це фільтр забороняє експорт/імпорт маршрутів із мереж, оголошених у RFC1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16).

Приклад фільтра для написаного вище:
# reject rfc1918 filter filter rfc1918_reject ( if net ~ [ 10.0.0.0/8+, 172.16.0.0/12+, 192.168.0.0/16+ ] then reject; else accept; )
Для написання фільтрів та функцій у BIRD використовується своя мова опису. Синтаксис можна подивитися в офіційної документації. У разі, якщо маршрут належить однієї з підмереж, оголошених у квадратних дужках - він відкидатиметься. 10.0.0.0/8+ - означає, що будь-який маршрут, що належить 10.0.0.0/8 і так само субмережам цієї мережі, відкидатиметься.

Ну і тепер наведу повний прикладфайл конфігурації:
log syslog (debug, trace, info, remote, warning, error, auth, fatal, bug); log stderr all; # Override router ID router id 0.0.0.10; # Define another routing table table fib0; table fib2; # reject rfc1918 filter filter rfc1918_reject ( if net ~ [ 10.0.0.0/8+, 172.16.0.0/12+, 192.168.0.0/16+ ] then reject; else accept; ) # Turn on global de ; protocol kernel ( table fib0; scan time 20; import none; export all; kernel table 0; ) protocol kernel ( table fib2; scan time 20; import none; export all; kernel table 2; ) protocol static ( table fib0; route 10.0 .0.0/8 via 10.2.2.1; route 193.33.62.0/23 via 10.2.2.1; route 91.202.20.0/22 ​​via 10.2.2.1; route 93.186.96.0/20 via0. ng0"; route 78.132.128.0/17 via "ng0"; route 213.135.128.0/19 via "ng0"; route 82.179.144.0/20 via "ng0"; route 195.19.96.0/1 ( table fib2; route 0.0.0.0/0 via 192.168.130.2; ) protocol pipe ( table fib2 ; peer table fib0 ; export none; import all; ) protocol bgp ( table fib0; export filter rfc1918_reject; import filter rfc1918_reject; ) protocol bgp ( table fib0; local as 64602; neighbor 192.168.135.2 as 64603; export filter rfc1918_reject ; ;local as 64602;neighbor 192.168.135.10 as 64604; export filter rfc1918_reject; import filter rfc1918_reject; ) # Це pseudo-protocol watches all interface up/down events. protocol device ( scan time 10; # Scan interfaces every 10 seconds )

Всі шматочки були розглянуті вище, тільки підсумую - що робить такий конфіг:
1. Створюються дві таблиці маршутизації BIRD (fib0 та fib2);
2. Таблиці з п.1 прив'язуються до системних таблиць маршрутизації 0 та 2 відповідно;
3. Дозволяється підкачування маршрутів з fib0 до fib2;
4. Таблиця fib0 також заселяється маршрутами, що потрапили по bgp.

У результаті - у двох системних таблицях маршрутизації знаходяться спільні маршрути:)

PS: Ну і наостанок - що діється на поточний моменту BIRD:
mira# uname FreeBSD mira# birdc show protocols all BIRD 1.2.5 ready. name proto table state since info kernel1 Kernel fib0 up 22:01 Preference: 10 Input filtr: REJECT Output filter: ACCEPT Routes: 0 imported, 13 exported, 0 prefered 0 Import withdraws: 0 0 --- 0 0 Export updates: 16 0 0 --- 16 Export withdraws: 2 --- --- --- 2 kernel2 Kernel fib2 up 22:01 Preference: 10 Input filtr: REJECT Output filtr: ACCEPT Routes: 0 імпортований, 14 exportовано, 0 preferred Route change stats: received rejected filtered ignored accepted Import updates: 0 0 0 0 0 Import withdraws: 0 0 --- 0 0 Export updates: 17 0 0 Вивезення звитратами: 2 --- --- --- 2 static1 Static fib0 up 22:01 Preference: 200 Input filter: ACCEPT Output filter: REJECT Routes: 9 import, 0 export, 18 prefered Route change stats: received rejected filter отримано Import updates: 9 0 0 0 9 Import withdraws: 0 0 --- 0 0 Export updates: 0 0 0 --- 0 Export withdraws: 0 --- --- --- 0 static2 Static fib2 up 22:01 Preference: 200 Input filtr: ACCEPT Output filter: REJECT Routes: 1 імпортований, 0 exportований, 1 prefered Route change stats: received rejected filtred ignored accepted Import updates: 1 0 0 0 1 Import withdraws: 0 0 --- 0 : 0 0 0 --- 0 Export withdraws: 0 --- --- --- 0 pipe1 Pipe fib2 up 22:01 => fib0 Preference: 70 Input filtr: ACCEPT Output filter: REJECT Routes: 16 imported, 0 exported Схема зміни коду: отримана відхилена filtred ignored accepted Import updates: 28 0 0 9 19 Import withdraws: 3 0 --- 0 3 Export updates: 20 19 1 0 0 Export withdraws: 3 0 --- 0 0 bg0 :01 100 Вхідний filtr: rfc1918_reject Output filter: rfc1918_reject Routes: 5 import, 9 export, 6 prefered Сортувати за адресою 0 import0 0 Вихідні оновлення: 16 3 1 --- 12 Виконання з статей: 2 --- --- --- 3 BGP state: Підтверджено: external AS4 Neighbor AS: 64601 Neighbor ID: 192.168.135.6 Neighbor2.6.8. address: 192.168.135.6 Source address: 192.168.135.5 Neighbor caps: refresh AS4 Hold timer: 102/180 Keepalive timer: 10/60 bgp2 BGP fib0 up 20:01 Establi utput filter: rfc1918_reject Routes: 2 ввезено, 11 вивезено, 2 preferred Route change stats: received rejected filtred ignored accepted Import updates: 5 0 0 0 5 Import withdraws: 3 0 --- 0 3 Export updates: 16 4 1 --- 11 Export withdraws: - --- --- 0 BGP state: Підтверджено: external AS4 Neighbor AS: 64603 Neighbor ID: 0. 0.0.50 Neighbor address: 192.168.135.2 Nexthop address: 192.168.135.2 Source address: 192.168.135.1 2:01 Idle BGP Error: Bad BGP identifier Preference: 100 Input filter: rfc1918_reject Output filter: rfc1918_reject Routes: 0 імпортований, 0 exportований, 0 prefered Сортувати зміною stats: received rejected filtered ignored accepted Import0 up0 0 Попередження: 0 0 0 --- 0 Погодження про надання послуг: 0 --- --- --- 0 BGP state: Idle Error wait: 43/60 Last error: BGP Error: Bad BGP ID device1 Device master up 22:01 Preference: 240 Input filter: ACCEPT Output filter: REJECT Routes: 0 імпортований, 0 exportований, 0 preferred Route change stats: received rejected filtred ignored accepted Import updates: 0 0 0 0 0 Import withdraws: 0 0 --- 0 : 0 0 0 --- 0 Export withdraws: 0 --- --- --- 0