iptables从入门到应用
一、iptables原理
- 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
- 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
- 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
Linux系统的防火墙功能是由内核实现的,包过滤防火墙工作在TCP/IP的网络层
二、iptables四表五链
四表决定了数据报文处理的方式
raw //确定是否对数据包进行状态跟踪
mangle //为数据包设置标记
nat //修改数据包中的源,目标,端口
filter //确定是否放行该数据包(过滤)
五链决定了数据报文的流经哪些位置
五链是iptables通过netfilter模块的hook point控制网络层
INPUT //处理进站的数据包
OUTPUT //处理出站的数据包
FORWARD //处理转发数据包(主要是将数据转发到本机其他网卡设备)
PREROUTING //在进行路由选择前处理(判断目标主机)
POSTROUTING //在进行路由器选择后处理数据包 (判断数据包由哪一接口送往下一跳)
制作防火墙规则通常有两种基本策略。一是黑名单策略;二是白名单策略。
黑名单策略指没有被拒绝的流量都可以通过,这种策略下管理员必须针对每一种新出现的攻击,制定新的规则,因此不推荐。
白名单策略指没有被允许的流量都要拒绝,这种策略比较保守,根据需要,逐渐开放,目前一般都采用白名单策略,推荐。
三、iptables命令用法
# 仅允许来自于10.0.0.0/24网段的用户连接本机的ssh服务
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT
# 不允许任何主机访问本机的12345端口
iptables -I INPUT -p tcp --dport 12345 -j REJECT
iptables -I INPUT -p udp --dport 12345 -j REJECT
# 拒绝所有主机通过eth0网卡访问本机的http服务
iptables -I INPUT -i eth0 -p tcp --dport 80 -j REJECT
# 删除filter表中INPUT规则的第一条
iptables -D INPUT 1
# 保存iptables配置
/etc/init.d/iptables save
# 放行sshd服务
iptables -t filter -A INPUT -s 192.168.0.0/24 -d 192.168.0.1 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.1 -p tcp --sport 22 -j ACCEPT
# 放行httpd/nginx服务
iptables -I OUTPUT -s 192.168.0.1 -p tcp --sport 80 -j ACCEPT
iptables -I INPUT -d 192.168.0.1 -p tcp --dport 80 -j ACCEPT
# 放行本机端的流入流出
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
# 删除现有规则
iptables -F
# 配置默认链策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 允许远程主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
# 允许本地主机进行SSH连接
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
# 允许HTTP请求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT