Linux上的常用的包过滤防火墙叫netfilter,是集成在内核上的,是使用iptables命令对它进行配置管理。防火墙在做信息包过滤的时候,遵循一套规则,这些规则是存放在专用的信息过滤表中,而这些表都集成在Linux的内核中。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。1、iptables的结构
iptables >> Tables(表) >>Chins(链) >>Rules(规则)。iptables有3张表,分别是Filter表:过滤数据包,默认表;NAT表:网络地址转换(Network Address Translation);Mangle表:修改数据包,改变包头中内容(TTL, TOS, MARK )。1)、Filter表:过滤数据包,默认表,有INPUT链、OUTPUT链、FORWARD链。(1)INPUT 链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤)(2)OUTPUT 链:过滤所有本机产生的数据包(对源地址得数据包的过滤)(3)FORWARD链:过滤所有路过本机的数据包(源地址和目标地址都不是本机的数据包)2)、NAT表:网络地址转换(Network Address Translation),有PREROUTING链、OUTPUT链和POSTROUTING链。(1)PREROUTING链 :数据包到达防火墙时改变包的目的地址(2)OUTPUT链:改变本地产生数据包的目标地址(3)POSTROUTING链:在数据包离开防火墙时改变数据包的源地址3)、Mangle表:修改数据包,改变包头中内容(TTL, TOS, MARK )(1)PREROUTING 链:数据包进入防火墙后,路由判断之前改变数据包(2)POSTROUTING链:数据包确定了目标地址后,即路由判断前改变数据包(3)OUTPUT链:在数据包被确定目的地址前改变数据包(4)INPUT链:在数据包进入本机后,应用程序接受之前改变数据包(5)FORWARD链:第一次路由判断之后,最后一次路由判断前改变数据包IPTABLES中数据包和4种被跟踪连接的4种不同状态。(1)NEW : 该包想要开始一个连接(重新连接或将连接重定向)(2)RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的(3)ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。2、iptables基本操作:1)、启动iptables: service iptables start
# service iptables startiptables:应用防火墙规则: [确定]2)、关闭iptables: service iptables stop
# service iptables stopiptables:将链设置为政策 ACCEPT:filter [确定]iptables:清除防火墙规则: [确定]iptables:正在卸载模块: [确定]
3)、重启iptables:service iptables restart
# service iptables restart iptables:将链设置为政策 ACCEPT:filter [确定]iptables:清除防火墙规则: [确定]iptables:正在卸载模块: [确定]iptables:应用防火墙规则: [确定]
4)、查看iptables 状态:service iptables restart
# service iptables status 表格:filterChain INPUT (policy ACCEPT)num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT)num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT)num target prot opt source destination
5)、保存iptables 配置:service iptables save
# service iptables saveiptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]6)、iptables服务配置文件:
/etc/sysconfig/iptables-config7)、iptables规则保存文件:
/etc/sysconfig/iptables3、iptables的命令及命令实例1)、命令格式:
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转](1)、表名:filter(默认表)、nat、mangle。(2)、常用的命令选项:
选项名 功能及特点-A 在指定链的末尾添加(--append)一条新的规则-D 删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则-I 在指定链中插入(--insert)一条新的规则,默认在链的开头插入-R 修改、替换(--replace)指定链中的一条规则,按规则序号或内容确定-L 列出(--list)指定链中的所有的规则进行查看,默认列出表中所有链的内容-F 清空(--flush)指定链中的所有规则,默认清空表中所有链的内容-N 新建(--new-chain)一条用户自己定义的规则链-X 删除指定表中用户自定义的规则链(--delete-chain)-P 设置指定链的默认策略(--policy)-n 用数字形式(--numeric)显示输出结果,若显示主机的 IP地址而不是主机名-P 设置指定链的默认策略(--policy)-Z 清零计数器, 将所有的 chain 的计数与流量统计都归零-v 查看规则列表时显示详细(--verbose)的信息-V 查看iptables命令工具的版本(--Version)信息-h 查看命令帮助信息(--help)--line-number 查看规则列表时,同时显示规则在链中的顺序号(3)、链名,这里默认用的表是filter,filter有3条链:
INPUT链 – 处理来自外部的数据。 OUTPUT链 – 处理向外发送的数据。 FORWARD链 – 将数据转发到本机的其他网卡设备上。
(4)、条件匹配:条件匹配分为基本匹配和扩展匹配,拓展匹配又分为隐式扩展和显示扩展。a)、基本匹配包括:
参数 说明-p 指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议-s 指定数据包的源地址参数,可以使IP地址、网络地址、主机名-d 指定目的地址-i 输入接口-o 输出接口
b)、隐式扩展
扩展条件 需包含 扩展项 说明-m tcp -p tcp --sport 源端口 --doprt 目标端口 --tcp-flages (SYN,ACK,RST,FIN,SYN) --syn 第一次握手 -m udp -p upd --sport 源端口 --dport 目标端口 -m icmp -p icmp --icmp-type 8:echo-request 0:recho-reply
c)、常用显示扩展
扩展条件 扩展项 说明-m state --state 用于实现连接状态检测 NEW,ESTABLISHED,RELATED,INVALID-m multiport --source-port 多个源端口 --destination-port 多个目的端口 --port 源和目的端口 -m limit --limit 速率(如5/minute 表示每分钟5个数据包) --limit-burst 峰值速率(如100 最大不能超过100个数据包) -m iprange --src-range ip-ip 源ip范围 --dst-range ip-ip 目的ip范围 -m mac -mac-source Mac地址限制-m string --algo [bm|bkp] 匹配算法 --string “Pattern” 要匹配的字符串 -m recent --name 设定列表名称,默认为DEFAULT --rsoure 源地址,此为默认 --rdest 目的地址 --set 添加源地址的包到列表中 --update 每次建立连接都更新列表 --rcheck 检查地址是否在列表中 --seconds 指定时间内,必须与—rcheck或—update同时使用 --hitcount 命中次数,必须与—rcheck或-- update同时使用 --remove 在列表中删除相应地址
(5)、目标值 –j 数据包控制的方式包括以下几种:
ACCEPT:允许数据包通过。 DROP:直接丢弃数据包,不给出任何回应信息。 REJECT:拒绝数据包通过,必须时会给数据发送端一个响应信息。 LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。 QUEUE:防火墙将数据包移交到用户空间 RETURN:防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)
常用命令实例:1)、删除iptables 所有的规则:iptables –F
# iptables –F
2)、查看iptables 的规则:iptables –nvL
# iptables -nvLChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 7 488 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 6 packets, 712 bytes)pkts bytes target prot opt in out source destination
参数-nvL,n表示不用主机名或者域名查看,v表示查看详细的信息,L表示查看。这是常用的选项。
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)这表示INPUT链,默认策略(policy)是 接受、允许的,0 packets,表示匹配到有多少数据包; 0 bytes表示匹配到有多少数据量。pkts bytes target prot opt in out source destination 这一行分别表示:匹配的数据包、匹配的数据量、目标值(ACCEPT/DORP/REJUCE)、端口号、选项、INPUT接口(网卡)、OUTPUT接口(网卡)、源地址、目的地址。
3)、增加一条规则都最后使用 –A 参数
# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
-A参数是把规则增加到现有规则的最后面,这里是开放80端口的web服务,假如前面有一条规则默认是拒绝了所有的连接,那么我们增加的这条规则是不能生效执行的。
4)、插入一条规则到第一行,使用-I 参数# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
我们用-I 参数把规则插入到第一行,防火墙最先匹配到的规则就是它,符合规则就按照目标值执行。
5)、指定删除一条规则,用-D参数,后跟序号,先用iptables -nvL --line-numbers查看序号# iptables -D INPUT 7# iptables -nvLChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 7 994 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 438 33144 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 2 852 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 37 2762 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 4 packets, 432 bytes)pkts bytes target prot opt in out source destination
6)、修改一条规则,使用-R参数。
# iptables -R INPUT 1 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
7)、修改默认策略,使用-P 参数。
# iptables -P INPUT DROP
8)、运行远程主机进行SSH连接,使用INPUT和OUTPUT。
# iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT# iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
这里用到INPUT链和OUTPUT链,这里涉及到TCP/IP的三次握手,建立连接的过程。
9)、拒绝ICMP包回响。使用 -p icmp --icmp-type 8# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
# iptables -nvLChain INPUT (policy DROP 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 4 240 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8 18 5091 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW,ESTABLISHED 1352 104K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 1 60 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 2 852 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 286 24021 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state NEW,ESTABLISHED Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 12 packets, 964 bytes)pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * eth0 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state ESTABLISHED
可以通过iptables –nvL查看iptables里面的规则,在pkts 和bytes已经匹配到了拒绝的数据包。
10)、一些常用的命令:iptables –nvL:查看所有的规则iptables -F :清除所有的已订定的规则;iptables -X :清除所有使用者 "自定义" 的 chain (应该说的是 tables );iptables -Z :将所有的 chain 的计数与流量统计都归零(pkts 和bytes下面的数字)iptables-save:查看防火墙的所有规则service iptables save 保存iptables 规则。文件保存到/etc/sysconfig/iptables
配置一个NAT表的防火墙查看本机关于NAT的设置情况: iptable –t nat –nvL
# iptables -t nat -nvLChain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination
假设现在有网卡eth0和eth1,其中eth0的ip为192.168.171.128,eth1 的ip 为202.96.128.22,eth1已经连接到了互联网,eth0和另外一台设备192.168.171.100是互通的,但是没有连接到互联网。现在需要用iptables的nat 功能连接互联网。配置nat表用到了POSTROUTING链,更改数据包的源地址和源端口为能够连接到互联网的地址和端口。1)、打开转发功能修改 /etc/sysctl.conf文件文件内的net.ipvr.ip_forward=0这一行修改为net.ipvr.ip_forward=1.可以使用vim 编辑处理,也 可以这样处理:
echo "1" > /proc/sys/net/ipv4/ip_forward
如果是编辑/etc/sysctl.conf文件修改,使用如下命令执行生效
sysctl -p /etc/sysctl.conf配置转发:
# iptables -t nat -A POSTROUTING -s 192.168.171.0/24 -o eth1 -j MASQUERADE
-t 后面接的nat表,-A 是增加到POSTROUTING 链上的规则,-s 表示来源的地址,-O 表示 出口的网卡接口,-j 表示执行的动作,这里是隐藏,伪装的意思。