今天一个同学它的腾讯云服务器出现了个小问题,启动tomcat服务器后。在服务器本机上使用curl 127.0.0.1:8080访问没任何问题。但通过外网ip却一直访问不了。然后我Google的一堆解决方法,最多的还是关于防火墙iptables的配置。虽然最后重新装了一个tomcat后就莫名其妙的正常了。根本不是iptables的问题,但通过解决这个问题查询了大量iptables方面的知识(虽然当初啃《鸟哥的Linux私房菜》的时候看过相关知识,但毕竟没有实践,今天正好借这个机会实际了一把),现在将iptables的一些常用知识总结一下。
1.什么是iptables
iptable其实是Linux下的数据包过滤软件,也是目前最新Linux发行版中默认的防火墙。要想深入了解iptables机制,了解防火墙的规则是必不可少的。由于iptables利用的数据包过滤的机制,所以它会分析数据包的报头数据。根据报头数据与定义的规则来决定该数据包是进入主机还是丢弃。 也就是说,根据数据包的分析资料”对比”预先定义的规则内容,若数据包数据与规则内容相同则进行动作,否则就继续下一条规则的比对。重点在比对与分析顺序。
2.iptables的简单工作原理
举个简单的例子,当我们的iptables定义了十条防火墙规则,那么当Internet来了一个数据包想要进入主机前,会先经过iptables的规则。检查通过则接受(ACCEPT)进入本机取得资源,如果检查不通过,则可能予以丢弃(DROP).一定要注意一点,iptables定义的规则是有顺序,但某个数据包符合Rule1,则会执行Rule1对应的Action1而并不会理会后面所有的Rule。当所有Rule都不匹配,会执行默认操作。
iptables的规则是非常重要的,比如当我们有一台提供WWW的服务的主机,自然我们就要针对port 80端口来启动通过的数据包规则,但我们发现IP为192.169.155.155总是存在恶意操作,所以我们要禁止该IP来访问该服务,最后所有非WWW的数据包全部丢弃,我们来看完成这三个功能的规则顺序。
- Rule1先阻挡192.168.155.155
- Rule2再让请求WWW服务的数据包通过
- Rule3将所有的数据包丢弃
现在我们想一下,如果这三条规则的顺序变了之后,我们还能完成刚刚的需求么?
3.iptables的策略
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
刚刚我们所说的规则仅仅是iptables表格中的一个链而已。iptables里面有多个表格(table),每个表格都定义出自己的默认策略与规则,且每个表格的用途都不相同。
我们现在用的比较多有如下3个:
- 1.filter(过滤器,默认的table) 定义允许或者不允许的
- 2.nat(地址转换) 定义地址转换的
- 3.mangle(破坏者)功能:修改报文原数据,加特殊标记。
4.上述表中常见的链
与数据包是否进入Linux本机有关的表:Filter
- INPUT:主要与想要进入Linux主机的数据包有关
- OUTPUT : 主要与Linux本机所要送出的数据包有关
- FORWARD : 与Linux本机没有关系,它可以传递数据包到后端的计算机中,与表NAT有关
用来进行来源与目的地的IP或port的转换(主要于Linux主机后的局域网内的主机有关):NAT
- PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT) 。
- POSTROUTING :在进行路由判断之后所有进行的规则(SNAT/MASQUERADE)。
- OUTPUT: 与发送出去的数据包有关
与特殊的数据包的路由标志有关:Mangle 上述5个了链都可以做
由于Filter是默认的table,并且如果iptables只是用来保护Linux主机本身的话,只用关注Filter表格内的INPUT和OUTPUT这两条链即可。其余的两个table也不常用,因此我们重点学习Filter。
5.iptables中规则的查看
如果在安装Linux的时候没有选择防火墙,那么iptables在一开始应该是没有规则的。如果在安装的时候选择自动建立防火墙机制,那么就有默认的防火墙规则。我们来看查看iptables规则的命令。
iptables [-t table ] [-L] [-nv]
选项与参数:
-t:后面接table。例如 filter或者nat。如果不写默认是filter
-L:列出目前的table规则
-n:不进行IP与HOSTNAME的反查,使用此参数查询结果会很快
-v:列出更多信息,包括通过该规则的数据包总位数,相关的网络接口等。
//我们执行上述命令
hadoop wang # iptables -L -n
//针对INPUT链,且默认策略为可接受
Chain INPUT (policy ACCEPT)
//说明栏
target prot opt source destination
//针对FORWARD链,且默认策略为可接受
Chain FORWARD (policy ACCEPT)
target prot opt source destination
//针对OUTPUT链,且默认策略为可接受
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
上述每一个chain就是前面提到的每个链。Chain那一行括号里面policy就是默认的策略。下面分析说明栏的五列分别代表的意思:
- target:代表进行的操作,ACCEPT是放行,而REJECT则是拒绝,此外,尚有DROP(丢弃)的项目.
- 代表使用的数据包协议,主要有TCP,UDP及ICMP数据包格式。
- opt:额外的选项说明。
- source :代表次规则是针对哪个来源IP进行限制
- destination: 代表次规则是针对哪个目标IP进行限制
5.iptables中规则的清除
iptables [ -t tables ] [ -FXZ ]
-F:清楚所有的已定制的规则
-X:清楚所有用户"自定义"的chain或者tables
-Z:将所有的chain的计数与流量统计都归零
清楚防火墙的所有规则:
iptables -F
iptables -X
iptables -Z
上述三个命令会将防火墙的规则都清除,但不会改变默认策略(policy)。一般来说,我们重新定义防火墙的时候都会先把规则清除掉。
6.iptables中定义默认策略(policy)
前面提到,当数据包不在我们设置的规则之内时,则该数据包的通过与否,是以Policy的设置为准。在安全性比较高的主机中,Filter内的INPUT链定义的比较严格,INPUT的Policy定义为DROP
iptables定义规则:
格式:iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP ]
-p : 定义策略(Policy)。注意:P为大写
ACCEPT:数据包可接受
DROP:数据包被丢弃,client不知道为何被丢弃。
iptables -P INPUT DROP //INPUT默认设置为DROP
iptables -P OUTPUT DROP //OUTPUT默认设置为ACCEPT
iptables -P FORWARD DROP // FORWARD默认设置为ACCEPT
此时我们执行 iptables-save(不同与iptables -L -n -v的是它会列出完整的防火墙规则)会看到如下信息:
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
//由于INPUT设置为DROP而又尚未有任何规则,所有显示如上结果。此时所有数据包均都无法进入
现在我们可以设置默认策略后,现在来看看关于各规则的数据包基础比对设置。
7.数据包的基础对比:IP,网络及接口设备
现在我们来添加防火墙规则的数据包对比设置。从最基础的IP,网络及端口开始(即是OSI的第三层谈起)再来谈谈设备(网络卡)的限制等。
iptables定义规则的格式:
iptables [-AI 链名] [-io 网络接口 ] [ -p 协议 ] [ -s 来源IP/网络 ] [ -d 目标IP/网络 ] -j [ACCEPT | DROP|REJECT|LOG]
参数说明:
-A:新增一条规则,该规则在原规则的最后面。
-I:插入一条规则,默认该规则在原第一条规则的前面。即该新规则变为第一条规则。
-io 网络接口:设置数据包进出的接口规范。
-i:表示输入。即数据包进入的网络接口。与INPUT链配合
-o : 表示输出。数据包传出的网络接口。与OUTPUT链配合
-p 协定: 此规则适应于哪种数据包。如tcp,udp,icmp及all.
-s 来源 IP/网络:设置次规则之前数据包的来源地,可指定单纯的IP或网络,例如:
IP : 192.168.0.100
网络 : 192.168.0.0/24或者192.168.0.0/255.255.255.0
如果规则为不允许,则在IP/网络前加 “!” 即可。
-s ! x.x.x.x
-d 目标 IP/网络。与-s类似,只是是目标IP或者网络而已。
-j:后面接操作。如ACCEPT,DROP ,REJECT或者LOG(记录)
比如:开放lo这个本机的接口以及某个IP来源
//设置io成为受信任的设备,亦即进出lo的数据包都接受
iptables -t filter -A INPUT -i lo -j REJECT
我们可能会有疑惑,为什么没有-s -d等规则,表示不论数据包来自何处或去到哪里,只要是来自lo这个接口全部接受。
设置来自192.168.100.10的就接受,192.168.100.11的就丢弃。
iptables -A INPUT -i eth0 -s 192.168.100.10 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.100.11 -j DROP
iptables -I INPUT -i eth0 -s 192.168.100.0/24 -j ACCEPT
此时我们执行iptables-save
*filter
:INPUT ACCEPT [12:976]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:2186]
-A INPUT -s 192.168.100.0/24 -i eth0 -j ACCEPT
-A INPUT -s 192.168.100.10/32 -i eth0 -j ACCEPT
-A INPUT -s 192.168.100.11/32 -i eth0 -j DROP
COMMIT
此时我们会有一个疑问,既然我们已经放行了192.168.100.0/24。所以丢弃192.168.100.11的规定根本不会被用到了。那么我们应该怎么办在不改变顺序的情况下让这两个规则都生效。指定-j 为LOG。
iptables -A INPUT -s 192.168.2.200 -j LOG
LOG all -- 192.168.2.200 0.0.0.0/0 LOG flags 0 level 4
输出结果最左边为LOG,只要数据包来自192.168.2.200这个IP时,那么该数据包的相关信息就会被写入内核日志文件,即/var/log/messages这个文件当中。然后于下一个规则相比较。
8.TCP,UDP协议的规则对比:针对端口设置
- 在 -s 参数后面可以增加一个参数 -sport 端口范围(限制来源端口),如:1024:65535
- 在-d 参数后面可以增加一个参数 -dport 端口范围(限制目标端口)
需要特别注意,这两个参数重点在port上面,并且仅有TCP和UDP数据包具有端口,因此要想使用–dport,–sport时需要加上-p tcp或者 -p udp才会成功。
下面做几个小测试:
//丢弃所有想要链接本机21端口的数据包
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
//想要链接到本机的网上邻居(UDP port 137,138 tcp 139,445)就放行
iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT
//只要来自192.168.1.0/24的1024:65535端口的数据包,且想要连接的本机的ssh port就阻挡
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
除了制订端口号之外,TCP数据包还有特殊的标识,比如主动链接的SYN标志。iptables支持使用–syn来处理。
iptables -A INPUT -i eth0 -p tcp --sport 1:1023 -dport 1:1023 --syn -j DROP
9.iptables的开启与关闭
查看运行状态:
#/etc/init.d/iptables status
关闭防火墙服务:
/etc/init.d/iptables stop
//此方法在主机下次重新启动还是会开启
直接禁用防火墙:
chkconfig --level 35 iptables off
chkconfig --list iptables
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
//对应启动的7种状态