使用netlink添加/更新iptables?

时间:2015-12-02 23:05:28

标签: networking iptables netlink

我正在尝试编写一个程序来添加/更新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情况下传递数据?

1 个答案:

答案 0 :(得分:1)

无法通过netlink协议管理iptables规则。 netlink协议可用于管理QUEUE或NFLOG处理程序等。

要管理iptables规则,应该使用猜测 - setsockopt()。有关详细信息,请参阅iptables来源。