我想实现一个用于转发UDP数据包的简单NAT。我想静态维护一个具有IP地址和端口的NAT映射池。一个简单的例子:
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的数据包时,我希望在查看映射表后使用publicAddress1:230001出去。
以上内容可能措词不准确,但希望能传达出意图。当然,有很多问题要处理,但是这个问题与UDP数据包转发有关。
所以,我的问题是:哪一种是实现此目标的最佳方法: 我的阅读指向以下内容:
- 简单的iptables静态NAT规则。这可能是通过简单的shell脚本最容易实现,但效率不高。
- 使用原始套接字,并根据需要更改源/目标地址/端口。
- 使用netfilter钩子(nf_register_hook?)
- 已将UDP套接字绑定到端口,并相应地对数据包进行读/写(转发)。当然效率低下。假定该应用程序知道绑定。
- 使用eBPF。对于这项任务来说看起来很复杂,但如果值得努力的话,我愿意深入研究。
应用程序无需使用TURN或STUN即可知道其NAT绑定。那可以单独实现,但是给定表,它比使用外部STUN服务器更简单。
我只要求提供指针,以便我可以进一步阅读...