Полностью открытый маршрутизатор FreeBSD в VirtualBox

Сообщение об ошибке, которое вы получаете, соответствует коду ошибки EOVERFLOW, который в системном вызове open возвращается, если 32-разрядное приложение пытается открыть большой (>= 2 ГБ) файл:

EOVERFLOW
путь относится к обычному файлу, который слишком велик для открыт. Обычный сценарий здесь таков: приложение, скомпилированное на 32-битной платформе без -D_FILE_OFFSET_BITS=64 пытался открыть файл, размер которого превышает (1

Как следует из текста, 32-битные приложения могут получать доступ к файлам большего размера, если они скомпилированы с необходимыми настройками (используя большие целые числа для соответствующих типов данных и вызывая правильные версии системных вызовов).

Создается впечатление, что приложение, которое вы запускаете, не скомпилировано для поддержки больших файлов. И нет, вы не можете изменить это, кроме как перекомпилировав его или получив версию с поддержкой больших файлов.

1
01.05.2017, 11:01
3 ответа

Некоторые догадки ниже, так что будьте бдительны. Однако это очень типичная установка, которая сбивает с толку многих людей, которые начинают с объединения маршрутизации, фильтрации пакетов (брандмауэр) и NAT (преобразование сетевых адресов).

Вы не указали это четко, но я предполагаю, что ваша сеть выглядит следующим образом:

Internet <-A-> SOHO Router <-B-> Server/workstation <-C-> VM

Ваш DNS-сервер находится в сети B, которая находится по адресу 192.168.1.0/24.

Я предполагаю, что ваш интернет-маршрутизатор SOHO 192.168.1.1 и установлен в качестве шлюза по умолчанию для сети. Это будет чрезвычайно распространенная установка.

Вы сами утверждаете, что DNS-сервер находится по адресу 192.168.1.2, а мостовой интерфейс сервера — 192.168.1.10. За этим у вас есть сеть 10.9.9.0/24.

Ваша установка iptables будет пересылать все пакеты на интерфейс. На практике вы отправляете все пакеты из одной сети в другую, даже локальные пакеты. Это важное отличие.

В конфигурации pf вы не пересылаете все пакеты на интерфейс. Вы указали сеть em1:сеть.У нас нет полной конфигурации, но я предполагаю, что у вас действительно есть хорошая и рабочая базовая конфигурация. Что вас кусает, так это недостающие маршруты.

Когда вы отправляете пакет из сети 10.9.9.0/24, он достигает сети 192.168.1.0/24. У вашего сервера есть доступ к этой сети, поэтому вы напрямую доберетесь до своего DNS. Но DNS-сервер в сети B понятия не имеет, как получить доступ к нелокальной сети C 10.9.9.0/24. Затем все ответы будут отправлены на «маршрутизатор по умолчанию», который, как я полагаю, является вашим маршрутизатором SOHO. Этот маршрутизатор также знает только, где найти сеть 192.168.1.0/24 (а не 10.9.9.0/24), и обычно направляет все на ваш внешний интернет-канал. В этом случае вы используете правильные частные адреса, поэтому вместо этого пакет будет отброшен, поскольку частные адреса не маршрутизируются в Интернете.

«Правильным» решением было бы настроить маршрут на вашем SOHO-маршрутизаторе, который указывает ему направлять пакеты для 10.9.9.0/24 на 192.168.1.10. Приличный маршрутизатор позволит вам сделать это. Многие дешевые маршрутизаторы SOHO, к сожалению, этого не делают. В этом случае вы можете добавить маршрут на свой DNS-сервер, чтобы проверить его.

  • Причина, по которой это работает для вас с iptables, заключается в том, что ответный пакет виден на интерфейсе eth0, и все пакеты пересылаются. Весь трафик в сети B отправляется в сеть C (и наоборот). Сюда входит трафик, который мог/должен был оставаться локальным. Фактически вы настроили сетевой мост.
  • Причина, по которой это не работает для вас с вашей первой настройкой pf, заключается в том, что вы указали, какую сеть вы ожидаете увидеть. Только одна машина в сети B знает, где найти сеть C. Это 192.168.1.10, так как он имеет интерфейс в сети C. По сути, вы установили базовый брандмауэр. Фильтрация готова, но вы пока ничего не фильтруете. Но маршрутизация отсутствует.
  • Причина, по которой это работает во второй конфигурации pf (ваш собственный ответ), заключается в том, что вы выполняете преобразование сети 10.9.9.0/24 в адресное пространство 192.168.1.0/24. Весь трафик из сети C 10.9.9.0/24 в сеть B будет исходить из 192.168.1.10. NAT следует избегать, когда это возможно, и использовать его только в крайнем случае.

Если вам не нужна/не нужна фильтрация пакетов, я бы посоветовал вам не использовать брандмауэр. То, что вы пытаетесь сделать, должно обрабатываться простой маршрутизацией.

0
28.01.2020, 00:57

Хорошо, решение найдено.

Мой /etc/rc.conf и так хорош...

Файл /etc/pf.conf должен быть

# cat /etc/pf.conf

ext_if="em0"
int_if="em1"
boxnet = $int_if:network
homenet = $ext_if:network

nat on $ext_if from $boxnet to any -> ($ext_if)
pass quick from { lo0, $boxnet, $homenet } to any keep state

Вероятно, слишком много переменных, я мог бы просто использовать оригинальный em0/em1 . В любом случае, это дает вам -

[root@bsdtest ~]# pfctl -vnf /etc/pf.conf
ext_if = "em0"
int_if = "em1"
icmp_types = "echoreq"
boxnet = "em1:network"
homenet = "em0:network"
nat on em0:network inet from 10.9.9.0/24 to any -> 192.168.1.0/24
nat on em1:network inet from 192.168.1.0/24 to any -> 10.9.9.0/24
pass quick inet from 127.0.0.0/8 to any flags S/SA keep state
pass quick inet from 192.168.1.0/24 to any flags S/SA keep state
0
28.01.2020, 00:57

Если вы хотите иметь «все открытые» шлюзы, вы можете сделать это только с одним правилом:

pass all allow-opts

Не нужно возиться с явным «сохранением состояния» или с флагами.

0
28.01.2020, 00:57

Теги

Похожие вопросы