iptables 是 Linux 操作系统里面一款知名 IP 防火墙工具。iptables 有两块主要的功能,分别是 过滤
和 映射
。
其中的过滤,又可以分为 访问过滤
和 出口过滤
。当一个 IP 访问我们服务器的时候,我们针对个 IP 进行一些规则判断,如果触发了规则,那么对 IP 进行禁止,这就是访问过滤。而出口过滤呢?是我们服务器要访问一个 IP,然后针对我们主动访问的 IP 进行规则校验。
映射就是转发,例如被请求了 8000
端口,但是我们通过 iptables 映射到 80
端口,也就相当于把 8000 转发到 80 端口。
理解了这两个基本的概念,就可以进入实际操作了。
iptables 的规则详解。
iptables -h // 帮助
我们查看一下当前主机的规则。
$ iptables -L -t filter
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
/*
结果显示没有任何规则
*/
我们新增一条规则。
$ iptables -A INPUT -s 0.0.0.0 // 这条规则的作用是禁止 0.0.0.0 这个 IP 访问我们的主机
$ iptables -L -t filter
Chain INPUT (policy ACCEPT)
target prot opt source destination
all -- 0.0.0.0 anywhere // 这里就多出一条记录了
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
更多的规则。
/*
新增、修改、删除 规则
*/
-A INPUT // -A 追加一条规则到 iptables 的列表,INPUT 表示这条规则是 “访问过滤” | OUTPUT 就是 “出口过滤”
-I INPUT 2 // -I 表示这条规则添加到哪行,规则匹配的顺序会影响规则的匹配结果,前后很重要
-R INPUT 2 // -R 修改第二行的规则
-D INPUT 2 // -D 删除第二行的规则
-F // 清空所有规则
/*
IP 规则
*/
-s 0.0.0.0 // 来源 IP,用于 “访问过滤” 匹配
-d 0.0.0.0 // 目标 IP,用于 “出口过滤” 匹配
! -s 0.0.0.0 // ! 号,白名单机制,除了这个 IP 其他 IP 都不能访问
/*
协议和端口规则
*/
-p tcp/udp --dport/sport 1 // -p 协议 -dport/sport 源端口/目标端口
-p icmp --icmp-type 8/0 // 匹配 icmp | type 8 表示请求,0表示 回应
/*
网卡规则
*/
-i eth0 // -i “访问过滤”
-o wlan0 // -o “出口过滤”
结合上面的规则,举些实例。
/*
filter 过滤 实例
*/
// 访问过滤
iptables -A INPUT -s 0.0.0.0 -p tcp --sport 8000 -j DROP // 拒绝 0.0.0.0:8000 访问 | 如果是 -j ACCEPT 这个规则就是允许访问
// 出口过滤
iptables -A OUTPUT ! -d 0.0.0.0 -j DROP // 拒绝 0.0.0.0 出口
// 拒绝所有ICMP请求
iptables -A INPUT -p icmp --icmp-type 8
/*
nat 映射 实例
*/
iptables -t nat -A PREROUTING -p tcp --dport 8000 -j REDIRECT --to-ports 80 // 将访问 8000 端口转发到 80 端口上