linux下iptables防火墙详解
Linux网络防火墙基础知识
工作在主机或网络的边缘,对于进出的数据报文按照事先定义好的规则中的匹配标准进行检查,并做出对应的处理办法的机制称作防火墙。
IP报文首部:主要包含源IP,目标IP
TCP报文首部:主要包含源端口,目标端口,标志位SYN,ACK,RST,FIN
匹配标准解释:
IP: 源IP,目标IP
TCP: 源端口,目标端口
TCP三次握手三个阶段表示:
第一阶段: SYN=1,FIN=0,RST=0,ACK=0;
第二阶段: SYN=1,ACK=1,FIN=0,RST=0;
第三阶段: ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)
UDP: 源端口,目标端口
ICMP:icmp-type 0 表示echo-reply, 8 表示echo-request
2.Iptables防火墙分为四个表五个链
四个表:filter,nat,mangle,row
五个链:PREROUTING,INPUT,FORWORD,OUTPUT,POSTROUTING
filter(过滤表):可应用于此3个规则链INPUT,OUTPUT,FORWARD
nat(地址转换表):可应用于此3个规则链PREROUTING,OUTPUT,POSTROUTING
mangle(拆开/修改/封装等表):可应用于此5个规则链,如下: PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw(与mangle相反保留数据报文源有格式):可应用于此2个规则链PREROUTING,OUTPUT
注意:iptabels :可以使用自定链,但只在被调用时才能发挥作用
可以删除自定义的空链,但默认链无法删除
每个规则链都有两个内置的计数器:被匹配的报文个数和被匹配的报文大小之和
3.iptables命令:
格式: iptables [-t 表] 命令 链 [num] 匹配标准 -j 处理办法
3.1.匹配标准:分为通用匹配和扩展匹配,而扩展匹配又分为隐含扩展和显式扩展
(1).通用匹配:
-s, --src: 指定源地址
-d, --dst:指定目标地址
-p {tcp|udp|icmp}:指定协议
-i 网络接口: 指定数据报文流入的接口
-o 网络接口: 指定数据报文流出的接口
(2).扩展匹配:
(2.1).隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目标端口
--tcp-flags mask comp: 只检查mask指定的标志位(逗号分隔),comp列表中出现的标记位必须为 1,comp中没出现,而mask中出现的,必须为0;例如:
--tcp-flags SYN,FIN,ACK,RST SYN = --syn
--syn
-p icmp --icmp-type [0: echo-reply 8: echo-request]
-p udp --sport 或 --dport
(2.2).显式扩展: 必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
格式:-m 扩展 指定扩展类型 其他选项值
(2.2.1).状态扩展: -m state 结合ip_conntrack追踪会话的状态
NEW: 新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接
RELATED:相关联的
例如: -m state --state NEW,ESTABLISHED -j ACCEPT
(2.2.2).离散的多端口匹配扩展:-m multiport
--source-ports #将多个不连续源端口写在一条iptables语句中
--destination-ports #将多个不连续目标端口写在一条iptables语句中
--ports将多个不连续端口(含源端口和目标端口)写在一条iptables语句中
例如:-m multiport --destination-ports 21,22,80 -j ACCEPT
(2.2.3).连续的IP地址范围扩展:-m iprange
--src-range
--dst-range
例如: -m iprange --src-range 1.1.1.2-1.1.1.9 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
(2.2.4).连接数限制:-m connlimit
! --connlimit-above n :通常客户端达到连接数上限n拒绝,取反小于n才放行
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j ACCEPT
(2.2.5).单位时间响应限制:-m limit
--limit RATE: 每个单位时间内响应的平均个数
--limit-burst n :首次第一批响应个数
例如:-m limit --limit 5/miniute --limit-burst 10
(2.2.6).匹配字符串限制:-m string
--algo {bm|kmp}
--string "STRING"
例如:-m string --algo kmp --sting "abcd" -j REJECT
iptables -I OUTPUT -d 1.1.1.19 -m string --algo kmp --sting "abcd" -j REJECT
条件取反:! 例如:-s ! 172.16.1.1,表示匹配除172.16.1.1外所有源IP地址
3.2.命令:
管理规则
-A:附加一条规则,添加在链的尾部
-I CHAIN [num]: 插入一条规则,插入为对应CHAIN上的第num条;
-D CHAIN [num]: 删除指定链中的第num条规则;
-R CHAIN [num]: 替换指定的规则;
例如:iptables -D INPUT 2 #删除INPUT链中第2条规则
管理链:
-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
-P CHAIN: 设定指定链的默认策略;
-N:自定义一个新的空链
-X: 删除一个自定义的空链
-Z:清除指定链中所有规则的计数器;
-E: 重命名自定义的链;
例如:iptables -P INPUT DROP #将INPUT链默认策略为拒绝
查看类:
-L: 显示指定表中的规则;
-n: 以数字格式显示主机地址和端口号;
-v: 显示链及规则的详细信息,或用-vv,-vvv
-x: 显示计数器的精确值
--line-numbers: 显示规则号码
例如:iptables -L -n #查看当前INPUT链中现有规则
3.3.处理办法: -j (TARGET)
ACCEPT:放行
DROP:丢弃
REJECT:拒绝,弹回信息
DNAT:目标地址转换,常应用于PREROUTING
SNAT: 源地址转换, 常应用于POSTROUTING
REDIRECT:端口重定向
MASQUERADE:地址伪装,常应用于ADSL拨号等动态获取IP场景
MARK:打标记
RETURN:新增链返回主链处理
CHAIN:主链调用新增链
LOG:日志
--log-prefix "STRING"
例如:iptables -I INPUT -d 1.1.1.19 -p icmp -j LOG --log-prefix "firewall log--"
4.iptables不是服务,但有服务脚本,主要作用在于管理保存的规则
# service iptables save 并保存在此文件中:/etc/sysconfig/iptables
service iptables stop 清除并移除iptables相关模块
service iptatbles start 加载iptables相关模块
# iptables-save > /etc/sysconfig/iptables.bak
# iptables-restore < /etc/sysconfig/iptables.bak
装载及移除iptables/netfilter相关的内核模块;
iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack
5.仅允许1.1.1.0/24网段上能ssh访问1.1.1.19主机,请在1.1.1.19linux主机上写出对应iptables
iptables -t filter -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWORD DROP
6.允许所有客户端访问1.1.1.19网站服务器,请在1.1.1.19linux主机上写出对应iptables
iptables -t filter -A INPUT -d 1.1.1.19 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWORD DROP
7.允许1.1.1.19能够ping通所有主机,但其他主机不能ping1.1.1.19
iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 0 -f ACCEPT
注意:0代表echo-reply响应报文,8代表echo-request请求报文
-t fliter没有写,iptables命令默认不写就是指filter表
默认策略确认是拒绝,否则测试不到效果,拒绝策略如上已给出
8.通过状态扩展,追踪连接方式,允许所有主机能ssh访问1.1.1.19服务器,但服务器不能ssh连出去
iptables -L -n #查看现有的iptables filter表现有规则
iptables -F #清空iptables filter表所有规则
iptables -A INPUT -d 1.1.1.19 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
9.通过状态扩展,追踪连接方式,允许所有主机能访问1.1.1.19服务器网站,但服务器不能上网
iptables -A INPUT -d 1.1.1.19 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptstate #查看系统tcp/udp/icmp等连接状态命令
10.通过状态扩展,追踪连接方式,允许所有主机能PING通1.1.1.19服务器,但服务器不能PING出去
iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
11.将OUTPUT链中都是ESTABLISHED规则条目.精减汇总成一个条目
iptables -L -n --line-numbles #查看现有规则
Chain OUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 1.1.1.19 0.0.0.0/0 tcp spt:22 state ESTABLISHED
2 ACCEPT tcp -- 1.1.1.19 0.0.0.0/0 tcp spt:80 state ESTABLISHED
3 ACCEPT icmp -- 1.1.1.19 0.0.0.0/0 icmp type 0 state ESTABLISHED
iptables -I OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED -j ACCEPT
再删除原有3条OUTPUT规则
iptables -D OUTPUT 4
iptables -D OUTPUT 3
iptables -D OUTPUT 2
iptables -L -n #查看现有OUTPUT规则,只剩一条刚插入的汇总规则
12.通过状态扩展,追踪连接方式,允许所有主机能连到1.1.1.19 FTP服务器
首先加载iptables ftp模块,即vim /etc/sysconfig/iptables-config
添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
service iptables save
service iptables restart
iptables -I INPUT -d 1.1.1.19 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 1.1.1.19 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED,RELATED -j ACCEPT
13.允许1.1.1.0内客户端通过1.1.1.19 DNS服务器解析
解析内网主机:
iptables -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p udp --sport 53 -j ACCEPT
通过根迭代解析外部DNS上网:
iptables -A INPUT -d 1.1.1.19 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -s 1.1.1.19 -p udp --dport 53 -j ACCEPT
14.将INTPUT链中都是多个不连续的端口规则条目.精减汇总成一个条目
iptables -L -n --line-numbles #查看现有规则
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 1.1.1.19 state RELATED,ESTABLISHED
2 ACCEPT tcp -- 0.0.0.0/0 1.1.1.19 tcp dpt:22 state NEW,ESTABLISHE
3 ACCEPT tcp -- 0.0.0.0/0 1.1.1.19 tcp dpt:80 state NEW,ESTABLISHED
4 ACCEPT tcp -- 0.0.0.0/0 1.1.1.19 tcp dpt:21 state NEW,ESTABLISHED
iptables -I INPUT 2 -d 1.1.1.19 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
iptables -D INPUT 3
iptables -D INPUT 3
iptables -D INPUT 3
iptables -L -n --line-numbles #再查看现有规则
15.自定义一条链Deny_in,拒绝接收ping广播包,拒绝tcp标志位全为1和全为零,最后返回INPUT链,并让INPUT链调用Deny_in链,继续处理
iptables -N Deny_in
iptables -A Deny_in -d 255.255.255.255 -p icmp -j DROP
iptables -A Deny_in -d 172.16.255.255 -p icmp -j DROP
iptables -A Deny_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A Deny_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A Deny_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A Deny_in -d 1.1.1.19 -j RETURN
iptables -I INPUT -j Deny_in
16.利用iptables的recent模块来抵御DOS攻击,
利用connlimit模块将单IP的并发设置为10;可以根据实际情况增大该值;
利用recent和state模块限制单IP在120s内只能与本机建立3个新连接。否则会被限制2分钟,
2分钟后才能恢复访问连接。
iptables -I INPUT 2 -p tcp --dport 22 -m connlimit --connlimit-above 10 -j DROP
iptables -I INPUT 3 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT 4 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 120 --hitcount 3 --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 120 --hitcount 3 -j LOG --log-prefix "SSH Attack" #记录日志
说明:上面第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
上面第三句是指SSH记录中的IP,120s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
17.利用SNAT技术:linux防火墙主机有两块网卡,内网卡IP为192.168.1.1,外网卡公网地址为 202.98.7.10,让192.168.1.0/24所有客户端上网,实现源地址静态转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.98.7.10
注意要开启ip_forward路由功能,回包目标地址转换将会是自动进行,无需人工干预
18.利用MASQUERADE技术,如果是ADSL拨号上网,linux防火墙主机有两块网卡,内网卡IP为192.168.1.1,外 网卡公网地址为动态获取,让192.168.1.0/24所有客户端上网,实现源地址动态转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE #下面一条指令功能一样
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
注意:如果是ADSL拨号上网,需安装rp-pppoe拨号软件
19.Forward转发功能:让内网1.1.1.0/24所有客户端能访问外部网站,但外网不能访问内网客户端
iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -P FORWARD DROP
20.Forward转发功能:让内网1.1.1.0/24所有客户端能PING通外部,但外网不能PING内部
iptables -A FORWARD -s 1.1.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -P FORWARD DROP
21.Forward转发功能:让内网1.1.1.0/24所有客户端能连接外部FTP,但外网不能FTP内部
iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A FORWARD -m state --state RELATED ESTABLISHED -j ACCEPT
iptables -P FORWARD DROP
注意:加载iptables ftp模块,即vim /etc/sysconfig/iptables-config
添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
22.利用DNAT技术:linux防火墙主机有两块网卡,内网卡IP为1.1.1.1,外网卡公网地址为202.98.7.10,让外网可访问内访问1.1.1.18网站,实现目标地址转换
iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18
23.利用DNAT技术:linux防火墙主机有两块网卡,内网卡IP为1.1.1.1,外网卡公网地址为202.98.7.10,让外网可访问内访问1.1.1.18:8080网站,实现目标地址转换
iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18:8080
24.Forward转发功能:拒绝转发含有非法字样如"abcd"字符串内容信息
iptables -A FORWARD -m string --algo kmp --string "abcd" -j DROP
25.利用iptables技术根据协议协议特征码禁止内网客户端使用qq,skype,msn,迅雷等七层协议软件
要想使用七层协议,必须使linux系统达到以下条件
25.1.给内核打补丁,并重新编译内核
25.2.给iptables源码打补丁,并重新编译iptables
25.3.安装l7proto,七层协议
下载:内核:linux-2.6.28.10.tar.gz,网络过滤器:netfilter-layer7-v2.22.tar.gz以及
协议特征码:l7-protocols-2009-05-28
首先给内核打补丁,并重新编译内核
# tar zxvf linux-2.6.28.10.tar.gz -C /usr/src
# tar zxvf netfilter-layer7-v2.22.tar.gz -C /usr/src
# cd /usr/src
# ln –s linux-2.6.28.10 linux
# cd /usr/src/linux/
# patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
# cp /boot/config-2.6.18-164.el5 /usr/src/linux/.config
# make menuconfig
主要编译选项:
Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration
<M> Netfilter connection tracking support
<M> “layer7” match support
<M> “string” match support
<M> “time” match support
<M> “iprange” match support
<M> “connlimit” match support
<M> “state” match support
<M> “conntrack” connection match support
<M> “mac” address match support
<M> "multiport" Multiple port match support
Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
<M> IPv4 connection tracking support (required for NAT)
<M> Full NAT
<M> MASQUERADE target support
<M> NETMAP target support
<M> REDIRECT target support
# make
# make modules_install
# make install
给iptables源码打补丁,并重新编译iptables
# cp /etc/init.d/iptables ~/iptables
# cp /etc/sysconfig/iptables-config ~/
# rpm -e iptables-ipv6 iptables iptstate --nodeps
# tar jxvf iptables-1.4.6.tar.bz2 –C /usr/src
# cd /usr/src/iptables-1.4.6
cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extensions/
# ./configure --prefix=/usr --with-ksource=/usr/src/linux
# make
# make install
安装七层协议特征码:
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
# mv ~/iptables /etc/rc.d/init.d/
注意:编译的iptables的二进制文件与rpm包安装的路径有所不同,如需运行iptables脚本服务,必须修改对应的脚本文件里的命令路径
# service iptables start
七层协议相关iptables命令格式:
iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
禁止内网192.168.1.0/24通过202.100.8.66外网口登入qq
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.100.8.66
iptables -I FORWARD -s 192.168.1.0/24 -m layer7 --l7proto qq -j DROP
25.4.限制客户端上网时间段iptables命令
iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 08:00:00-12:00:00 -j DROP
iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 14:00:00-17:00:00 -j DROP