iptables
优化规则:尽量减少规则条目,彼此不相关的匹配,用较多放在上面,属于同一功能匹配规则更严格的放在上面
一、netfilter:
四个表:raw,mangle,nat,filter
五链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
分别在那些链上使用
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING(DNAT),POSTROUTING(SNAT),OUT(SNAT)
mangle: PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw:POSTROUTING,OUTPUT
写规则注意事项:
先确定功能(表),确定报文流向(链),确定实现的目录,确定匹配条件 ,处理方法
规则文件:/etc/sysconfig/iptables
保存启用中的规则于规则文件中
1、#iptables-save > /etc/sysconfig/iptables
2、#service ipitables save
生效规则文件中的规则:
1、#iptables-restore < /etc/sysconfig/iptables
2、#service iptables save
执行的操作:清空现有规则,读取并生效规则文件中的规则。
at任务计划,重新载入 原有保存的规则链(因为设置iptables 是立即生效的,为了保险期间,,操作错误。定义个计划任务恢复是有必要的。一次性)
# at now +30min
at> iptables-restore < /etc/sysconfig/iptables
ctrl+d(保存计划任务)
atq:查看任务作业在队列中的任务
at -l 看任务作业在队列中的任务
at -d 删除任务作业
atrm 删除任务作业
二、
规则的基本语法(我们下面的实例都是白名单)
设置规则:
iptables -t 表 -P 链 处理方法
实例:设置白名单(全部关掉)
#iptables -t filter -P INPUT DROP
#iptables -t filter -P OUTOUT DROP
#iptables -t filter -P FORWARD DROP
查询规则:
#iptables -L -n -v
#watch -n 1 'iptables -L -n -v --line-numbers'时时查看
查询序列号的命令
#iptables -L -n --line-numbers
添加链:
iptables -t 表 -A 链 实现的目标 匹配条件 处理方法
实例:开启ssh功能(只能172.16.3.0网段可以登入172.16.3.30)
#iptables -t filter -A INPUT -s 172.16.3.0/16 -d 172.16.3.30 -p tcp --dport 22 -j ACCEPT
#iptables -t fileter -A OUTPUT -s 172.16.3.30 -d 172.16.3.0/16 -p tcp --sport22 -j ACCEPT
删除链:
iptables -t 表 -D 链 序列号
实例:删除ssh链
#iptables -D INPUT 1(默认表为filter)
插入链:(不指明插入链的位置默认是插入第一链)
iptables -t 表 -I 链 链的位置 实现的目标 匹配条件 处理方法
实例:开启httpd访问(只允许172.16.3.0网段的主机可以访问172.16.3.30WEB服务器)
#iptables -I INPUT 3 -i eth0 -s 172.16.3.0/16 -d 172.16.3.30 -p tcp --dport 80 -j ACCEPT
#iptables -I OUTPUT 3 -s 172.16.3.30 -d 172.16.3.0/16 -o eht0 -p tcp --sport 80 -j ACCEPT
修改链:(先添加后减少)
iptables -t 表 -R 链 链的位置 实现的目标 匹配条件 处理方法
实例:修改INPUT第3条链,允许访问地址具体到172.16.3.1访问服务器
#iptables -R INOUT 3 -i eth0 -s 172.16.3.1 -d 172.16.3.30 -p tcp --dport 80 -j ACCEPT
三、扩展匹配
隐式扩展:当使用-p{tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项
tcp标志位:
--tcp-flages 要检查标志位列表的 匹配的生效的必须为1标志位。
用法:--tcp-flages syn,ack,rst,fin syn
--syn 相当于--tcp-flages syn,ack,rst,fin syn
#iptables -I INPUT -p tcp --tcp-flages all all -j DROP(全部为1的不允许)都是不正常的访问连接有可能是木马
#iptables -I INPUT -p tcp --tcp-flages all none -j DROP(全部为0的也不允许)
实例:允许TCP协议的应用系统可以通过tcp握手的第一个请求
iptables -I INPUT -p tcp --tcp-flages syn,ack,rst,fin syn -j ACCEPT
或者
iptables -I INPUT -p tcp --syn -j ACCEPT
udp:
-p udp [-m udp]:
--sprt PORT[-PORT]:指定源端口[范围]
--dport PORT[-PORT]:指定目标端口
实例:dns服务器
#iptables -A OUTPUT -s 172.16.3.30 -p udp --dprot 53 -j ACCEPT出去
#iptables -A INPUT -d 172.16.3.30 -p udp --sprot 53 -j ACCEPT进入
icmp
-p icmp [-m icmp]:
--icmp-type
8:ping请求
0:ping应答
实例:允许其他机器能ping通172.16.3.30
#iptables -I INPUT -d 172.16.3.30 -p icmp -j ACCEPT
#iptables -I INPUT -s 172.16.3.30 -p icmp -j ACCEPT
具体设置下:
iptables -A INPUT -d 172.16.3.30 -p icmp --icmp-type 0 -j ACCEPT 进入
iptables -A OUTPUT -s 172.16.3.30 -p icmp --icmp-type 8 -j ACCEPT 出去
显示扩展:调用netfilter额外模块实现特殊检查机制,要使用-m选项来指定调用那个模块
(使用相关功能,要使用iptables命令的-m选来加载相关模块)
1、multiport:多端口匹配(一次最多指定15个以内的端口)
可用于匹配非连续或连续端口;
专用选项
--source-ports,--sports port[,port,port:port]
--destination-ports,--dports
--ports
实例:开启22,和80端口
iptables -I INPUT -d 172.16.3.30 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.3.30 -p tcp -m multiport --dports 22,80 -j ACCEPT
2、iprange:匹配指定范围内的地址:
匹配一段连续的地址而非整个网络时有用
专用选项
--src-range IP [-IP]
--dst-range
可以取反
!--src-ragne IP [-IP]
!--dst-range
实例:允许3.100--3.200网段的主机可以使用3.30,vsftpd
iptables -A INPUT -d 172.16.3.30 -P tcp --dport 21 -m iprange --src-range 172.16.3.100-172.16.3.200 -j ACCEPT
iptables -A OUTPUT -s 172.16.3.30 -P tcp --sport 21 -m iprange --dst-range 172.16.3.100-172.16.3.200 -j ACCEPT
3、string:字符串匹配,能够检测报文应用层中的字符串。
字符匹配检查高效算法
kmp,bm
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING":STRING
实例:这里我们限制web服务器,网站中的内容进行限制,如果内容中出现ning的网站不给予送出
iptables -I OUTPUT -m string --algo kmp --string "ning" -j DROP
4、time:基于时间做访问控制
专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
Mon, Tue,
实例:设置3.30服务器上网站只有在,每周一、二、四、五的早上8点20到下午的18:40允许访问
# iptables -I INPUT -d 172.16.3.30 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
5、connlimit:连接数限制,对每个IP所能够发起并发连接数做限制;
专用选项:
[!]--connlimit-above N (要是白名单,大于N则DROP)
实例:限制ssh登入172.16.3.30最大连接数(注意,如果你想测试,超过限定数将被丢弃)
iptables -A INPUT -d 172.16.3.30 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP (超过两个则DROP)
6、limit:速率限制:
专用选项:
--limit n[/second|/minute|/hour|/day] 每多少时间发几个
--limit-burst n 空闲了多少个
实例:限制ping 172.16.3.30每5秒一个
iptables A INPUT -d 172.16.3.30 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT(每3秒钟一个)
iptables A OUTPUT -s 172.16.3.30 -p icmp --icmp-type 0 ACCEPT
7、state:状态检查
专用选项
--state
连接追踪中的状态:(上限/proc/sys/net/nv_conntrack_max)(访问量很大网站不能使用,追踪不能开启)
NEW: 新建立一个会话
ESTABLISHED:已建立的连接established
RELATED:有关联关系的连接
INVALID:无法识别的连接
调整连接追踪功能所能容纳的连接的最大数目;
/proc/sys/net/nv_conntrack_max
当前追踪所有连接
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:
放行被动模式下的FTP服务器:
1、装载模块/lib/modules/k
模块:nf_conntrack_ftp(lsmod | less)(想永久加载这个模块,编辑配置文件/etc/sysconfig/iptables-config并在里面添加IPTABLES_MODULES="nf_conntrack_ftp")
modprobe nf_conntrack_ftp
2、放行请求报文
(1)放行NEW状态对21端口请求的报文
(2)放行ESTABLISHE以及RALATED状态的报文
iptables -A INPUT -d 172.16.3.30 -p tcp -m multiport --dports 22,80,21 -m state --state NEW -j ACCEPT
iptables -I INPUT -d 172.16.3.30 -p tcp -m state --state ESTABLISHE,RELATED -j ACCEPT
3、放行响应报文:
(1)放行ESTALISHED以及RALATED状态的报文
iptables -A OUTPUT -s 172.16.3.30 -p tcp -m state --state ESTABLISHE,RELATED -j ACCEPT
防火墙的分类:
简单包过滤防火墙
带状态检测的包过滤防火墙
四:自定义链:只有被调用时才使用
RETURN(return):在自定义中无法匹配的将会返回主链。
创建自定义链:
格式:iptables -t 表 -N 链的名称
iptables -A 链的名称 .......
实例:创建自定义链httpd服务的控制
#iptables -t filter -N http_in(创建自定义链)
允许172.16.3.100-172.16.3.200的主机可以访问172.16.3.30
iptables -A http_in -d 172.16.3.1 -p tcp --dport 80 -m iprange --src-range 172.16.3.100-172.16.3.200 -j ACCEPT
把所创建的链实施调整
#iptables -A INPUT -d 172.16.3.1 -p tcp --dport 80 -j http_in
#iptables -A http_in -j RETURN ------------------自动调整到主链
备份写过的链,以备以后使用,可以输出重定向一个你想保存的为位置
#iptables-save > /root/iptables_20140809备份一个位置
#iptables-restore < /root/iptables_20140809恢复当前列表。
删除自定义链:
#iptables -F http_in清空自定义链
#iptables -X http_in (删除自定义且0引用的空链)
重命名自定义链:
格式:iptables -E old_name new_name
#iptables -E http_in httpd_in
五、网络防火墙:
转发器FORWARD(网络防火墙的控制要在FORWARD上写)
查看是否开启路由转发功能
#cat /proc/sys/net/ipv4/ip_forward
0
# echo 1 >>/proc/sys/net/ipv4/ip_forward-----临时修改ip_forward
# cat /proc/sys/net/ipv4/ip_forward
1
永久修改ip_forward
#vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
#sysctl -p
实例:限制局域用户周一、二、四、五,禁止上网
#iptables -A FORWARD -s 192.168.3.0/24 -m time --weekdays Mon,Tue,Thu,Fri -j DROP
NAT:地址转换
MASQUERADE:地址伪装(拨号时使用,使用动态地址上网时)伪装更换源地址
格式
SNAT源地址转换:(用途:局域网内主机访问外网时使用)
iptables -t nat -A POSTROUTING -s 需要转换的地址 -j SNAT --to-source 转换为那个地址
#iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 172.16.3.1
DNAT目标地址转换:(用途:外网访问局域网内的主机,主机在局域网内的网络中,没有划分vlan情况)
iptables -t nat -A PREROUTING -d 需要转换的地址 [-p tcp --dport 80] -j DNAT --to-destination 转换为的地址:端口号
#iptables -t nat -A PREROUTING -d 172.16.3.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.20:8080
PNAT源和目标地址都转换:(用途:外网访问局域网内的主机,主机在局域网内的网络中并且网络划分了vlan)
#iptables -t nat -A PREROUTING -d 172.16.3.1 -p tcp --dport 80 -j DNAT --to-destionation 192.168.3.30
#iptables -t nat -A POSTROUTING -s 172.16.3.20 -j SNAT --to-source 192.168.3.1
如果是拨号上网怎么源地址转换呢?(用途:局域网内的主机访问外网主机,外网IP为动态IP时)
iptables -t nat -A POSTROUTING -s 需要转换的地址 [-p tcp --dport 80] -j MASQUERADE
2、查看网络防火墙规则
#iptables -t nat -L -n -v
3、删除防火墙规则
#iptables -t nat -D POSTROUTING 2
实例:WEB服务器
防火墙有两个网卡:一个公网IP 172.16.3.1 一个内网地址IP 192.168.3.1
外网主机:IP 172.16.3.20
内网主机:IP 192.168.3.1
(1)内网访问外网
#iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 172.16.3.1
(2)外网访问内网
#iptables -t nat -A PREROUTING -d 172.16.3.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.20:8080