У меня есть машина, подключенная к другому хосту через постоянный туннель GRE. Я поставил машину за брандмауэр Linux (Smoothwall) и настроил NAT все пакеты GRE на машину, используя правила:
/sbin/iptables -t nat -A PREROUTING -p 47 --src $tunnel_server_ip -j DNAT --to-destination $false_ip
/sbin/iptables -t nat -A POSTROUTING -p 47 --src $false_ip -j SNAT --to-source $real_ip
/sbin/iptables -t nat -A INPUT -p 47 -j ACCEPT
(видеть NAT GRE (протокол IP 47) через маршрутизатор Linux)
Все работает нормально, но после периода бездействия в туннеле, примерно 15 минут, я не могу подключиться из Интернета к машине через туннель. После того, как я отправлю любой пакет с машины в Интернет, пингуюсь, открываю веб-страницу в браузере, туннель снова активируется. В качестве обходного пути теперь я использую сценарий cron, который запускает свертывание страницы в Интернете.
Пожалуйста, помогите мне понять, почему туннель перестает работать, и расскажите, что я могу сделать, чтобы заменить средство curl.
У вас могут быть проблемы с тайм-аутом conntrack. Я не знаю, так ли это, похоже, что ваших правил будет достаточно без использования conntrack, но в любом случае вы можете сохранить некоторый трафик в туннеле, чтобы он оставался открытым. Вам не нужно загружать веб-страницу с помощью curl, достаточно простого пинга.
Если вы хотите попробовать с большим таймаутом conntrack, попробуйте следующее:
sysctl net.netfilter.nf_conntrack_generic_timeout=7200
sysctl net.ipv4.netfilter.ip_conntrack_generic_timeout=7200
Другие общие примечания:
-i <eth>
аргумент правила PREROUTING и -o <eth>
аргумент правила POSTROUTING. Избегает пропусков по правилам и снижает нагрузку на брандмауэр.Может быть, у вас динамический или общий IP-адрес или он перераспределен вашим интернет-провайдером?
Если это так, я опасаюсь, что вам придется сохранить аналогичный хак