Linux基础之防火墙前端
最初认识iptables仍是在安卓手机上玩tiny的时候知道的,什么扫地僧、Jume等防跳脚本都基于iptables原理,一直以为iptables的命令很长、难懂,等真正认识了以后发现也不过如此。web
iptables是CentOS上的防火墙软件(之因此叫软件是由于它是调用系统内核中的netfilter),虽然在CentOS 7 上使用Firewall来代替直接使用iptables,可是iptables仍然具备很普遍的应用。centos
在说iptables以前,先想一下防火墙的做用。防火墙是用来干什么的呢?主要对数据进行拦截过滤转发等等,既然是拦截,那么就得规定怎么拦截、拦截什么样的数据,这种规定咱们通常称之为策略。
在咱们拦截到数据包以后要作什么样的动做呢?好比放行、扔掉或者转发等。这些行为咱们称之为动做(target)。
除了定义怎么拦截,咱们还须要定义在哪能够拦截,网络上的数据时经过网卡过来的,首先通过内核,而后才会到达用户空间,若是是一个http请求的话,用户空间的web服务器接收到请求以后开始给客户端响应,就把数据往外发送,这中间就能够设立几个拦截点,这种拦截点咱们称之为链(chain),为何叫作链呢?由于在一个节点上能够由有数个规则,这些规则按照顺序从上往下依次匹配,就像一个链子同样,所以称之为链。
咱们说防火墙除了能够拦截以外,还有转发、修改数据的做用,那咱们就能够把这些类似的规则放到一块,这个用来存放一类规则的东西叫作表(table)。服务器
那么在Linux中总共有多少条链、多少张表?网络
答案是5条链,4张表:app
5条链:ssh
4张表:tcp
以及几种经常使用的动做:centos7
ACCEPT
:容许数据包经过。DROP
:直接丢弃数据包,不给任何回应信息,这时候客户端会感受本身的请求泥牛入海了,过了超时时间才会有反应。REJECT
:拒绝数据包经过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。SNAT
:源地址转换,解决内网用户用同一个公网地址上网的问题。MASQUERADE
:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。DNAT
:目标地址转换。REDIRECT
:在本机作端口映射。LOG
:在/var/log/messages文件中记录日志信息,而后将数据包传递给下一条规则,也就是说除了记录之外不对数据包作任何其余操做,仍然让下一条规则去匹配。有了上面的概念,下面的图就容易理解了:.net
不一样的表能够做用与同一条链,标的顺序按raw -> mangle -> nat -> filter
依次做用。
不一样的表能够做用到不一样的链,做用范围分别是:
大多数状况下咱们都是操做filer表来进行端口的放行和拦截,Linux中默认也是操做filter表。对于同一条链以及同一张表的的多个规则,严格按照从上到下的顺序进行做用。好比A规则在上,对某种数据包进行拦截,B规则在下,对同种数据包进行放行,那么这种数据包只会被拦截而不会被放行,即在上的A规则起做用。
有了上面的知识对于下边的命令就好理解了
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动做
其中:
-t 表名
能够省略,默认操做filter表。-A/I/D/R 规则链名 [规则号]
为操做的链:
-i/o 网卡名
能够指定网络接口
-i 网络接口
:指定数据包进入本机的网络接口-o 网络接口
:指定数据包要离开本机所使用的网络接口-p 协议名
能够指定协议,好比TCP、UDP、SCTP等-s 源IP/源子网 --sport 源端口
这里指的是其余机器的IP和端口-d 目标IP/目标子网 --dport
这里指的是本机的IP和端口-j 动做
匹配到数据包以后要作什么 其中-
开头为简洁指令,--
为全指令,他们是等价的,部分指令没有简洁模式(好比--dport
)。
下面这些其实用iptables -h
就全都出来了……
链管理:
简洁模式和完整命令(chain表明链,target表明策略):
-P
, --policy chain target
:为指定的链设置默认策略。(注意,只有内置的链才容许有策略,用户自定义的是不容许的)。-F
, --flush [chain]
清空指定链上面的全部规则。若是没有指定链,清空该表上全部链的全部规则。-N
, --new-chain chain_name
用指定的名字建立一个新的链。(new后面的 -chain 能够省略)-X
, --delete-chain [chain]
:删除指定的链,这个链必须没有被其它任何规则引用,并且这条上必须没有任何规则。若是没有指定链名,则会删除该表中全部非内置的链。-E
, --rename-chain old_chain new_chain
:用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响。-Z
, --zero [chain]
:把指定链,或者表中的全部链上的全部计数器清零。规则管理
-A
, --append chain rule-specification
在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。-I
, --insert chain [rulenum] rule-specification
在链 chain 中的指定位置插入一条或多条规则。默认为1,也就是在头部插入。(rulenum为行号,能够加入--line
来显示行号)-D
, --delete chain rule-specification
-D
, --delete chain rulenum
在指定的链 chain 中删除一个或多个指定规则。-R
--replace chain rulenum
:替换/修改第几条规则数据匹配
-p
:指定要匹配的数据包协议类型(通常为TCP、UDP)-s
:--source [!] address[/mask]
:把指定的一个/一组地址做为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,好比:192.168.1.1;当 mask 指定时,能够表示一组范围内的地址,好比:192.168.1.0/255.255.255.0。-d
:--destination [!] address[/mask]
:地址格式同上,但这里是指定地址为目的地址,按此进行过滤。-i
:--in-interface [!] <网络接口>
:指定数据包的来自来自网络接口,好比最多见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起做用。若是没有指定此选项, 说明能够来自任何一个网络接口。同前面相似,"!" 表示取反。-o
:--out-interface [!] <网络接口>
:指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起做用。其余
-t
:--table table
选择要操做的表,能够省略,默认filter-L
:--list [chain [rulenum]]
查看规则
-v
:详细模式-n
:取消解析,直接显示IP-x
:精确数值--line
:--line-numbers
显示行号 咱们修改的命令都是为保存的,下次开机就没有了,那么如何保存呢?
在CentOS 6 中能够直接service iptables save
来保存。
可是在CentOS 7 中移除了大部分Service iptables命令,可是并无彻底去除iptables,而是和firewalld共存。
咱们可使用下面的命令来吧firewalld更改成iptables:
# 检查firewalld是否运行, firewall-cmd --state #中止firewalld systemctl stop firewalld #禁止firewalld自动启动 systemctl disable firewalld #安装iptables-service yum install -y iptables-services #启动iptables systemctl start iptables #将iptables设置为开机自动启动,之后便可经过iptables-service控制iptables服务 systemctl enable iptables
而后就可使用service iptables save
来保存规则了。
命令保存以后须要重启服务来使之生效
这里放几条经常使用的命令:
#容许全部本机向外的访问 iptables -A OUTPUT -j ACCEPT #容许访问22端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #容许访问80端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #容许ftp服务的21端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT #容许FTP服务的20端口 iptables -A INPUT -p tcp --dport 20 -j ACCEPT # 保存 service iptables save # 备份 iptables-save > filename # 恢复 iptables-restore < filename
既然提到了CentOS 7 那就不得不说它的新防火墙FirewallD。
为何红帽子要替换掉Iptables呢?也不能说是替换吧,firewalld是iptables的前端控制器,只能说为何推荐使用FirewallD。FirewallD最明显的一个好处就是比Iptables简单,Iptables的4张表5条链是有点麻烦的,而且FirewallD有一些新的特色,好比规则动态生效、加入区域(区域其实就是一些配置好的规则集。)等。
若是使用FirewallD的话推荐只使用FirewallD命令。
须要注意的是FirewallD默认为拒绝,iptables默认为接收,而且启动过FirewallD以后,会在iptables表中留下规则,可使用iptables -F
来清楚规则。
下面列出一些经常使用命令:
# firewalld开/关/(守护进程)状态/重启 systemctl start|stop|status|restart firewalld # 开机自启/禁止自启 systemctl enable|disable firewalld
FirewallD使用firewall-cmd
的方式来进行操做:
# 帮助 firewall-cmd --help # 版本 firewall-cmd --version # 状态 firewall-cmd --state # 从新加载配置 firewall-cmd --reload =========================================== #添加端口/协议(tcp/udp)端口能够填2000-3000来做为一个范围 firewall-cmd --add-port=<port>/<protocol> #移除端口/协议(tcp/udp)这里tcp和udp是小写 firewall-cmd --remove-port=<port>/<protocol> #查看开放的端口 firewall-cmd --list-ports =========================================== # 容许协议 (例:icmp,即容许ping) firewall-cmd --add-protocol=<protocol> # 取消协议 firewall-cmd --remove-protocol=<protocol> # 查看容许的协议 firewall-cmd --list-protocols =========================================== # 拒绝全部流量,远程链接会当即断开,只有本地能登录 firewall-cmd --panic-on # 取消应急模式,但须要重启firewalld后才能够远程ssh firewall-cmd --panic-off # 查看是否为应急模式 firewall-cmd --query-panic =========================================== # 查看当前区域 firewall-cmd --get-default-zone # 查看全部区域 firewall-cmd --get-zones # 设置默认区域为public(这也是默认的区域) firewall-cmd --set-default-zone=public =========================================== # 列出全部服务(服务即为定义好的端口和协议) firewall-cmd --get-services # 列出当前zone下加载的service firewall-cmd --list-services # 给指定zone添加service firewall-cmd --zone=public --add-service=http # 指定区域移除服务 firewall-cmd --zone=public --remove-service=http
以上命令均为临时操做,重启服务器以后规则消失。能够添加--permanent
参数来将规则添加到配置文件,而后从新加载配置便可生效。
参考:Iptables详解