iptables/netfilter
防火墙简介
防火墙:使之设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。 机制:通过访问控制机制,确定哪些内部服务允许外部访问。可以根据网络传输的类型决定IP包是否可以传进或传出内部网。 工作原理:通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先后顺序,根据的先后顺序进行一一比较,直到满足其中一条为止,然后依据控制机制做出相应的动作。入股不满足,则将数据包丢弃,从而保护网络的安全。
防火墙机制
一种机制是阻拦传输流通行 一种机制是允许传输了通过 一些防火墙偏重拦阻传输流的通行,而另一些防火墙则偏重允许传输流通过。 防火墙实现功能: 控制内网往之间网络系统的访问; 可以保护易受攻击的服务; 集中管理内网的安全性,降低管理成本; 提高网络的保密性和私有性; 记录网络的使用状态,为安全规划和网络维护提高依据。 防火墙类似于过滤器的功能,其中的规则就是网孔,允许的才能通过,不允许的只能在网外被丢弃掉或者是被原路发送回去。
不同内核版本与不同防火墙版本之间的对应关系。
netfilter/iptables 分别是内核态模块和用户管理工具,netfilter 是位于Linux内核中的包过滤功能体系,iptables位于 /sbin/iptables,用于管理防火墙规则的工具,管理员通过iptables 给netfilter 变更规则实现防火墙作用。
kenel 2.0.x ipfw ipfwadmin
kenel 2.2.x ipchains ipchains
kenel 2.4.x netfilter iptables
kenel 3.13.x firewall nftables>iptables
netfilter/iptables预设的规则表 表作用:容纳各种规则链 划分依据:根据防火墙对数据的处理方式 规则表: raw表:确定是否对该数据包进行状态跟踪 mangle表:为数据包设置标记 nat表:修改数据包中的源、目标IP地址或者端口 filter表:确定是否放行该数据包(过滤) netfilter/iptables预设的规则链 规则的作用:对数据包进行过滤或者处理 链的作用:容纳各种防火墙规则 链的分类依据:处理数据包的不同时机 规则链: INPUT:处理入站数据包 OUTPUT:处理出站数据包 FORWARD:处理转发数据包 POSTROUTING链:在进行路由选择后处理的数据包 PREROUTING链:在进行路由选择前处理数据包
规则表之间的顺序
raw——mangle——nat——filter
规则链之间的顺序
入站:PREROUTING INPUT
出站:OUTPUT POSTROUTING
转发:PREROUTING FORWARD POSTROUTING
规则链内的匹配顺序
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配规则,则按该链的默认策略处理
语法构成及注意事项
语法
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
注意事项
不指定表名时,默认指filter表
不指定链名时,默认指表内所有的链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写
保存和恢复 iptables 规则
防火墙规则只在计算机处于开启状态时才有效。如果系统被重新引导,这些规则就会自动被清除并重设。要保存规则以便今后载入,请使用以下命令:
sbin/service iptables save
保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时)被应用。
数据包的常见控制类型
ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配
添加新的规则
-A:在链的末尾追加一条规则
-i:在链的开头(或指定序号)插入一条规则
# iptables -t filter -A INPUT -p tcp -j ACCEPT
# iptables -i INPUT -p udp -j ACCEPT
# iptables -i INPUT 2 -p icmp -j ACCEPT
查看规则列表
-L:列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号
删除、清空规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
设置默认策略
-P:为指定的链设置默认规则
条件匹配
通用匹配 可直接使用,不依赖于其他条件或扩展 包括网络协议、IP地址、网络接口等条件
常见的通用匹配条件
协议匹配:-p 协议名
地址匹配:-s 源地址、-d 目的地址
接口匹配:-i 入站网卡、-o 出站网卡
隐含匹配 要求以特定的协议匹配作为前提 包括端口、TCP标记、ICMP类型等条件
常用的隐含匹配条件
端口匹配:--sport 源端口、--dport 目的端口
ICMP类型匹配:--icmp-type ICMP类型
显式匹配 要求以“-m 扩展模块”的形式明确指出类型 包括多端口、MAC地址、IP范围、数据包状态等条件
常用的显式匹配条件
多端口匹配:-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
IP范围匹配:-m iprange --src-range IP范围
MAC地址匹配:-m mac –mac1-source MAC地址
状态匹配:-m state --state 连接状态
SNAT策略的典型应用环境
局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理
源地址转换,Source Network Address Translation
修改数据包的源地址
前提条件
局域网各主机正确设置IP地址/子网掩码
局域网各主机正确设置默认网关地址
Linux网关支持IP路由转发
实现方法
编写SNAT转换规则
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
# 这里的eth0是指网关服务器上的外网网卡
# 此条防火墙规则是在网关服务器上设置
MASQUERADE —— 地址伪装
适用于外网IP地址非固定的情况,对于ADSL拨号连接,接口通常为 ppp0、ppp1,将SNAT规则改为MASQUERADE即可
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 此条防火墙规则是在网关服务器上设置
# 应用条件:网关服务器的外网IP地址获取不唯一
DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器
DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标地址
前提条件
局域网的Web服务器能够访问Internet,网关的外网IP地址有正确的DNS解析记录,Linux网关支持IP路由转发
实现方法
编写DNAT转换规则
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
发布时修改目标端口
在DNAT规则中以“IP:Port”的形式指定目标地址
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.6:22
状态机制
状态机制是iptables中特殊的一部分,连接跟踪可以让Netfilter知道某个特定的连接状态。允许连接跟踪的防火墙称为带有状态机制的防火墙。状态防火墙比非状态防火墙要安全,因为它允许编写更严密的规则。在iptables中,包和被跟踪连接的四种不同状态有关,即NEW、ESTABISHED、RELATED和INVALID。
1.NEW
NEW说明这个包,即从哪track模块看到的某个连接的第一个包,它即将匹配。比如看到一个SYN包,是所留意连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。
2.ESTABISHED
已经注意到两个方向上的传输,而且会继续匹配这个连接的包。
3.RELATED
当一个连接和某个已经处于ESTABISHED连接状态的连接有关系时,被认为是该状态。FTP就是一个RELATED状态。
脚本编写
#!/bin/bash
#this is a iptables SNAT regular
sysctl -w net.ipv4.ip_forward=1
#开启地址转发功能
INET_IFACE='eth1'
#定义外网网卡是哪个
INET_IP=200.200.200.10
#定义网关服务器上外网IP地址
LAN_IFACE=eth0
#定义内网网卡是哪个
LAN_IP=192.168.1.20
#定义网关服务器上内网IP地址
LAN_IP_RANGE=192.168.1.0/24
#定义内网允许访问的地址范围
IPT="/sbin/iptables"
#给iptables命令设置别名
/sbin/modprobe ip_tables
/sbin/modprobe ipt_iprange
/sbin/modprobe ipt_REJECT
/sbin/modprobe ip_conntrack
/sbin/modprobe xt_tcpudp
/sbin/modprobe xt_state
/sbin/modprobe xt_multiport
/sbin/modprobe xt_mac
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
#加载必要的内核模块
for TABLE in filter nat mangle;do
$IPT -t $TABLE -F
done
#清除默认策略
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P OUTPUT ACCEPT
#设置默认策略
$IPT -t nat -A POSTROUTING -s $LAN_IP_RANGE -o $INET_IFACE -j SNAT --to-source $INET_
IP
#添加防火墙规则
频繁使用的模块
$MOD ip_tables
$MOD ip_conntrack
$MOD ipt_REJECT
$MOD ipt_LOG
$MOD ipt_iprange
$MOD xt_tcpudp
$MOD xt_state
$MOD xt_multiport
$MOD xt_mac
$MOD ip_nat_ftp
$MOD ip_conntrack_ftp
# 这里的MOD=/sbin/modprobe
调整/proc内核参数
$CTL -w net.ipv4.ip_forward=1
$CTL -w net.ipv4.ip_default_ttl=128
$CTL -w net.ipv4.icmp_echo_ignore_all=1
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts
$CTL -w net.ipv4.tcp_syncookies=1
$CTL -w net.ipv4.tcp_syn_retries=3
$CTL -w net.ipv4.tcp_synack_retries=3
$CTL -w net.ipv4.tcp_fin_timeout=60
$CTL -w net.ipv4.tcp_max_syn_backlog=3200
# 这里的CTL指 /sbin/sysctl
具体的规则
$IPT -t filter -X
$IPT -t nat -X
$IPT -t filter -F
$IPT -t nat -F
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
# 这里的IPT指 /sbin/iptables
黑白名单机制