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
[root@balichlinux ~]# service iptables start ……………………………启动iptables .
iptables:应用防火墙规则: [确定]
[root@balichlinux ~]#
2)、关闭iptables: service iptables stop
[root@balichlinux ~]# service iptables stop ………………………………关闭iptables
iptables:将链设置为政策 ACCEPT:filter [确定]
iptables:清除防火墙规则: [确定]
iptables:正在卸载模块: [确定]
[root@balichlinux ~]#
3)、重启iptables:service iptables restart
[root@balichlinux ~]# service iptables restart ……………………………………… 重启iptables
iptables:将链设置为政策 ACCEPT:filter [确定]
iptables:清除防火墙规则: [确定]
iptables:正在卸载模块: [确定]
iptables:应用防火墙规则: [确定]
[root@balichlinux ~]#
4)、查看iptables 状态:service iptables restart
[root@balichlinux ~]# service iptables status …………………………………查看iptables 状态
表格:filter
Chain 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
[root@balichlinux ~]#
5)、保存iptables 配置:
[root@balichlinux ~]# service iptables save ……………………………………保存iptables 配置
iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]
[root@balichlinux ~]#
6)、iptables服务配置文件:/etc/sysconfig/iptables-config
7)、iptables规则保存文件:/etc/sysconfig/iptables
3、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
[root@balichlinux ~]# iptables –F ……………………清空iptables
2)、查看iptables 的规则:iptables –nvL
root@balichlinux ~]# iptables -nvL
Chain 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
[root@balichlinux ~]#
参数-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 参数
[root@balichlinux ~]# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
-A参数是把规则增加到现有规则的最后面,这里是开放80端口的web服务,假如前面有一条规则默认是拒绝了所有的连接,那么我们增加的这条规则是不能生效执行的。
4)、插入一条规则到第一行,使用-I 参数
[root@balichlinux ~]# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
我们用-I 参数把规则插入到第一行,防火墙最先匹配到的规则就是它,符合规则就按照目标值执行。
5)、指定删除一条规则,用-D参数,后跟序号,先用iptables -nvL --line-numbers查看序号
[root@balichlinux ~]# iptables -D INPUT 7 ………………………………………删除第7条规则。
[root@balichlinux ~]# iptables -nvL
Chain 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
[root@balichlinux ~]#
6)、修改一条规则,使用-R参数。
[root@balichlinux ~]# iptables -R INPUT 1 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@balichlinux ~]#
7)、修改默认策略,使用-P 参数。
[root@balichlinux ~]# iptables -P INPUT DROP ………………设置INPUT链默认策略为DROP
8)、运行远程主机进行SSH连接,使用INPUT和OUTPUT。
[root@balichlinux ~]# iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@balichlinux ~]# 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 …………………
[root@balichlinux ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
[root@balichlinux ~]# iptables -nvL
Chain 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
[root@balichlinux ~]# iptables -t nat -nvL
Chain 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
[root@balichlinux ~]#
假设现在有网卡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 使其生效。
配置转发:
[root@balichlinux ~]# iptables -t nat -A POSTROUTING -s 192.168.171.0/24 -o eth1 -j MASQUERADE
-t 后面接的nat表,-A 是增加到POSTROUTING 链上的规则,-s 表示来源的地址,-O 表示 出口的网卡接口,-j 表示执行的动作,这里是隐藏,伪装的意思。
本文转自 巴利奇 51CTO博客,原文链接:http://blog.51cto.com/balich/1745244