Iptables 是用来设置、维护和检查Linux内核的IP包过滤规则的。iptables 组件是一种命令工具,运行在用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
iptables定义规则的方式比较复杂:
格式:iptables [-t table]
COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:-A(追加),R(替换),D(删除),P(设置默认规则),F(清空)
chain:
filter:INPUT ,FORWARD ,OUTPUT
nat:PREROUTING ,OUTPUT ,POSTROUTING
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
CRETIRIA:-s源地址,-d目标地址,-p协议,--sport源端口,--dport目标端口
-j ACTION :指定如何进行处理,DROP,REJECT,ACCEPT
比如:不允许172.16.0.0/24的进行访问。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
当然你如果想拒绝的更彻底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
iptables -L -n -v #查看定义规则的详细信息
sudo iptables -A OUTPUT -p tcp --dport 80 -j DROP 禁止访问80端口
sudo iptables -L -n -v --line-numbers
sudo iptables -D OUTPUT 1
Netfilter
如下图所示:iptables与netfilter的关系。iptables下发包过滤规则,netfilter拦截到包后,结合规则对包进行过滤,比如拦截,放行,阻止等。
五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。
struct nf_hook_ops {
struct list_head list;
/* 此下的值由用户填充 */
nf_hookfn *hook;
int pf;//协议
int hooknum;//hook点
/* Hook以升序的优先级排序 */
int priority;
};
unsigned int hook_func(
unsigned
int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
return NF_DROP; /* 丢弃所有的数据包 */
}
struct nf_hook_ops nfho;
/* 填充我们的hook数据结构 */
nfho.hook = hook_func; /* 处理函数 */
nfho.hooknum = NF_INET_PRE_ROUTING; /*
使用IPv4的第一个hook */
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST; /*
让我们的函数首先执行 */
nf_register_hook(&nfho);
//nf_unregister_hook(&nfho);
Copyright 2011-2020 © MallocFree. All rights reserved.