全部博文(2065)
分类: LINUX
2010-03-13 19:30:31
LINUX中的防火墙专题
[整理人:遥方 整理时间:
修改防火墙的指令
vi /etc/firewall.sh
source /etc/firewall.sh 使其生效
其中的firewall.sh 文件内容类似的如下:
iptables -A INPUT -p tcp
--dport 80 -j ACCEPT
不太明白这些含义。现在整理一下以后就懂了!
一、整理一下相关的专业名词术语
INPUT 网络数据包流向服务器
OUTPUT 网络数据包从服务器流出
FORWARD 网络数据包经服务器路由
nat,用于NAT表.NAT(Net
Address Translation )是一种IP地址转换方法。
PREROUTING 网络数据包到达服务器时可以被修改
mangle,用于修改网络数据包的表,如TOS(Type Of Service),TTL(Time To Live),等
示例:#iptables -A INPUT -s XX.X.XXX.X/XX -p udp --dport 165 -j
ACCEPT
其中就有INPUT关键字。表示 网络数据包流向服务器
数据包进入到一台服务器的数据流过程:
当数据包进入服务器时,Linux Kernel会查找对应的链,直到找到一条规则与数据包匹配。如果该规则的target是ACCEPT,就会跳过剩下的规则,数据包会被继续发送。如果该 规则的target是DROP,该数据包会被拦截掉,kernel不会再参考其他规则。
Note:如果从始至终都没有一条规则与数据包匹配,而且表末尾又没有drop all的规则,那末该数据包会被accept。Cisco则相反,在表末尾会因含deny all的规则。
二、看到一条规则又是什么-A又是什么-s又是什么-p之类的现在整理一下明白其中的含义
-A 在链尾添加一条规则
-C 将规则添加到用户定义链之前对其检查
-D 从链中删除一条规则
-E 重命名用户定义的链,不改变链本身
-F 清空链,删除链上的所有规则
-I 在链中插入一条规则
-L 列出某个链上的规则,如iptables –L INPUT 列出INPUT链的规则
-N 创建一个新链
-P 定义某个链的默认策略
-R 替换链上的某条规则
-X 删除某个用户相关的链
-Z 将所有表的所有链的字节和数据包计数器清零
示例:
iptables –F 在firewall.sh的头部会定义这一行表示先清空
iptables -P INPUT DROP 定义默认策略为DROP
iptables -A INPUT -m state
--state ESTABLISHED,RELATED -j ACCEPT
上面是大写的关键字现在来看看小写的关键字吧
-p –protocol 应用于数据包的协议类型,可以是TCP UDP ICMP或ALL。!也可使用。
当使用-p tcp时,还可使用其他可以选项,以便允许进一步定义规则。选项包括:
--sport 允许指定匹配数据包源端口.port1:port ,表示port1和port2之间的所有端口
--dport 目的端口,和--sport雷同。
当使用-p !udp时,也有特殊的选项供使包括:
--sport,--dport,与-p tcp 相同,只不过用以用于UDP包。
使用-p icmp参数时,只有一个选项可用。
--icmp-type,允许在过滤规则中指定icmp类型。
示例:#iptables -A INPUT -s XXX.XXX.XXX.XXX/XX -p tcp --dport 384
-j ACCEPT
这句链用了-p 数据包的协议类型即为tcp 这里面我们用了-p tcp 还可以用其他的选项比如这里我们就使用了—dport 384 表示允许指定匹配数据包源端口
-s –source 指定数据包的源地址。该参数后跟一个IP地址,一个带有sub-net mask的网络地址,或一个主机名。(不建议使用主机名)
示例:#iptables -A INPUT -s XX.XX.X.0/16 -p udp -j ACCEPT
名词术语补充:
subnet mask是子网掩码,是与你的网络规模有关的,如分配网段,那些是属于这个网段,那些是属于另外一个的;2.Default Gateway是默认网关,一般是联接两个不同协议网络的一个结点,主要是完成协议转换。至于子网掩码的详细内容请参考下面的内容
-d,-- destination 数据包的目的地址,同-s.
-j,--jump 用于指定一个target,告诉规则将该匹配的数据包发送到该target。Target可以是ACCEPT,DROP,QUEUE,RETURN.如果没有-j,那么不会对数据包进行任何操作,只是将计数器加1。
示例: iptables -A INPUT -s XX.X.X.0/16 -p udp -j ACCEPT
-i,--in-interface ,对于INPUT FORWARD
PREROUTING链,该指定数据包到达器时所使用的端口。
示例:iptables -A INPUT -i lo -j ACCEPT lo:表示127.0.0.1地址值
-o --out-interface,对于OUTPUT
FORWARD POSTROUTING链,该参数指定数据包离开服务器时使用的端口。
下面再介绍一下-j 后面的目标的含义
创建规则的最后一步是指定Iptables对数据包的操作。只要某一规则匹配该数据包,就不会再有别的规则的操作。内建的target有:ACCEPT DROP QUEUE RETURN。
ACCEPT:允许数据包通过,到达目的地。
DROP:拒绝数据包通过,丢弃该包。
QUEUE:将数据包发送回到用户应用程序处理。
RETURN:不再根据当前链的其他规则来检查数据包,而是直接返回,继续被发送到其目的地址,或下一个链。
以上介绍了整个firewall.sh里面的东西术语。现在来查看一下示例应用
允许WWW
iptables –A INPUT –p tcp –dport 80 –j ACCEPT
该规则被添加到filter表的INPUT链,允许目的端口是80的数据包。
在内部接口上允许DHCP
iptables –A INPUT –i eth0 –p tcp - - sport
68 - -dport 67 ACCEPT
iptables –A INPUT –i eth0 –p ucp - -sport 68 - -dport 67 ACCEPT
以上同时允许TCP和UDP协议。
附一:子网掩码介绍
在TCP/IP协议中,SUBNET MASKS(子网掩码)的作用是用来区分网络上的主机是否在同一网络取段内。在大型网络中,CLASS A的 SUBNET MASKS为255.0.0.0, CLASS B的SUBNET MASKS为255.255.0.0,CLASS C的 SUBNET MASKS为255.255.255.0。
PS:哦怪不得我的电脑上面的子网掩码是255.255.255.0 原来我的是属于C类网络
假如某台主机的SUBNET MASKS为IP地址为202.119.115.78,它的SUBNET MASKS为255.255.255.0。将这两个数据作AND运算后,所得出的值中的非0的BYTE部分即为NETWORK ID 。运算步骤如下:
202.119.115.78的二进制值为: 202—二进制为:128+64+2+8=202 2的7次方+2的六次方这样
11001010.01110111.01110011.01001110
255.255.255.0的二进制值为:
11111111.11111111.11111111.00000000
AND后的结果为: AND表示只要有一个为0则为0
11001010.01110111.01110011.00000000
转为二进制后即为:
202.119.115.0
它就是NETWORK ID,在IP地址中剩下的即为HOST ID,即为78,这样当有另一台主机 的IP 地址为
202.119.115.83,它的SUBNET MASKS也是255.255.255.0,则其NETWORK ID 为
202.119.115,HOST ID为83,因为这两台主机的NETWORK ID都是202.119.115,因此,这两台主机在同一网段内。
PS:哦因为255.255.255 其实参与and运算之后还是得回到原有的IP值。即两台主机的IP值如果都是属于C类IP的话。其前面的三个值相同则可以马上得知其网络ID是一样的。即属于同一个网段
例如:我的IP为192.168.100.40
子网掩码为255.255.255.0 那只要其他的IP是以192.168.100而且子网掩码与我的一样的话就表示我们是属性同一个网段内!
更进一步:
但是,在实际应用中,可能会有多个分布与各地的网络,而且,每个网络的主机数量并不很多,如果申请多个NETWORK ID,会造成IP资源的浪费,而且很不经济,如果我们在SUBNET MASKS上动一下手脚,可以在只申请一个NETWORK ID的基础上解决这个问题。
比如,我们有三个不同的子网,每个网络的HOST数量各为20、25和50,下面依次称为甲、乙和丙网,但只申请了一个NETWORK ID 就是
202.119.115。首先我们把甲和乙网的SUBNET MASKS改为255.255.255.224,224的二进制为11100000,即它的
SUBNET MASKS为:
11111111.11111111.11111111.11100000
这样,我们把HOST ID的高三位用来分割子网(?不太了解含义),这三位共有000、001、010、011、100、 101、110、111八种组合,除去 000(代表本身)和111(代表广播),还有六个组合,也就是可提供六个子网,它们的IP地址分别为:(前三个字节还是202.119.115)
00100001~00111110 即33~62为第一个子网
01000001~01011110 即65~94为第二个子网
01100001~01111110 即97~126为第三个子网
10000001~10011110 即129~158为第四个子网
10100001~10111110 即161~190为第五个子网
11000001~11011110 即193~222为第六个子网
选用161~190段给甲网,193~222段给乙网,因为各个子网都支持30台主机,足以应付甲网和乙网20台和25台的需求。
再来看丙网,由于丙网有50台主机,按上述分割方法无法满足它的IP需求,我们 可以将它的SUBNET MASKS设为255.255.255.192, 由于192的二进制值为11000000,按上述方法,它可以划分为两个子网,IP地址为:
01000001~01111110 即65~126为第一个子网
10000001~10111110 即129~190为第二个子网
这样每个子网有62个IP可用,将65~126分配丙网,多个子网用一个NETWORK ID 即告实现。