Сообщение об ошибке, которое вы получаете, соответствует коду ошибки EOVERFLOW
, который в системном вызове open
возвращается, если 32-разрядное приложение пытается открыть большой (>= 2 ГБ) файл:
EOVERFLOW
путь относится к обычному файлу, который слишком велик для открыт. Обычный сценарий здесь таков: приложение, скомпилированное на 32-битной платформе без -D_FILE_OFFSET_BITS=64 пытался открыть файл, размер которого превышает (1
Как следует из текста, 32-битные приложения могут получать доступ к файлам большего размера, если они скомпилированы с необходимыми настройками (используя большие целые числа для соответствующих типов данных и вызывая правильные версии системных вызовов).
Создается впечатление, что приложение, которое вы запускаете, не скомпилировано для поддержки больших файлов. И нет, вы не можете изменить это, кроме как перекомпилировав его или получив версию с поддержкой больших файлов.
Некоторые догадки ниже, так что будьте бдительны. Однако это очень типичная установка, которая сбивает с толку многих людей, которые начинают с объединения маршрутизации, фильтрации пакетов (брандмауэр) и 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-сервер, чтобы проверить его.
Если вам не нужна/не нужна фильтрация пакетов, я бы посоветовал вам не использовать брандмауэр. То, что вы пытаетесь сделать, должно обрабатываться простой маршрутизацией.
Хорошо, решение найдено.
Мой /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
Если вы хотите иметь «все открытые» шлюзы, вы можете сделать это только с одним правилом:
pass all allow-opts
Не нужно возиться с явным «сохранением состояния» или с флагами.