Решил сам. Похоже, очень мало информации о сетевых вещах, которые вы можете делать с Linux, поэтому я решил задокументировать и объяснить свое решение в деталях. Это моя последняя настройка:
Первый шаг :
Создайте новую таблицу маршрутов для каждого интерфейса в / etc / iproute2 / rt_tables
. Назовем их rt1, rt2 и rt3
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt1
2 rt2
3 rt3
Второй шаг : Конфигурация сети в / etc / network / interfaces
. Это основная часть, и я постараюсь объяснить как можно больше:
auto eth0 wlan0
allow-hotplug wlan1
iface lo inet loopback
iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
post-up ip route add default via 192.168.178.1 dev eth0 table rt1
post-up ip rule add from 192.168.178.99/32 table rt1
post-up ip rule add to 192.168.178.99/32 table rt1
post-up ip route add default via 192.168.178.1 metric 100 dev eth0
post-down ip rule del from 0/0 to 0/0 table rt1
post-down ip rule del from 0/0 to 0/0 table rt1
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
post-up ip rule add from 192.168.178.97/32 table rt2
post-up ip rule add to 192.168.178.97/32 table rt2
post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
post-down ip rule del from 0/0 to 0/0 table rt2
post-down ip rule del from 0/0 to 0/0 table rt2
iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
post-up ip rule add from 192.168.178.98/32 table rt3
post-up ip rule add to 192.168.178.98/32 table rt3
post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
post-down ip rule del from 0/0 to 0/0 table rt3
post-down ip rule del from 0/0 to 0/0 table rt3
Если вы наберете ip rule show
, вы должны увидеть следующее:
0: from all lookup local
32756: from all to 192.168.178.98 lookup rt3
32757: from 192.168.178.98 lookup rt3
32758: from all to 192.168.178.99 lookup rt1
32759: from 192.168.178.99 lookup rt1
32762: from all to 192.168.178.97 lookup rt2
32763: from 192.168.178.97 lookup rt2
32766: from all lookup main
32767: from all lookup default
Это говорит нам, что входящий или исходящий трафик с IP-адреса «192.168.178.99» будет использоваться таблица маршрутов rt1. Все идет нормально. Но трафик, который генерируется локально (например, вы хотите отправить ping или ssh с машины в другое место), требует особой обработки (см. Большую цитату в вопросе).
Первые четыре строки post-up в / etc / network / interfaces
просты, и их объяснения можно найти в Интернете, пятая и последняя строка post-up - та, которая заставляет волшебство происходить:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Обратите внимание на то, что мы не указали таблицу маршрутов для этой последующей линии. Если вы не укажете таблицу маршрутов, информация будет сохранена в основной
таблице маршрутов, которую мы видели в ip rule show
. Эта пост-восходящая линия помещает маршрут по умолчанию в «основную» таблицу маршрутов, которая используется для локально сгенерированного трафика, который не является ответом на входящий трафик. (Например, MTA на вашем сервере пытается отправить электронное письмо.)
Все три интерфейса помещают маршрут по умолчанию в основную таблицу маршрутов, хотя и с разными показателями.Давайте посмотрим на таблицу маршрутов main
с ip route show
:
default via 192.168.178.1 dev eth0 metric 100
default via 192.168.178.1 dev wlan1 metric 101
default via 192.168.178.1 dev wlan0 metric 102
192.168.178.0/24 dev wlan0 proto kernel scope link src 192.168.178.97
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.99
192.168.178.0/24 dev wlan1 proto kernel scope link src 192.168.178.98
Мы видим, что основная таблица маршрутов имеет три маршрута по умолчанию, хотя и с разными метриками. Наивысший приоритет - это eth0, затем wlan1 и затем wlan0, потому что более низкие значения метрики указывают на более высокий приоритет. Поскольку eth0
имеет самую низкую метрику, это маршрут по умолчанию, который будет использоваться, пока работает eth0
. Если eth0
выйдет из строя, исходящий трафик переключится на wlan1
.
При такой настройке мы можем ввести ping 8.8.8.8
на одном терминале и ifdown eth0
на другом. ping
должен работать, потому что поскольку ifdown eth0
удалит маршрут по умолчанию, связанный с eth0
, исходящий трафик переключится на wlan1
.
Линии post-down обеспечивают удаление связанных таблиц маршрутов из базы данных политики маршрутизации ( ip rule show
), когда интерфейс выходит из строя, чтобы все было в порядке.
Остается проблема в том, что при отключении от eth0
маршрут по умолчанию для eth0
все еще существует, и исходящий трафик не работает. Нам нужно что-то для мониторинга наших интерфейсов и для выполнения ifdown eth0
, если есть проблема с интерфейсом (например, сбой сетевого адаптера или кто-то вытаскивает вилку из розетки).
Последний шаг : введите ifplugd
.Это демон, который наблюдает за интерфейсами и выполняет ifup / ifdown
, если вы отключите кабель или возникла проблема с подключением к Wi-Fi / etc / default / ifplugd
:
INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
Теперь вы можете вытащить подключите eth0
, исходящий трафик переключится на wlan1
, и если вы снова вставите плагин, исходящий трафик переключится обратно на eth0
. Ваш сервер будет оставаться в сети, пока работает любой из трех интерфейсов. Для подключения к серверу вы можете использовать IP-адрес eth0, а в случае сбоя - IP-адрес wlan1 или wlan0.
-A
, -B
, -C
работают правильно и как у меня с GNU grep
с pdfgrep 2.0.
Вы всегда можете использовать (, предполагая, что GNUgrep
):
pdftotext file.pdf - | grep -A/B/C...
(, что в моем случае также кажется намного быстрее, хотя оба используютpoppler
).
Или для работы с более чем одним файлом, сделайте как zgrep
:
for file in./*.pdf; do
pdftotext "$file" - | grep --label="$file" -H...
done
(добавление опции -layout
к pdftotext
, по-видимому, дает результат, более близкий к pdfgrep
. Вы также можете захотеть сжать последовательности символов пробела в один пробел, чтобы облегчить поиск строк из нескольких -слов, передав вывод от pdftotext
до tr -s '[[:space:]]' '[ *]'
)