Указатели на реализацию простого NAT в C на Linux - PullRequest
0 голосов
/ 30 января 2020

Я хочу реализовать простой NAT для пересылки пакетов UDP. Я хочу статически поддерживать пул сопоставлений NAT с IP-адресом и портом. Простой пример:

  192.168.1.12:12001   - >  publicAddress1:23001 
  192.168.1.12:12002   - >  publicAddress1:23002
  ...

Когда пакет приходит на publicAddress1: 23001, я хочу посмотреть в своей таблице и переслать пакет в 192.168.1.12:120001, где он должен знать, что пакет действительно прибыл из publicAddress1: 23001. Точно так же, когда пакет отправляется с адресом источника 192.168.1.12:120001, я хочу, чтобы после просмотра таблицы сопоставления go с publicAddress1: 230001.

Вышеприведенное может быть не совсем точно сформулировано, но, надеюсь, передает намерение. Конечно, есть много вопросов, которые нужно решить, но этот вопрос касается проблемы пересылки пакетов UDP.

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

  1. Простые правила iptables stati c NAT. Возможно, это проще всего реализовать с помощью простых сценариев оболочки, но не очень эффективно.
  2. Используйте необработанные сокеты и при необходимости измените адрес / порт источника / назначения.
  3. Использовать перехватчики netfilter (nf_register_hook? )
  4. Имеют сокеты UDP, привязанные к портам, и имеют пакеты для чтения / записи (пересылки) соответственно. Конечно, неэффективно. Предполагается, что приложение знает привязку.
  5. Используйте eBPF. Выглядит сложно для этой задачи, но я готов погрузиться в нее, если она того стоит.

Приложение будет знать привязку NAT без использования, например, TURN или STUN. Это будет реализовано отдельно, но с учетом таблицы это будет проще, чем использование внешнего сервера STUN.

Я прошу только указатели, чтобы я мог читать дальше ...

...