我有一个基于Linux固件系统的网关。
我有iptables
规则,允许将端口8080转发到本地主机。
我正在为这个linux网关开发一个应用程序。
此应用程序将选择8000和8100之间的随机端口。然后它将在此随机端口上生成bind()
。
如果随机端口是8080,bind()
是否会返回OK。然后应用程序可以在端口8080上启动侦听服务器?
我不想与iptables
规则发生冲突。
因此,如果bind()
返回NOK,那么我可以重试选择另一个随机端口,然后重试绑定。
答案 0 :(得分:0)
bind()
返回正常,但不会检查任何防火墙规则。 bind()
忽略防火墙规则有几个很好的理由。
bind()
比iptables早得多,它是一个符合POSIX标准的电话。检查iptables可能会破坏向后兼容性。bind()
是否有意义。可能存在复杂的修改规则,分配给各种物理和逻辑接口的规则...... bind()
没有意义,但规则可能会在不久的将来发生变化,绑定端口可能会变得有用。有可能通过C接口(如libiptc
)读取iptables规则,但不建议这样做:
正如已经多次在邮件列表中指出的那样,libiptc 是从不意味着用作公共接口。我们不保证 一个稳定的界面,计划在下一个删除它 linux包过滤的化身。 libiptc太低层了 无论如何都要合理使用。
我们很清楚这种API基本缺乏, 我们正在努力改善这种状况。在那之前,它是 建议使用system()或打开stdin的管道 iptables的-恢复。后者将为您提供更好的表现。