上一篇介绍了tcpwraps的使用,这篇讲讲功能更强大的iptables的使用。
ipfilter是内核的一个模块,要实现该模块的功能用的是iptables软件(2.6内核)。早期内核,2.2使用的是firewalladmin,2.4使用的是ipchains。
iptables涉及3张表,5个链。
表:filter,nat,mangle
链:INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING。
filter表用于过滤,涉及INPUT进入链,OUTPUT出去链,FORWARD转发链。
nat表用于网络地址转换。源地址转换snat,让内网可以访问外网主机,要使用POSTROUTING链。目的地址转换 dnat,让外网可以访问内网主机,要使用PREROUTING。还涉及OUTPUT链。
查看防火墙规则
执行命令#iptables -L -n,不指定哪张表的话,默认查看filter表,-n表示禁止反向解析。
执行命令#iptables -L -n --line-numbers,增加行号显示
可以用-t来指定表,比如#iptables -t nat -L -n
保存防火墙规则,执行命令#service iptables save
防火墙规则语法:
iptables A|I|D INPUT|OUTPUT|FORWARD (n) -p tcp|udp|icmp (!) -s 192.168.30.0/24 -d --sport 1000 --dport 100:200 -j ACCEPT|DROP|REJECT
A:添加
I:插入
D:删除
n:用于指定插入/删除第几条。如果不指定的话,默认插入到第一条
p:指定协议
s:source源地址
!:表示除了
d:目的地址,一般用在FORWARD的时候
sport:源端口
dport:目的端口
100:200:表示100到200
j:表示匹配后的动作,ACCEPT允许,DROP丢弃,REJECT拒绝,会返回一个包。
规则语法举例:
iptables -A INPUT -p tcp -s 192.168.30.251 --dport 22 -j REJECT //添加拒绝来自192.168.30.251的ssh连接
iptables -D INPUT 6 //删除filter表INPUT链里的第六条
iptables -I
INPUT 4 -p tcp -s 192.168.30.251 --dport 22 -j REJECT //插入第四条
iptables -I INPUT -p tcp -s 192.168.30.0/24 --dport 22 -j ACCEPT //允许来自192.168.30网段的ssh连接
iptables -I INPUT 2 -p tcp -s 192.169.30.251 --dport 22 -j REJECT //拒绝192.168.30.251的ssh连接,但是由于上一条允许整个段的ssh连接,所以这时251照样可以ssh连上的!
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT //不指定源地址,表示任意,即所有主机都可以ssh连接
iptables -I INPUT 1 -p tcp ! -s 192.168.30.0/24 --dport 22 -j REJECT //除了192.168.30网段,其他地址的ssh连接都拒绝
iptables -I INPUT 1 -p tcp -m mac --mac=00:0c:29:6F:66:D4 --dport 22 -j REJECT //
m:表示根据某种特性来匹配。即拒绝mac为00:0c:29:6F:66:D4的ssh连接。
iptables -I INPUT 1 -p tcp -m mac --mac=00:0c:29:6F:66:D4 --dport 22 -j LOG //表示记录日志。
iptables规则匹配逻辑
对同一个服务,在iptables中的规则是一条一条,从上往下匹配的。一旦匹配上后即不再往下匹配!如果所有的都没有匹配上,那么会执行默认策略。
iptables -L -n --line-numbers查看,policy ACCEPT,表示的是默认允许。INPUT链中,默认规则第5条,是拒绝所有连接。
即防火墙默认是信内网不信外网,默认规则只对INPUT有限制,对OUTPUT没有限制。
修改默认策略,可以执行#iptables -P INPUT DROP,默认策略是没有REJECT的,只能ACCEPT或者DROP。
设置,实现自己不能主动出去,但别人可以连接进来。
iptables -I OUTPUT 2 -p tcp -m state --state=ESTABLISHED --sport 22 -j ACCEPT //根据状态了判断,ESTABLISHED状态,是已经建立了第一次握手后的对方访问。
常见的几种连接状态:
NEW:TCP第一次握手,是NEW
ESTABLISHED:TCP第二次握手
RELATED:用于FTP等会随机生成端口的情况
INVALID:表示除了以上三种状态,都是INVALID。这种连接为不知道的连接,应该要拒绝掉。
命令行中敲的这些规则,只是临时生效,重启后就没了,要想永久生效,必须要保存到防火墙配置中,执行service iptables save
执行#iptables -F命令,可以临时清空所有规则。
如果是直接修改防火墙的配置文件,vi /etc/sysconfig/iptables,那么一定要重启防火墙,让其重新加载生效才行。
执行命令#iptables-save >fw,备份规则。
执行命令#iptables-restore < fw,恢复规则