core.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. /* netfilter.c: look after the filters for various protocols.
  2. * Heavily influenced by the old firewall.c by David Bonn and Alan Cox.
  3. *
  4. * Thanks to Rob `CmdrTaco' Malda for not influencing this code in any
  5. * way.
  6. *
  7. * Rusty Russell (C)2000 -- This code is GPL.
  8. * Patrick McHardy (c) 2006-2012
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/netfilter.h>
  12. #include <net/protocol.h>
  13. #include <linux/init.h>
  14. #include <linux/skbuff.h>
  15. #include <linux/wait.h>
  16. #include <linux/module.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/if.h>
  19. #include <linux/netdevice.h>
  20. #include <linux/netfilter_ipv6.h>
  21. #include <linux/inetdevice.h>
  22. #include <linux/proc_fs.h>
  23. #include <linux/mutex.h>
  24. #include <linux/slab.h>
  25. #include <net/net_namespace.h>
  26. #include <net/sock.h>
  27. #include "nf_internals.h"
  28. static DEFINE_MUTEX(afinfo_mutex);
  29. const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly;
  30. EXPORT_SYMBOL(nf_afinfo);
  31. const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly;
  32. EXPORT_SYMBOL_GPL(nf_ipv6_ops);
  33. DEFINE_PER_CPU(bool, nf_skb_duplicated);
  34. EXPORT_SYMBOL_GPL(nf_skb_duplicated);
  35. int nf_register_afinfo(const struct nf_afinfo *afinfo)
  36. {
  37. mutex_lock(&afinfo_mutex);
  38. RCU_INIT_POINTER(nf_afinfo[afinfo->family], afinfo);
  39. mutex_unlock(&afinfo_mutex);
  40. return 0;
  41. }
  42. EXPORT_SYMBOL_GPL(nf_register_afinfo);
  43. void nf_unregister_afinfo(const struct nf_afinfo *afinfo)
  44. {
  45. mutex_lock(&afinfo_mutex);
  46. RCU_INIT_POINTER(nf_afinfo[afinfo->family], NULL);
  47. mutex_unlock(&afinfo_mutex);
  48. synchronize_rcu();
  49. }
  50. EXPORT_SYMBOL_GPL(nf_unregister_afinfo);
  51. #ifdef HAVE_JUMP_LABEL
  52. struct static_key nf_hooks_needed[NFPROTO_NUMPROTO][NF_MAX_HOOKS];
  53. EXPORT_SYMBOL(nf_hooks_needed);
  54. #endif
  55. static DEFINE_MUTEX(nf_hook_mutex);
  56. static struct list_head *nf_find_hook_list(struct net *net,
  57. const struct nf_hook_ops *reg)
  58. {
  59. struct list_head *hook_list = NULL;
  60. if (reg->pf != NFPROTO_NETDEV)
  61. hook_list = &net->nf.hooks[reg->pf][reg->hooknum];
  62. else if (reg->hooknum == NF_NETDEV_INGRESS) {
  63. #ifdef CONFIG_NETFILTER_INGRESS
  64. if (reg->dev && dev_net(reg->dev) == net)
  65. hook_list = &reg->dev->nf_hooks_ingress;
  66. #endif
  67. }
  68. return hook_list;
  69. }
  70. struct nf_hook_entry {
  71. const struct nf_hook_ops *orig_ops;
  72. struct nf_hook_ops ops;
  73. };
  74. int nf_register_net_hook(struct net *net, const struct nf_hook_ops *reg)
  75. {
  76. struct list_head *hook_list;
  77. struct nf_hook_entry *entry;
  78. struct nf_hook_ops *elem;
  79. entry = kmalloc(sizeof(*entry), GFP_KERNEL);
  80. if (!entry)
  81. return -ENOMEM;
  82. entry->orig_ops = reg;
  83. entry->ops = *reg;
  84. hook_list = nf_find_hook_list(net, reg);
  85. if (!hook_list) {
  86. kfree(entry);
  87. return -ENOENT;
  88. }
  89. mutex_lock(&nf_hook_mutex);
  90. list_for_each_entry(elem, hook_list, list) {
  91. if (reg->priority < elem->priority)
  92. break;
  93. }
  94. list_add_rcu(&entry->ops.list, elem->list.prev);
  95. mutex_unlock(&nf_hook_mutex);
  96. #ifdef CONFIG_NETFILTER_INGRESS
  97. if (reg->pf == NFPROTO_NETDEV && reg->hooknum == NF_NETDEV_INGRESS)
  98. net_inc_ingress_queue();
  99. #endif
  100. #ifdef HAVE_JUMP_LABEL
  101. static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]);
  102. #endif
  103. return 0;
  104. }
  105. EXPORT_SYMBOL(nf_register_net_hook);
  106. void nf_unregister_net_hook(struct net *net, const struct nf_hook_ops *reg)
  107. {
  108. struct list_head *hook_list;
  109. struct nf_hook_entry *entry;
  110. struct nf_hook_ops *elem;
  111. hook_list = nf_find_hook_list(net, reg);
  112. if (!hook_list)
  113. return;
  114. mutex_lock(&nf_hook_mutex);
  115. list_for_each_entry(elem, hook_list, list) {
  116. entry = container_of(elem, struct nf_hook_entry, ops);
  117. if (entry->orig_ops == reg) {
  118. list_del_rcu(&entry->ops.list);
  119. break;
  120. }
  121. }
  122. mutex_unlock(&nf_hook_mutex);
  123. if (&elem->list == hook_list) {
  124. WARN(1, "nf_unregister_net_hook: hook not found!\n");
  125. return;
  126. }
  127. #ifdef CONFIG_NETFILTER_INGRESS
  128. if (reg->pf == NFPROTO_NETDEV && reg->hooknum == NF_NETDEV_INGRESS)
  129. net_dec_ingress_queue();
  130. #endif
  131. #ifdef HAVE_JUMP_LABEL
  132. static_key_slow_dec(&nf_hooks_needed[reg->pf][reg->hooknum]);
  133. #endif
  134. synchronize_net();
  135. nf_queue_nf_hook_drop(net, &entry->ops);
  136. /* other cpu might still process nfqueue verdict that used reg */
  137. synchronize_net();
  138. kfree(entry);
  139. }
  140. EXPORT_SYMBOL(nf_unregister_net_hook);
  141. int nf_register_net_hooks(struct net *net, const struct nf_hook_ops *reg,
  142. unsigned int n)
  143. {
  144. unsigned int i;
  145. int err = 0;
  146. for (i = 0; i < n; i++) {
  147. err = nf_register_net_hook(net, &reg[i]);
  148. if (err)
  149. goto err;
  150. }
  151. return err;
  152. err:
  153. if (i > 0)
  154. nf_unregister_net_hooks(net, reg, i);
  155. return err;
  156. }
  157. EXPORT_SYMBOL(nf_register_net_hooks);
  158. void nf_unregister_net_hooks(struct net *net, const struct nf_hook_ops *reg,
  159. unsigned int n)
  160. {
  161. while (n-- > 0)
  162. nf_unregister_net_hook(net, &reg[n]);
  163. }
  164. EXPORT_SYMBOL(nf_unregister_net_hooks);
  165. static LIST_HEAD(nf_hook_list);
  166. int nf_register_hook(struct nf_hook_ops *reg)
  167. {
  168. struct net *net, *last;
  169. int ret;
  170. rtnl_lock();
  171. for_each_net(net) {
  172. ret = nf_register_net_hook(net, reg);
  173. if (ret && ret != -ENOENT)
  174. goto rollback;
  175. }
  176. list_add_tail(&reg->list, &nf_hook_list);
  177. rtnl_unlock();
  178. return 0;
  179. rollback:
  180. last = net;
  181. for_each_net(net) {
  182. if (net == last)
  183. break;
  184. nf_unregister_net_hook(net, reg);
  185. }
  186. rtnl_unlock();
  187. return ret;
  188. }
  189. EXPORT_SYMBOL(nf_register_hook);
  190. void nf_unregister_hook(struct nf_hook_ops *reg)
  191. {
  192. struct net *net;
  193. rtnl_lock();
  194. list_del(&reg->list);
  195. for_each_net(net)
  196. nf_unregister_net_hook(net, reg);
  197. rtnl_unlock();
  198. }
  199. EXPORT_SYMBOL(nf_unregister_hook);
  200. int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n)
  201. {
  202. unsigned int i;
  203. int err = 0;
  204. for (i = 0; i < n; i++) {
  205. err = nf_register_hook(&reg[i]);
  206. if (err)
  207. goto err;
  208. }
  209. return err;
  210. err:
  211. if (i > 0)
  212. nf_unregister_hooks(reg, i);
  213. return err;
  214. }
  215. EXPORT_SYMBOL(nf_register_hooks);
  216. void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
  217. {
  218. while (n-- > 0)
  219. nf_unregister_hook(&reg[n]);
  220. }
  221. EXPORT_SYMBOL(nf_unregister_hooks);
  222. unsigned int nf_iterate(struct list_head *head,
  223. struct sk_buff *skb,
  224. struct nf_hook_state *state,
  225. struct nf_hook_ops **elemp)
  226. {
  227. unsigned int verdict;
  228. /*
  229. * The caller must not block between calls to this
  230. * function because of risk of continuing from deleted element.
  231. */
  232. list_for_each_entry_continue_rcu((*elemp), head, list) {
  233. if (state->thresh > (*elemp)->priority)
  234. continue;
  235. /* Optimization: we don't need to hold module
  236. reference here, since function can't sleep. --RR */
  237. repeat:
  238. verdict = (*elemp)->hook((*elemp)->priv, skb, state);
  239. if (verdict != NF_ACCEPT) {
  240. #ifdef CONFIG_NETFILTER_DEBUG
  241. if (unlikely((verdict & NF_VERDICT_MASK)
  242. > NF_MAX_VERDICT)) {
  243. NFDEBUG("Evil return from %p(%u).\n",
  244. (*elemp)->hook, state->hook);
  245. continue;
  246. }
  247. #endif
  248. if (verdict != NF_REPEAT)
  249. return verdict;
  250. goto repeat;
  251. }
  252. }
  253. return NF_ACCEPT;
  254. }
  255. /* Returns 1 if okfn() needs to be executed by the caller,
  256. * -EPERM for NF_DROP, 0 otherwise. */
  257. int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state)
  258. {
  259. struct nf_hook_ops *elem;
  260. unsigned int verdict;
  261. int ret = 0;
  262. /* We may already have this, but read-locks nest anyway */
  263. rcu_read_lock();
  264. elem = list_entry_rcu(state->hook_list, struct nf_hook_ops, list);
  265. next_hook:
  266. verdict = nf_iterate(state->hook_list, skb, state, &elem);
  267. if (verdict == NF_ACCEPT || verdict == NF_STOP) {
  268. ret = 1;
  269. } else if ((verdict & NF_VERDICT_MASK) == NF_DROP) {
  270. kfree_skb(skb);
  271. ret = NF_DROP_GETERR(verdict);
  272. if (ret == 0)
  273. ret = -EPERM;
  274. } else if ((verdict & NF_VERDICT_MASK) == NF_QUEUE) {
  275. int err = nf_queue(skb, elem, state,
  276. verdict >> NF_VERDICT_QBITS);
  277. if (err < 0) {
  278. if (err == -ESRCH &&
  279. (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS))
  280. goto next_hook;
  281. kfree_skb(skb);
  282. }
  283. }
  284. rcu_read_unlock();
  285. return ret;
  286. }
  287. EXPORT_SYMBOL(nf_hook_slow);
  288. int skb_make_writable(struct sk_buff *skb, unsigned int writable_len)
  289. {
  290. if (writable_len > skb->len)
  291. return 0;
  292. /* Not exclusive use of packet? Must copy. */
  293. if (!skb_cloned(skb)) {
  294. if (writable_len <= skb_headlen(skb))
  295. return 1;
  296. } else if (skb_clone_writable(skb, writable_len))
  297. return 1;
  298. if (writable_len <= skb_headlen(skb))
  299. writable_len = 0;
  300. else
  301. writable_len -= skb_headlen(skb);
  302. return !!__pskb_pull_tail(skb, writable_len);
  303. }
  304. EXPORT_SYMBOL(skb_make_writable);
  305. /* This needs to be compiled in any case to avoid dependencies between the
  306. * nfnetlink_queue code and nf_conntrack.
  307. */
  308. struct nfnl_ct_hook __rcu *nfnl_ct_hook __read_mostly;
  309. EXPORT_SYMBOL_GPL(nfnl_ct_hook);
  310. #if IS_ENABLED(CONFIG_NF_CONNTRACK)
  311. /* This does not belong here, but locally generated errors need it if connection
  312. tracking in use: without this, connection may not be in hash table, and hence
  313. manufactured ICMP or RST packets will not be associated with it. */
  314. void (*ip_ct_attach)(struct sk_buff *, const struct sk_buff *)
  315. __rcu __read_mostly;
  316. EXPORT_SYMBOL(ip_ct_attach);
  317. void nf_ct_attach(struct sk_buff *new, const struct sk_buff *skb)
  318. {
  319. void (*attach)(struct sk_buff *, const struct sk_buff *);
  320. if (skb->nfct) {
  321. rcu_read_lock();
  322. attach = rcu_dereference(ip_ct_attach);
  323. if (attach)
  324. attach(new, skb);
  325. rcu_read_unlock();
  326. }
  327. }
  328. EXPORT_SYMBOL(nf_ct_attach);
  329. void (*nf_ct_destroy)(struct nf_conntrack *) __rcu __read_mostly;
  330. EXPORT_SYMBOL(nf_ct_destroy);
  331. void nf_conntrack_destroy(struct nf_conntrack *nfct)
  332. {
  333. void (*destroy)(struct nf_conntrack *);
  334. rcu_read_lock();
  335. destroy = rcu_dereference(nf_ct_destroy);
  336. BUG_ON(destroy == NULL);
  337. destroy(nfct);
  338. rcu_read_unlock();
  339. }
  340. EXPORT_SYMBOL(nf_conntrack_destroy);
  341. /* Built-in default zone used e.g. by modules. */
  342. const struct nf_conntrack_zone nf_ct_zone_dflt = {
  343. .id = NF_CT_DEFAULT_ZONE_ID,
  344. .dir = NF_CT_DEFAULT_ZONE_DIR,
  345. };
  346. EXPORT_SYMBOL_GPL(nf_ct_zone_dflt);
  347. #endif /* CONFIG_NF_CONNTRACK */
  348. #ifdef CONFIG_NF_NAT_NEEDED
  349. void (*nf_nat_decode_session_hook)(struct sk_buff *, struct flowi *);
  350. EXPORT_SYMBOL(nf_nat_decode_session_hook);
  351. #endif
  352. static int nf_register_hook_list(struct net *net)
  353. {
  354. struct nf_hook_ops *elem;
  355. int ret;
  356. rtnl_lock();
  357. list_for_each_entry(elem, &nf_hook_list, list) {
  358. ret = nf_register_net_hook(net, elem);
  359. if (ret && ret != -ENOENT)
  360. goto out_undo;
  361. }
  362. rtnl_unlock();
  363. return 0;
  364. out_undo:
  365. list_for_each_entry_continue_reverse(elem, &nf_hook_list, list)
  366. nf_unregister_net_hook(net, elem);
  367. rtnl_unlock();
  368. return ret;
  369. }
  370. static void nf_unregister_hook_list(struct net *net)
  371. {
  372. struct nf_hook_ops *elem;
  373. rtnl_lock();
  374. list_for_each_entry(elem, &nf_hook_list, list)
  375. nf_unregister_net_hook(net, elem);
  376. rtnl_unlock();
  377. }
  378. static int __net_init netfilter_net_init(struct net *net)
  379. {
  380. int i, h, ret;
  381. for (i = 0; i < ARRAY_SIZE(net->nf.hooks); i++) {
  382. for (h = 0; h < NF_MAX_HOOKS; h++)
  383. INIT_LIST_HEAD(&net->nf.hooks[i][h]);
  384. }
  385. #ifdef CONFIG_PROC_FS
  386. net->nf.proc_netfilter = proc_net_mkdir(net, "netfilter",
  387. net->proc_net);
  388. if (!net->nf.proc_netfilter) {
  389. if (!net_eq(net, &init_net))
  390. pr_err("cannot create netfilter proc entry");
  391. return -ENOMEM;
  392. }
  393. #endif
  394. ret = nf_register_hook_list(net);
  395. if (ret)
  396. remove_proc_entry("netfilter", net->proc_net);
  397. return ret;
  398. }
  399. static void __net_exit netfilter_net_exit(struct net *net)
  400. {
  401. nf_unregister_hook_list(net);
  402. remove_proc_entry("netfilter", net->proc_net);
  403. }
  404. static struct pernet_operations netfilter_net_ops = {
  405. .init = netfilter_net_init,
  406. .exit = netfilter_net_exit,
  407. };
  408. int __init netfilter_init(void)
  409. {
  410. int ret;
  411. ret = register_pernet_subsys(&netfilter_net_ops);
  412. if (ret < 0)
  413. goto err;
  414. ret = netfilter_log_init();
  415. if (ret < 0)
  416. goto err_pernet;
  417. return 0;
  418. err_pernet:
  419. unregister_pernet_subsys(&netfilter_net_ops);
  420. err:
  421. return ret;
  422. }