Я хочу реализовать простой 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.
Итак, мой вопрос: какой из них является лучшим подходом для достижения этого: мое чтение указывает на следующее:
- Простые правила iptables stati c NAT. Возможно, это проще всего реализовать с помощью простых сценариев оболочки, но не очень эффективно.
- Используйте необработанные сокеты и при необходимости измените адрес / порт источника / назначения.
- Использовать перехватчики netfilter (nf_register_hook? )
- Имеют сокеты UDP, привязанные к портам, и имеют пакеты для чтения / записи (пересылки) соответственно. Конечно, неэффективно. Предполагается, что приложение знает привязку.
- Используйте eBPF. Выглядит сложно для этой задачи, но я готов погрузиться в нее, если она того стоит.
Приложение будет знать привязку NAT без использования, например, TURN или STUN. Это будет реализовано отдельно, но с учетом таблицы это будет проще, чем использование внешнего сервера STUN.
Я прошу только указатели, чтобы я мог читать дальше ...