2015-12-02 117 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資源