linux防火墙-iptables
Iptables是linux上特有的防火墙机制,其功能非常强大,然而笔者在日常的管理工作中仅仅用到了一两个应用,这并不代表iptables不重要。作为一个网络管理员,iptables是必要要熟练掌握的。但是作为系统管理员,我们也应该会最基本的iptables操作,认识iptables的基本规则。
1)iptalbes的三个表
filter :这个表主要用于过滤包的,是系统预设的表,这个表也是笔者用的最多的。内建三个链INPUT、OUTPUT以及FORWARD。INPUT作用于进入本机的包;OUTPUT作用于本机送出的包;FORWARD作用于那些跟本机无关的包。
nat :主要用处是网络地址转换,也有三个链。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。该表笔者用的不多,但有时候会用到。
mangle :这个表主要是用于给数据包打标记,然后根据标记去操作哪些包。这个表几乎不怎么用。除非你想成为一个高级网络工程师,否则你就没有必要花费很多心思在它上面。
2)iptables 基本语法
A. 查看规则以及清除规则
如上图,-t 后面跟表名,-nvL 即查看该表的规则,其中-n表示不针对IP反解析主机名;-L表示列出的意思;而-v表示列出的信息更加详细。如果不加-t ,则打印filter表的相关信息。
这个和-t filter 打印的信息是一样的。
关于清除规则的命令中,笔者用的最多就是
不加-t默认是针对表filter来操作的,-F 表示把所有规则全部删除;-Z表示把包以及流量计数器置零(这个笔者认为很有用)。
B. 增加/删除一条规则
这就是增加了一条规则,省略-t所以针对的是filter表。-A 表示增加一条规则,另外还有-I 表示插入一条规则,-D删除一条规则;后面的INPUT即链名称,还可以是OUTPUT或者FORWORD;-s 后跟源地址;-p 协议(tcp, udp, icmp); --sport/--dport 后跟源端口/目标端口;-d 后跟目的IP(主要针对内网或者外网);-j 后跟动作(DROP即把包丢掉,REJECT即包拒绝;ACCEPT即允许包)。这样讲可能很乱,那笔者多举几个例子来帮你理解:
上例表示:插入一条规则,把来自10.0.2.36的所有数据包丢掉。
删除刚刚插入的规则。注意要删除一条规则时,必须和插入的规则一致,也就是说,两条iptables命令,除了-I 和-D不一样外,其他地方都一样。
上例表示把来自10.0.2.36 并且是tcp协议到本机的80端口的数据包丢掉。这里要说的是,--dport/--sport 必须要和-p选项一起使用,否则会出错。
把发送到10.0.2.34的22端口的数据包丢掉。下面做一个小试验:
一开始用本机ping 10.0.2.34是通的,然后使用iptables增加一条规则,使到10.0.2.34的icmp包丢掉,再ping 10.0.2.34则不通了。此时用’iptables –nvL’查看iptalbes规则。
会有一条这样的记录,看pkts那列显示4个数据包,因为我们ping 的时候给10.0.2.34发送了4个数据包,第二列表示这4个数据包一共有多大(336bytes)。此时使用’iptables -Z' 清零。
现在你明白’iptables -Z’的意义了吧。至于FORWORD链的应用笔者几乎没有用到过,所以不再举例。再总结一下各个选项的作用:
-A/-D :增加删除一条规则;
-I :插入一条规则,其实跟-A的效果一样;
-p :指定协议,可以是tcp,udp或者icmp;
--dport :跟-p一起使用,指定目标端口;
--sport :跟-p一起使用,指定源端口;
-s :指定源IP(可以是一个ip段);
-d :指定目的IP(可以是一个ip段);
-j :后跟动作,其中ACCEPT表示允许包,DROP表示丢掉包,REJECT表示拒绝包;
-i :指定网卡(不常用,但有时候能用到);
上例中表示,把来自10.0.2.0/24这个网段的并且作用在eth0上的包放行。有时候你的服务器上iptables过多了,想删除某一条规则时,又不容易掌握当时创建时的规则。其实有一种比较简单的方法:
查看结果如下:
删除某一个规则的方法是:
-D 后跟链名,然后是规则num,这个num就是查看iptables规则时第一列的值。
iptables还有一个选项经常用到,-P(大写)选项,表示预设策略。用法如下:
-P后面跟链名,策略内容或者为DROP或者为ACCEPT,默认是ACCEPT。注意:如果你在连接远程服务器,千万不要随便敲这个命令,因为一旦你敲完回车你就会断掉。
看到上图中红框标出的部分了吧,现在所有进来的数据包全部DROP了。这个策略一旦设定后,只能使用iptables -P ACCEPT才能恢复成原始状态,而不能使用-F参数。下面笔者针对一个小需求讲述一下这个iptables规则如何设定。
需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对10.0.2.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。
这个需求不算复杂,但是因为有多条规则,所以最好写成脚本的形式。
完成脚本的编写后,直接运行 ‘sh /usr/local/sbin/iptables.sh ’ 即可。如果想开机启动时初始化防火墙规则,则需要在/etc/rc.d/rc.local 中添加一行 ‘sh /usr/local/sbin/iptables.sh’ 。
关于icmp的包有一个比较常见的应用。
--icmp-type 这个选项是要跟-p icmp 一起使用的,后面指定类型编号。这个8指的是能在本机ping通其他机器,而其他机器不能ping通本机。这个有必要记一下。
C. nat表的应用
其实,linux的iptables功能是十分强大的,笔者曾经的一个老师这样形容linux的网络功能:只有想不到没有做不到!也就是说只要你能够想到的关于网络的应用,linux都能帮你实现。在日常生活中相信你接触过路由器吧,它的功能就是分享上网。本来一根网线过来(其实只有一个公网IP),通过路由器后,路由器分配了一个网段(私网IP),这样连接路由器的多台pc都能连接intnet而远端的设备认为你的IP就是那个连接路由器的公网IP。这个路由器的功能其实就是由linux的iptables实现的,而iptables又是通过nat表作用而实现的这个功能。
至于具体的原理以及过程,笔者不想阐述,请查看相关资料。笔者在这里只举一个例子来说明iptables如何实现的这个功能。假设你的机器上有两块网卡eth0和eth1,其中eth0的IP为10.0.2.68 ,eth1的IP为192.168.1.1 。eth0连接了intnet 但eth1没有连接,现在有另一台机器(192.168.1.2)和eth1是互通的,那么如何设置也能够让连接eth1的这台机器能够连接intnet(即能和10.0.2.68互通)?
其实就是这样简单的两个命令就能实现上面的需求。第一个命令涉及到了内核参数相关的配置文件,它的目的是为了打开路由转发功能,否则无法实现我们的应用。第二个命令则是iptables对nat表做了一个IP转发的操作,-o 选项后跟设备名,表示出口的网卡,MASQUERADE表示伪装的意思。
关于nat表,笔者不想讲太多内容,你只要学会这个路由转发即可。其他的东西交给网络工程师去学习吧,毕竟你将来可是要做linux系统工程师的。
D. 保存以及备份iptalbes规则
也许你不知道,咱们设定的防火墙规则只是保存在内存中,并没有保存到某一个文件中,也就说当系统重启后以前设定的规则就没有了,所以设定好规则后要先保存一下。
它会提示你把规则保存在了/etc/sysconfig/iptables文件内。其实,这个文件就是iptables的配置文件了,你不妨查看一下它。
红线部分就是咱们刚才设定那条规则!有时可能因为我们设置防火墙规则有误导致服务器出问题,这时候不妨先备份一下这个配置文件,然后停止防火墙服务。
这样防火墙就失效了,但是一旦你重新设定规则后(哪怕只有一条),防火墙又开始工作了。
我还可以使用iptables-save >filename 这条命令来保存一个防火墙规则,这样就可以起到备份的作用了。要想恢复这个规则使用下面这个命令即可。
1)iptalbes的三个表
filter :这个表主要用于过滤包的,是系统预设的表,这个表也是笔者用的最多的。内建三个链INPUT、OUTPUT以及FORWARD。INPUT作用于进入本机的包;OUTPUT作用于本机送出的包;FORWARD作用于那些跟本机无关的包。
nat :主要用处是网络地址转换,也有三个链。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。该表笔者用的不多,但有时候会用到。
mangle :这个表主要是用于给数据包打标记,然后根据标记去操作哪些包。这个表几乎不怎么用。除非你想成为一个高级网络工程师,否则你就没有必要花费很多心思在它上面。
2)iptables 基本语法
A. 查看规则以及清除规则
如上图,-t 后面跟表名,-nvL 即查看该表的规则,其中-n表示不针对IP反解析主机名;-L表示列出的意思;而-v表示列出的信息更加详细。如果不加-t ,则打印filter表的相关信息。
这个和-t filter 打印的信息是一样的。
关于清除规则的命令中,笔者用的最多就是
不加-t默认是针对表filter来操作的,-F 表示把所有规则全部删除;-Z表示把包以及流量计数器置零(这个笔者认为很有用)。
B. 增加/删除一条规则
这就是增加了一条规则,省略-t所以针对的是filter表。-A 表示增加一条规则,另外还有-I 表示插入一条规则,-D删除一条规则;后面的INPUT即链名称,还可以是OUTPUT或者FORWORD;-s 后跟源地址;-p 协议(tcp, udp, icmp); --sport/--dport 后跟源端口/目标端口;-d 后跟目的IP(主要针对内网或者外网);-j 后跟动作(DROP即把包丢掉,REJECT即包拒绝;ACCEPT即允许包)。这样讲可能很乱,那笔者多举几个例子来帮你理解:
上例表示:插入一条规则,把来自10.0.2.36的所有数据包丢掉。
删除刚刚插入的规则。注意要删除一条规则时,必须和插入的规则一致,也就是说,两条iptables命令,除了-I 和-D不一样外,其他地方都一样。
上例表示把来自10.0.2.36 并且是tcp协议到本机的80端口的数据包丢掉。这里要说的是,--dport/--sport 必须要和-p选项一起使用,否则会出错。
把发送到10.0.2.34的22端口的数据包丢掉。下面做一个小试验:
一开始用本机ping 10.0.2.34是通的,然后使用iptables增加一条规则,使到10.0.2.34的icmp包丢掉,再ping 10.0.2.34则不通了。此时用’iptables –nvL’查看iptalbes规则。
会有一条这样的记录,看pkts那列显示4个数据包,因为我们ping 的时候给10.0.2.34发送了4个数据包,第二列表示这4个数据包一共有多大(336bytes)。此时使用’iptables -Z' 清零。
现在你明白’iptables -Z’的意义了吧。至于FORWORD链的应用笔者几乎没有用到过,所以不再举例。再总结一下各个选项的作用:
-A/-D :增加删除一条规则;
-I :插入一条规则,其实跟-A的效果一样;
-p :指定协议,可以是tcp,udp或者icmp;
--dport :跟-p一起使用,指定目标端口;
--sport :跟-p一起使用,指定源端口;
-s :指定源IP(可以是一个ip段);
-d :指定目的IP(可以是一个ip段);
-j :后跟动作,其中ACCEPT表示允许包,DROP表示丢掉包,REJECT表示拒绝包;
-i :指定网卡(不常用,但有时候能用到);
上例中表示,把来自10.0.2.0/24这个网段的并且作用在eth0上的包放行。有时候你的服务器上iptables过多了,想删除某一条规则时,又不容易掌握当时创建时的规则。其实有一种比较简单的方法:
查看结果如下:
删除某一个规则的方法是:
-D 后跟链名,然后是规则num,这个num就是查看iptables规则时第一列的值。
iptables还有一个选项经常用到,-P(大写)选项,表示预设策略。用法如下:
-P后面跟链名,策略内容或者为DROP或者为ACCEPT,默认是ACCEPT。注意:如果你在连接远程服务器,千万不要随便敲这个命令,因为一旦你敲完回车你就会断掉。
看到上图中红框标出的部分了吧,现在所有进来的数据包全部DROP了。这个策略一旦设定后,只能使用iptables -P ACCEPT才能恢复成原始状态,而不能使用-F参数。下面笔者针对一个小需求讲述一下这个iptables规则如何设定。
需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对10.0.2.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。
这个需求不算复杂,但是因为有多条规则,所以最好写成脚本的形式。
完成脚本的编写后,直接运行 ‘sh /usr/local/sbin/iptables.sh ’ 即可。如果想开机启动时初始化防火墙规则,则需要在/etc/rc.d/rc.local 中添加一行 ‘sh /usr/local/sbin/iptables.sh’ 。
关于icmp的包有一个比较常见的应用。
--icmp-type 这个选项是要跟-p icmp 一起使用的,后面指定类型编号。这个8指的是能在本机ping通其他机器,而其他机器不能ping通本机。这个有必要记一下。
C. nat表的应用
其实,linux的iptables功能是十分强大的,笔者曾经的一个老师这样形容linux的网络功能:只有想不到没有做不到!也就是说只要你能够想到的关于网络的应用,linux都能帮你实现。在日常生活中相信你接触过路由器吧,它的功能就是分享上网。本来一根网线过来(其实只有一个公网IP),通过路由器后,路由器分配了一个网段(私网IP),这样连接路由器的多台pc都能连接intnet而远端的设备认为你的IP就是那个连接路由器的公网IP。这个路由器的功能其实就是由linux的iptables实现的,而iptables又是通过nat表作用而实现的这个功能。
至于具体的原理以及过程,笔者不想阐述,请查看相关资料。笔者在这里只举一个例子来说明iptables如何实现的这个功能。假设你的机器上有两块网卡eth0和eth1,其中eth0的IP为10.0.2.68 ,eth1的IP为192.168.1.1 。eth0连接了intnet 但eth1没有连接,现在有另一台机器(192.168.1.2)和eth1是互通的,那么如何设置也能够让连接eth1的这台机器能够连接intnet(即能和10.0.2.68互通)?
其实就是这样简单的两个命令就能实现上面的需求。第一个命令涉及到了内核参数相关的配置文件,它的目的是为了打开路由转发功能,否则无法实现我们的应用。第二个命令则是iptables对nat表做了一个IP转发的操作,-o 选项后跟设备名,表示出口的网卡,MASQUERADE表示伪装的意思。
关于nat表,笔者不想讲太多内容,你只要学会这个路由转发即可。其他的东西交给网络工程师去学习吧,毕竟你将来可是要做linux系统工程师的。
D. 保存以及备份iptalbes规则
也许你不知道,咱们设定的防火墙规则只是保存在内存中,并没有保存到某一个文件中,也就说当系统重启后以前设定的规则就没有了,所以设定好规则后要先保存一下。
它会提示你把规则保存在了/etc/sysconfig/iptables文件内。其实,这个文件就是iptables的配置文件了,你不妨查看一下它。
红线部分就是咱们刚才设定那条规则!有时可能因为我们设置防火墙规则有误导致服务器出问题,这时候不妨先备份一下这个配置文件,然后停止防火墙服务。
这样防火墙就失效了,但是一旦你重新设定规则后(哪怕只有一条),防火墙又开始工作了。
我还可以使用iptables-save >filename 这条命令来保存一个防火墙规则,这样就可以起到备份的作用了。要想恢复这个规则使用下面这个命令即可。
none