Linux防火墙
netfilter:frame
iptables:数据报文过滤,NAT、mangle等规则生成的工具
网络:IP报文首部,TCP报文首部
防火墙:硬件、软件:规则(匹配标准,处理办法)
Framework:
默认规则:
开放:堵关闭:通
规则:匹配标准
IP:源IP,目标IPTCP:源端口(sport),目标端口(dport),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:源端口(sport),目标端口(dport)
ICMP:icmp-type
数据报文过滤:
OpenDBS
Linux2.0
ipfw/firewall
Linux2.2
ipchain/firewallLinux2.4
iptables/netfilter
hook function:钩子函数
prerouting
input
output
forward
postrouting
规则链:
PREROUTINGINPUT
FORWARD
OUTPUT
POSTROUTING
filter(过滤):表
input 进output 出
forward 转发
nat(地址转换):表
preroutingoutput
postrouting
mangle(拆开、修改、封装):表
preroutinginput
forward
output
postrouting
raw():
preroutingoutput
数据包过滤匹配流程
可以使用自定义链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制
用户可以删除自定义的空链
默认链无法删除
每个规则都有两个内置的计数器
被匹配的报文个数被匹配的报文大小之和
规则:匹配标准,处理动作
iptables [ -t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
匹配标准:
通用匹配
-s, –src :指定源地址-d, –dst:指定目标地址
-p {tcp|udp|icmp}:指定协议
-i INTERFACE :指定数据报文流入的接口
可用于定义标准的链:PREOUTING,INPUT,FORWARD
-o INTERFACE:指定数据报文流出的接口
可用于标准定义的链:OUTPUT ,POSTROUTING,FORWARD
扩展匹配
隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用 -p {tcp|udp|icmp}
–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:匹配tcp三次握手的第一次-p icmp
–icmp-type
0: echo-reply 响应报文8: echo-request 请求报文
iptables -A INPUT -d 172.16.100.7 -p icmp –icmp-type 8 -m state –state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -p icmp –icmp-type 0 -m state –state ESTABLISHED -j ACCEPT
-p udp
–sport–dport
-p tcp –dport
显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
-m EXTESTION –spe-optstate: 状态扩展
结合 追踪会话的状态
NEW: 新连接请求ESTABLISHED:已建立的连接INVALID:非法连接RELATED:相关联的-m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.100.7 -p tcp -m state –state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -m state –state RELATED,ESTABLISHED -j ACCEPT
ftp服务首先要装载ip_conntrack_ftp和ip_nat_ftp模块
#vim /etc/sysconfig/iptables-configIPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"
iptables -A INPUT -d 172.16.100.7 -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
-m multiport: 离散的多端口匹配扩展
–source-ports–destination-ports–ports
-m multiport –destination-ports 21,22,80 -j ACCEPT
条件取反:!,-s ! 172.16.100.6-m iprange
–src-range–dst-range
-s,-d-s IP ,NET172.16.0.0/16 , 172.16.100.3-172.16.100.100
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 ECCEPT
-m connlimit :链接数限制
! –connlimit-above n
iptables -A INPUT -d 172.16.100.7 -p tcp –dport 80 -m connlimit –connlimit-above 2 -j ACCEPT-m limit
–limit RATE:#/minute #/second–limit-burst :#最多同时几个
iptables -A INPUT -d 172.16.100.7 -p icmp –icmp-type 8 -m limit –limit 5/minute –limit-burst 6 -j ACCEPT
-m string
–algo {bm|kmp}–sting "STRING"
iptables -A OUTPUT -s 172.16.100.7 -p tcp –drort 80 -m sting –algo kmp –sting "hehe" -j REJECT
处理动作:
-j TARGET :
ACCEPT:通过DROP:丢弃
REJECT:拒绝
LOG
–log-prefix "SRTING"
命令:
管理规则
-A:附加一条规则,添加在链的尾部-I CHAIN [num]: 插入一条规则,插入为对应CHAIN上的第num条;-D CHAIN [num]: 删除指定链中的第num条规则;-R CHAIN [num]: 替换指定的规则;
管理链:
-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链-P CHAIN: 设定指定链的默认策略;-N:自定义一个新的空链-X: 删除一个自定义的空链-Z:置零指定链中所有规则的计数器;-E: 重命名自定义的链;
查看类:
-L: 显示指定表中的规则;-n: 以数字格式显示主机地址和端口号;-v: 显示链及规则的详细信息-vv:-x: 显示计数器的精确值–line-numbers: 显示规则号码
动作(target):
ACCEPT:放行DROP:丢弃REJECT:拒绝DNAT:目标地址转换SNAT:源地址转换REDIRECT:端口重定向MASQUERADE:地址伪装LOG:日志MARK:打标记RETURN:返回,在自定义链执行完毕后使用返回,来返回原规则链
iptables -t filter -A INPUT -s 172.16.0.0/16 -j DROP例:允许172.16.100.7,sshd:22/tcp被访问
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp –dport 22 -j ACCEPTiptables -t filter -A OUTPUT -s 172.16.0.7 -d 172.16.0.0/16 -p tcp –sport 22 -j ACCEPT
iptables不是服务,但有服务脚本;服务脚本的主要作用在于管理保存的规则
装载及移除iptables/netfilter相关的内核模块;
iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, nf_conntracknf_conntrack:cat /proc/net/nf_conntrack
/proc/sys/net/nf_conntrack_max 记录数量/proc/sys/net/netfilter/
保存规则:
#service iptables save/etc/sysconfig/iptables#iptables -save > /etc/sysconfig/iptables.2016
#iptables -restore < /etc/sysconfig/iptables.2016
默认规则
iptables -A INPUT -d 192.168.108.130 -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPTiptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -d 192.168.108.130 -p tcp -m multiport –destination-ports 21,22,80,3306 -m state –state NEW -j ACCEPT
iptables -A INPUT -d 192.168.108.130 -p icmp –icmp-type 8 -m limit –limit 1/second –limit-burst 5 -j ACCEPT
iptables -A OUTPUT -s 192.168.108.130/32 -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
service iptables save
练习:判断下述规则的意义:
# iptables -N clean_in# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
# iptables -A clean_in -p tcp ! –syn -m state –state NEW -j DROP
# iptables -A clean_in -p tcp –tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp –tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 172.16.100.7 -j RETURN
# iptables -A INPUT -d 172.16.100.7 -j clean_in
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
# iptables -A INPUT -i eth0 -m multiport -p tcp –dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p udp –dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -p udp –dport 1026 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p tcp –dports 1433,4899 -j DROP
# iptables -A INPUT -p icmp -m limit –limit 10/second -j ACCEPT
利用iptables的recent模块来抵御DOS攻击
ssh: 远程连接,
iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROPiptables -I INPUT -p tcp –dport 22 -m state –state NEW -m recent –set –name SSHiptables -I INPUT -p tcp –dport 22 -m state –state NEW -m recent –update –seconds 300 –hitcount 3 –name SSH -j DROP
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH–set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。–update 是指每次建立连接都更新列表;–seconds必须与–rcheck或者–update同时使用–hitcount必须与–rcheck或者–update同时使用3.iptables的记录:/proc/net/ipt_recent/SSH也可以使用下面的这句记录日志:iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –update –name SSH –second 300 –hitcount 3 -j LOG –log-prefix "SSH Attack"NAT :Network address Translation
DNAT:目标地址转换SNAT:源地址转换(POTROUTING, OUTPUT)
-j SNAT
–to-source-j MASQUERADE 自动识别外网网卡
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to-source 123.2.13.2-j DNAT
–to-destination IP[:port]
iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp –dport 80 -j DNAT –to-destination 192.168.100.2PNAT:port NAT
layer7 — l7
应用:xunlei, qq, netfilter<–patch
-m layer7 –l7proto xunlei -j DROP
1、给内核打补丁,并重新编译内核2、给iptables源码打补丁,并重新编译iptables3、安装l7proto
kernel, patch
iptables, patch
Kernel Patch
# 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
Compiles 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/# service iptables start
l7-filter uses the standard iptables extension syntax
# iptables [specify table & chain] -m layer7 –l7proto [protocol name] -j [action]iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT –to-source 172.16.100.7
iptables -A FORWARD -s 192.168.10.0/24 -m layer7 –l7proto qq -j REJECT
-m time
–datestart –datestop–timestart –timestop
iptables -A FORWARD -s 192.168.10.0/24 -m time –timestart 08:10:00 –timestop 12:00:00 -j DROPiptables -A FORWARD -s 192.168.10.0/24 -m time –timestart 14:30:00 –timestop 18:00:00 -j DROP
iptables脚本:
#!/bin/bashipt=/usr/sbin/iptables
einterface=eth1
linterface=eth0
eip=172.16.100.7
lip=192.168.10.6
$ipt -t nat -F
$ipt -t filter -F
$ipt -t mangle -F
$ipt -N clean_up
$ipt -A clean_up -d 255.255.255.255 -p icmp -j DROP
$ipt -A clean_up -j RETURN
IDS:
nids:snort + iptables =NIPShids:
转载请注明:阿汤博客 » Linux防火墙iptables
博主最近没怎么更新啊,我来转转。
拜读大侠博客,感悟人生道理!
就是喜欢看你博客!