centos6 iptables¢os7 firewall
centos 5.x,6.x的iptables
iptables就是Linux的防火墙,主要对iso中的3,4层进行控制出入和检测等功能。其中有5个规则链:
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
只要数据进入linux就必须经过必须经过其中一个,或者多个。其中一个链的内部,规则应该是越来越宽松的,越是严格的规则就应该越放在前面。
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
实例:
比如:不允许172.16.0.0/24的进行访问。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP 注意dorp动作是不会给访问者任何回答的,会照成访问者的等待超时时间现象。
当然你如果想拒绝的更彻底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT 注意reject会发送reject信号给访问者,访问者不会等待,受到reject信号马上就会关闭socket。
iptables -P INPUT (DROP|ACCEPT) 默认是关的/默认是开的。一般正常默认就是drop不用去更改,这样比较安全。
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT 含义:允许172.16.0.0/16到172.16.100.1 tcp协议的22端口
iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 允许172.16.0.0/16传输状态为NEW,ESTABLISHED的tcp端口为22的包。
管理命令:
iptables -A:追加,在当前链的最后新增一个规则
iptables -I num : 插入,把当前规则插入为第几条。
-I 3 :插入为第三条
iptables -R num:Replays替换/修改第几条规则
格式:iptables -R 3 …………
iptables -D num:删除,明确指定删除第几条规则
附加子命令:
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
通用匹配:源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
扩展匹配
2.1隐含扩展:对协议的扩展
-p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21 或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn = --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
-p udp:UDP协议的扩展
--dport
--sport
-p icmp:icmp数据报文的扩展
--icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
-v:显示详细信息
-vv
-vvv :越多越详细
-x:在计数器上显示精确值,不做单位换算
--line-numbers : 显示规则的行号
-t nat:显示所有的关卡的信息
扩展:
-m state
--state {NEW,ESTATBLISHED,INVALID,RELATED} 指定检测那种状态
-m multiport 指定多端口号
--sport
--dport
--ports
-m iprange 指定IP段
--src-range ip-ip
--dst-range ip-ip
-m connlimit 连接限定
--comlimit-above # 限定大连接个数
-m limit 现在连接速率,也就是限定匹配数据包的个数
--limit 指定速率
--limit-burst # 峰值速率,最大限定
-m string 按字符串限定
--algo bm|kmp 指定算法bm或kmp
--string "STRING" 指定字符串本身
实例:
iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT 一分钟6个,同时并发5个
iptables -P INPUT DROP
常用的ACTION:
DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。
状态检测
什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。
所以我们的状态一共有四种:
NEW
ESTABLISHED
RELATED
INVALID
SNAT,DNAT
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
SNAT 源地址转换:
数据包要通过iptable出去的时候用,可作为网关。
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE 把172.16.1.0过来的地址都动态变成一个公网ip转发出去,
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 183.131.4.180 把172.16.1.0过来的地址都固定转发成183.131.4.180出去。
DNAT目的地址转换:
数据包要通过iptables进来的时候用,一般用于内网有要提供服务的机器
iptables -t nat -A PREROUTING -d 172.16.2.214/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 101.71.39.58:80 把目的地址为172.16.2.214的端口80的包的目的地址都转换成101.71.39.58端口80 注意,DNAT都是路由前转换的,SNAT都是路由后转换的,这点是ip路由特性cpu处理IP包的流程所决定的。
系统命令
service iptables save 保存刚刚写的配置。(配置以文件的形式存在于/etc/sysconfig/iptables中)
service iptables stop
service iptables start
centos7 firewall
centos7除移了iptables,使用了新的防火墙模块叫做firewall,新的firewall从结构上来说,更趋近于类似cisco asa,juniper netscreen 这种硬件防火墙,有了zone的概念,理论上来说对包的控制更强也更安全了。但是带来的负面效果就是学习成本变高,排错成本变高。
上图为iptables和firewall的关系,在service层面是平级的,然后firewall最终还是调用的iptables的command。去执行内核的netfilter。光从使用层面来说是挺不方便的。作者的想法可能是现在硬件防火墙在互联网公司用的越来越少,为了加强安全概念吧。
查看命令:
firewall-cmd --get-zones 查看现有的zone
firewall-cmd --get-services 查看所支持的服务
firewall-cmd --zone=<zonename> --list-all 查看特定zone的配置
firewall-cmd --get-default-zone 查看默认区域的网络设置,一般来说就是public
firewall-cmd --set-default-zone=<zonename> 修改默认zone
firewall-cmd --get-active-zones 查看active的zone
修改接口和zone命令:
firewall-cmd --get-zone-of-interface=<interface name> 查看接口所在的zone
firewall-cmd [--zone=<zone>] --add-interface=<interface> 把接口添加到指定zone
firewall-cmd [--zone=<zone>] --remove-interface=<interface> 把接口从指定zone删除
firewall-cmd [--zone=<zone>] --query-interface=<interface> 查看指定zone是否包含指定接口
firewall-cmd [ --zone=<zone> ] --list-services 查看指定zone的service
修改规则命令:
firewall-cmd --panic-on 终止所有网络链接,慎用!
firewall-cmd --panic-off 恢复网络链接
firewall-cmd --query-panic && echo "On" || echo "Off" 查询应急模式的状态
firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>] 启用特定zone的某个服务,加上timeout可以表示这个服务启用多长时间。
firewall-cmd [--zone=<zone>] --remove-service=<service> 除移某个服务
firewall-cmd [--zone=<zone>] --query-service=<service> 查看某个zone中特定的服务
firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> 自定义启用某个协议和端口
firewall-cmd --zone=public --add-port=23/tcp
firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol> 除移端口
ip伪装
firewall-cmd [--zone=<zone>] --add-masquerade 开启某个区域的ip伪装,都伪装成这个zone的ip地址,就是nat模式
firewall-cmd [--zone=<zone>] --remove-masquerade 关闭ip伪装
icmp阻塞
firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype> 开启指定zone的icmp阻塞,icmptype有2种,echo(发起),echo-reply(回应)
firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype> 除移
nat
firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> {:toport=<port>[-<port>] |:toaddr=<address> |:toport=<port>[-<port>]:toaddr=<address> } 添加nat
firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100 把external区域的22端口映射到192.168.1.100的2055端口。
firewall-cmd [--zone=<zone>] --remoeve-forward-port=port=<port>[-<port>]:proto=<protocol> {:toport=<port>[-<port>] |:toaddr=<address> |:toport=<port>[-<port>]:toaddr=<address> }除移nat
命令选项
--permanent ,–direct 永久和直接,永久是不影响现在的运行配置的,在重启服务后启动,而直接是影响现在运行的配置的,在重启服务后实效。配置起来很简单,在以上所有firewall-cmd 后面跟上就可以了。
添加rule
只有在 --direct模式下才可以这样直接添加rule,rule的格式就是和iptables的命令一样的。找对chain就可以了
firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 666 -j ACCEPT 为in_public_allow 这个chain添加一个0号规则 放行tcp 666端口
firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 666 -j ACCEPT 除移动
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 192.168.0.0/24 添加nat规则,源为192.168.0.0/24的都nat成eth0这个ip地址,有篇国外的文章有详细的gateway配置,FQ打开。
http://blog.redbranch.net/2015/07/30/centos-7-as-nat-gateway-for-private-network/
复杂的rule
firewall-cmd [--zone=zone] --add-rich-rule='rule' 这个rich-rule我自己也没怎么研究过。总之和之前所说的rule应该是一样的概念,centos官方文档比例巴拉写了一大堆说可以添加timeout时间参数,也是够了,感觉实际用到的应该很少。
写了那么多,其实也没有想象中的复杂,对于暴露在公网的服务器就只开放提供服务的端口,内网没有暴露的Firewall就不用那么严格,基本上不用特意去改动。