Понадобилось перенаправлять исходящий с сервера трафик через VPN, но при этом сервер должен продолжать обслуживать все запросы по существующему внешнему интерфейсу (например веб-сервер, ssh, dns и прочие сервисы должны продолжать работать как ни в чем не бывало). Это может быть полезным при краулинге, если у какого-то сайта (источника данных) установлены квоты на частоту реквестов и т.п., то мы просто используем VPN с Dynamic IP, а наш сайт на этом же сервере продолжает обслуживать клиентов.

Имеем FreeBSD и ipfw, а также openvpn-клиент и mpd5. Вообще, VPN подойдет любой (но примеры будут для OpenVPN и PPTP), нам главное чтобы поднимался интерфейс в системе, на который мы разрешим отправлять данные.

Итого, мы имеем два интерфейса:

  • bce0 - gateway 203.0.113.1, ip 203.0.113.11, Static IP
  • tun0 - gateway 10.8.1.1, ip 10.8.1.17, Dynamic IP

Прикладываю схему иллюстрирующую это:

С виду всё просто, у ipfw есть forward, сейчас мы подключимся по VPN и поднимем сетевой интерфейс, и нужные данные будем туда слать, всё. Но проблема в том, что у нас VPN с Dynamic IP, и мы не можем зафиксировать полученный динамически IP-адрес в конфиге ipfw, а указать сетевой интерфейс tun0 для forward просто невозможно. Можно конечно выдумать велосипед, который будет менять в ipfw правила после переподключения интерфейса, но должно быть решение проще.