防火墙,简单的说,就是针对源IP或域进行允许或拒绝的设置,以决定该连接是否能够成功实现连接的一种方式。
这里我把Linux防火墙管理分成两类
- 通过管理/etc/hosts.allow, /etc/hosts.deny来实现,在另外一篇博文关于Linux计划任务at和crontab的时候,也设计到了类似的管理
- 通过管理iptables来实现
/etc/hosts.allow, /etc/hosts.deny管理
基本上只要一个服务受到xinetd管理(通常情况可以查看/etc/xinetd.d/的内容来判断),或者是该服务的程序支持TCP wrapper函数的功能时,那么该服务的防火墙的设置就可以通过以/etc/hosts.{allow,deny}来处理
#通过该命令就可以查看该服务的程序是否支持TCP wrapper函数的功能
[root@rhel6164 ~]# ldd $(which sshd)|grep wrap libwrap.so.0 => /lib64/libwrap.so.0 (0x00007feb26191000)
配置文件语法:两个文件设置语法都一样,基本上,看起了应该像下面这个样子,其中'<' '>'是不存在于配置文件中的
<service (program_name)> : <IP,domain, hostname> : <action>
#注意,第一个字段里面的是启动服务的程序,而不是服务本身,例如ssh服务的启动程序应该为sshd
例子:阻止下面两个IP使用rsync程序
[root@rhel6164 ~]# vim /etc/hosts.deny
rsync:127.0.0.100 127.0.0.200:deny
注意事项:
- 在两个文件中默认的action都是可以省略的,/etc/hosts.allow默认的action为allow,/etc/hosts.deny默认action为deny
- 两个文件的判断依据是,以/etc/hosts.allow为优先,若分析到IP或网段不在/etc/hosts.allow,则以/etc/hosts.deny来判断
一些在第一、第二字段里面的特殊字符
- ALL:代表全部的program_name或者IP都接受的意思,例如ALL:ALL:deny
- LOCAL:代表来自本机的意思,例如ALL:LOCAL:allow
- UNKNOWN:代表不知道的IP或者是domain或者是服务时
- KNOWN:代表为可以解析的IP, domain等信息时
还可以使用TCP Wrapper功能来进行更多的设置,但是前提必须要安装好了tcp_wrapper包,这里就暂时不扩展开
[root@rhel6164 ~]# rpm -qa | grep tcp_wrapper
tcp_wrappers-7.6-56.3.el6.x86_64
tcp_wrappers-libs-7.6-56.3.el6.x86_64
tcp_wrappers-libs-7.6-56.3.el6.i686
iptables
和上面讲解的/etc/hosts.*一样,iptables也是Linux自带的软件防火墙,iptables是利用封装包过滤的机制,所以他会分析封装包的表头数据,根据表头数据与定义的规则来决定该封包是否可以进入主机或者被丢弃,意思就是,根据封包的分析资料“对比”你预先定义的规则内容,若封包数据与规则内容相同则进行动作,否则就继续下一条规则的比对,重点是对比是有顺序的
iptables有三个重要的表
1. filter:主要跟Linux本机有关,这个是预设的table
- INPUT:主要与封包想要进入我们Linux本机有关
- OUTPUT:主要与我们Linux本机所要送出的封包有关
- FORWARD:这个与Linux本机比较没有关系,他可以封包‘转递’到后端的计算机中,与nat这个table相关性很高
2. nat:这个表格主要在用作来源与目的之IP或port的转换,与Linux本机无关,主要与Linux主机后的局域网内的计算机有关
- PREROUTING:在进行路由判断之前要进行的规则(DNAT/REDIRECT)
- POSTROUTING:在进行路由判断之后要进行的规则(SNAT/MASQUERADE)
- OUTPUT:与发送出去的封包有关
命名格式:更多详细的信息可以参考man iptables页面
- iptables [-t tables] [-L] [-nv]
- iptables [-t tables] [-FXZ]
- iptables [-t nat] -P [INPUT, OUTPUT, FORWARD] [ACCEPT, DROP]:定义预设策略(policy)
- iptables [-AI 链] [-io 网络接口] [-p 协议] [-s 来源IP/网域] [-d 目标IP/网域] -j [ACCEPT|DROP]:封包的基础对比IP/netmask I/O 装置
- iptables [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源IP/网域] [--sport 端口范围] [-d 目标IP/网域] [--dport 端口范围] -j [ACCEPT|DROP]
- iptables -A INPUT -m state --state 状态
- iptables -A INPUT -p icmp --icmp-type 类型 -j ACCEPT
参数说明:
- -t:后面接table,例如nat或filer,若省略,默认是filter
- -L:列出目前的table规则
- -n:不进行IP与HOSTNAME的反查,显示信息的速度会很快
- -v:列出更多信息
- -F:清除所有的已制定的规则
- -X:杀掉所有使用者“自订”的chain/tables
- -Z:将所有的chain的计数与流量统计都归零
- -P:定义策略(Policy),ACCEPT,封包可接受;DROP,封包直接丢弃,不会让client端知道为何丢弃
- -AI 链:针对某链进行规制的“插入”或"累加“,-A,新增加一条规制,该规则增加在原本规则的最后面,-I:插入一条规制,如果没有指定此规则的顺序,预设是插入变成第一条规则,链,有INPUT, OUTPUT, FORWARD等
- -io 网络接口:设定封包进出的接口规范
- --sport:端口范围,限制来源的端口号号码,端口号码可以是连连续的,例如1024:65535
- --dport:端口范围,限制目标端口号码
- -m:一些iptables的模块,主要有state(状态模块)和mac(网络卡硬件模块hardware address)
- --state:一些封包的状态,INVALID,无效的封包,例如数据破损的封包状态;ESTABLISHED,已经联机成功的联机状态;NEW,想要新建立联机的封包状态;RELATED,表示封包是与我们主机发送出去的封包有关
- --icmp-type:后面必须要接ICMP的封包类型,也可以使用代号,例如8代表echo request的意思
例子:
1. 列出filter table三条链的规则
[root@rhel6164 ~]# iptables -L -n #观察防火墙的规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2. 列出nat table三条链的规则
[root@rhel6164 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
3. 将本机的INPUT设定为DROP,其他设定为ACCEPT
[root@rhel6164 ~]# iptables -P INPUT DROP
[root@rhel6164 ~]# iptables -P OUTPUT ACCEPT
[root@rhel6164 ~]# iptables -P FORWARD ACCEPT
[root@rhel6164 ~]# iptables -L -n #可以与例1比较
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
4. 将要进入本机port 21的封包全都挡住
[root@rhel6164 ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
[root@rhel6164 ~]# iptables -A INPUT -i eth0 -p udp --dport 127:128 -j ACCEPT #放行udp 127 128端口
5. 只要已建立或相关封包就予以通过,只要不合法封包就丢弃
[root@rhel6164 ~]# iptables -A INPUT -m state --state RELATED,ESABLISHED -j ACCEPT
[root@rhel6164 ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
#上面例子是针对局域网内的aa:bb:cc:dd:ee:ff主机开放其联机
6. 将防火墙规则保存下来和恢复防火墙规则
[root@rhel6164 ~]# iptables-save > filename
[root@rhel6164 ~]# iptables-restore < filename