setsockopt()SOL_IP API级别和IPT_SO_SET_REPLACE开关

SOL_IP是什么意思作为setsockopt函数的API级别和IPT_SO_SET_REPLACE开关做什么?

我试图在谷歌search,但我什么也没find。
请帮我理解他们(如果你可以扩展和解释的例子,我真的很感激它)

SOL_IP是由套接字选项寻址的网络层。 例如,一个普通的TCP套接字包含了TCP层,然后是它下面的IP层,等等。 setsockopt用于将各种指令传递到特定的层以请求某些服务,功能或操作:基本上,您可能需要配置的任何内容都不会直接与系统调用相匹配。 (手册页中提到的“API级别”基本上是我在这里称为“层”的相同的事情。)

你经常在linux程序(和使用例子)中看到的一些包括:

  • SOL_PACKET (配置分组环,添加/删除多播组成员)
  • SOL_IP (设置/配置各种IP数据包选项,IP层行为,[在这里] netfilter模块选项)
  • SOL_TCP (TCP_NODELAY,特定于TCP的保持有效参数)
  • SOL_SOCKET (REUSEADDR,Keepalives)

您可以在setsockopt解决的层取决于您创建的套接字类型。 在这里,IP层正在被解决。

在这种情况下,传递的选项是IPT_SO_SET_REPLACE – 它不是“核心”IP选项,而是由IP Tables模块提供的,该模块通过“netfilters”接口将自身链接到网络堆栈中。 我不熟悉IP表的详细信息,但该选项似乎是IP表的一个指令来替换一组规则表条目。 我认为使用它将需要非常深入的IP表知识来使用这个套接字选项。

只要专注于IPT_SO_SET_REPLACE选项。

它是用一个新的链规则替换iptable(见-R选项):

https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html

http://ipset.netfilter.org/iptables.man.html

以上是使用的命令行选项。 如果要查看C程序,只需“apt-get source iptables”即可获取源代码,然后查看libiptc / libiptc.c以查看SO_SET_REPLACE如何使用:

 ret = setsockopt(handle->sockfd, TC_IPPROTO, SO_SET_REPLACE, repl, sizeof(*repl) + repl->size); if (ret < 0) goto out_free_newcounters; 

这基本上是通过创建和编译一个新的iptable来取代新的链式规则。

更多信息:

https://en.wikipedia.org/wiki/Iptables