快速入门 linux 的 iptables 防火墙的基本通信管理
概述
iptables是一种运行在linux下的防火墙组件,下面的介绍可以快速的学习iptables的入门使用。
iptables 的特点(重要)
- 它的工作逻辑分为 链、表、规则三层结构。
- 数据包通过的时候,在对应表中,规则从上向下匹配,匹配到即跳出,后续规则忽略。
- 常用于过滤数据包和转发数据包(代理服务器)。
- 工作方式基于 IP、端口和MAC
结构
iptables的工作流程大体上可以表达为三种
- 源地址发送数据–> {PREROUTING–>路由规则–>POSTROUTING} –>目的地址接收到数据
- 源地址发送数据–> {PREROUTING–>INPUT–>本机}
- {本机–>OUTPUT–>POSTROUTING} –>目的地址接收到数据
从上表当中我们可以看到,对于不考虑地址转发的情况下,例如一台独立的主机的网络管理,我们只需要配置 INPUT 和 OUTPUT 两条链即可完成对网络的管理,本次的重点也是这两条链接。
实例
先启一个定时任务 5分钟 清空一次规则 防止把自己关外面,进不去ssh crontab -e
*/5 * * * * /usr/sbin/iptables -F
然后随便加个不疼不痒的规则,等5分钟看看定时任务能起作用以后再动手
1. 管理规则
iptables [-t 表名] [选项] -n
选项:
-L 查看
-F 清除所有规则
-X 清除自定义链
-Z 清除所有链统计
-n的含义是用ip和端口的方式来显示规则
例:
查看filter表中的所有规则
iptables -t filter -L -n
清空filter表中的规则
iptables -t filter -F
2. 定义表的默认规则
首先要牢记iptables是有链 有表的结构 , 那么定义每一条链上的每一条表的默认规则的格式为
iptables -t 表 -P 链 动作类型
-t 就不说了 -P 这里要大写 链的名称也是大小写敏感的注意不要写错 动作类型有ACCEPT允许通过 DROP丢弃 也就是禁止 还有一种动作是LOG作为日志记录,目前我还没有用过。
禁止访问还有 REJECT,类似DROP,但这个是主动拒绝,DROP是直接丢弃,区别是另一端能否感知到。
例:
设置INPUT链上filter表默认规则
iptables -t filter -P INPUT ACCEPT
这里要注意的是,默认允许了所有的链接都可以通过,到达服务器。这样的设置在正式生产服务器环境上是十分危险的,不建议这么设置,应当设置为DROP,但是默认允许所有的链接都禁止的后果就是把自己的远程操作也踢掉了,服务器在本地还无所谓,但是在远程这就麻烦了。于是要牢记,默认规则要在设置好自己访问的规则以后再设置,最好是在最后设置。
3.自定义规则
下面我们来真正设置某一条链上的某个表中一个基于IP和端口的规则,也是iptables最常见的用途
格式:
iptables [-AI 链] [-io 网卡] [-p 协议] [-s 源IP] [-d 目标ip] -j 动作
例:
禁止ip为192.168.1.110的计算机访问本机eth0网卡
分析:
禁止XXX访问本机 所以是INPUT链 增加规则使用-A 网卡是eth0因为是INPUT链 所以参数应该是 -i 源ip是 192.168.1.110 动作是 DROP 于是应该这样写
iptables -A INPUT -i eth0 -s 192.168.1.110 -j DROP
反过来,禁止本机访问192.168.1.110可以这么写
iptables -A OUTPUT -o eth0 -d 192.168.1.110 -j DROP
例:
允许本机访问本地回环网卡 localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
现在我们可以添加一个针对固定IP的策略了,那么如何添加一个网段的策略的,例如禁止192.168.1.xxx 这个网段所有的IP访问本机,这里是要用下面的写法的
iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j DROP
这里的192.168.0/24是代表网段,具体含义可以去了解 计算机网络原理,24其实指的是二进制的从左到右 有24个1 ,在IPV4的ip地址表示方法下 有32位,那么32-24=8 也就是十进制IP最后一段位置代表是0
于是我们可以 1 针对IP 2 针对IP段 设置策略
下面来添加对端口的策略,这个往往也是最细节最有用的内容
格式:
iptables -A 链 -io 网卡 -p 协议 -s 源ip –sport 源端口 -d 目标ip –dport 目标端口 -j 动作
这里有几个点要注意
和IP一样 链的不同(可能是INPUT也可能是OUTPUT) 使用不同的-i或者-o -p是小写的。 代表协议,类型可以是tcp、udp、icmp或者all,特别是要注意的是我们平时使用的ping命令 其实是icmp协议,而这个协议比较特殊,不使用端口 所以在使用all的时候(包含icmp)同时设置端口可能会出错! INPUT要有源,OUTPUT要有目标,但是INPUT往往是限制目标端口,OUTPUT往往是限制源端口,注意逻辑不要乱。
例:
web服务器添加80服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
允许192.168.1.x网段访问mysql数据库
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT
最后说明一下,当有多条规则匹配一次访问的时候,以最前面的规则为准,当无法匹配到对应规则的时候,使用默认规则
在前面的例子中相信你已经发现了-A 往往是代表 ADD的意思,每次ADD都是增加规则到列表的最后,那么除了ADD 其实还有-I INSERT插入规则
具体用法是将I替换成A 同时在链名后添加数字排序
-I 链名 1
1 代表了第一位顺序 也就是最优先的匹配规则
例
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
例
删除某一条特定规则
先查看该规则的序号
iptables --line -vnL
然后根据最前面的序号
iptables -t 表名(非必须) -D 链名 序号
删掉对应的规则
上面的介绍都是具体的规则配置,这些配置在防火墙重启的时候会丢失,那么如何管理防火墙服务是下面的内容
开机自启动
chkconfig iptables on
规则保存
service iptables save
上面的命令其实是把规则保存在/etc/sysconfig/iptables文件中,重启会自动读取
如果是业务相对固定的服务器这样做无所谓,但如果需要经常切换规则,那么讲规则都写在这一个文件中并不是十分容易管理
可以把规则写成单独的文件,在开机的时候自动载入(/etc/rc.local中添加),但是要注意权限设置(755),这样做的好处是便于管理,缺点是只有开机的时候有效
如果是重启防火墙服务,则无法载入对应规则。
总结:iptables看似复杂,实际上找好逻辑对应关系还是不难的关键是5条链的几个表要理解含义,这里只简单的介绍了本机和外界通信的基本管理。
持久化防火墙规则 (开机自启动)
iptables-save > /etc/sysconfig/iptables
#修改/etc/rc.d/rc.local 添加
/usr/sbin/iptables-restore < /etc/sysconfig/iptables
#增加执行权限
chmod a+x /etc/rc.d/rc.local