我想写一个程序来添加/更新linux路由表中的路由。为此,我使用struct rtmsg更新数据并将其发送到作为NETLINK_ROUTE打开的fd。
179 struct {
180 struct nlmsghdr n;
181 struct rtmsg r;
182 char buf[RTA_BUF_SIZE];
183 } req;
184 int v4_addr;
185 int if_idx;
186
187 memset(&req, 0, sizeof(req));
188
189 req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
190 req.n.nlmsg_flags = NLM_F_REQUEST | flags;
191 req.n.nlmsg_type = cmd;
192 req.r.rtm_family = AF_INET;
193 req.r.rtm_table = RT_TABLE_MAIN;
194 req.r.rtm_protocol = RTPROT_BOOT;
195 req.r.rtm_scope = RT_SCOPE_LINK;
196 req.r.rtm_type = RTN_UNICAST;
...
fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);除此之外,我还希望扩展该程序来操作iptables。看起来使用NETLINK_NFLOG协议的套接字应该可以解决我的问题,但是我如何发送数据呢?
fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_NFLOG);e.x。我需要在nat表中添加SNAT规则,如何使用netlink执行此操作?如何传递NF情况下的数据?
发布于 2015-12-03 17:42:11
无法通过netlink协议管理iptables规则。netlink协议可用于管理队列或NFLOG处理程序等。
要管理iptables规则,应该使用guess what- setsockopt()。有关详细信息,请参阅iptables源代码。
https://stackoverflow.com/questions/34054806
复制相似问题