2015-12-02 50 views
0

我试图编写一个程序,在linux路由表中添加/更新路由。 为此,我使用struct rtmsg来更新数据&将它发送到以NETLINK_ROUTE打开的fd。使用netlink添加/更新iptables?

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

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

要管理iptables规则,应该使用猜测什么 - setsockopt()。详情请参阅iptables资源