每个防火墙规则链都有一个默认的策略和一组对特定消息类型响应的动作集.
每个包依次在表中对每条规则进行检查,直到找到一个匹配.如果未找到则使用默认规则链
.防火墙有两种默认策略
1)默认禁止一切 (推荐: 你可以禁止一切,但只允许定义的那几个包通过)
明确选择的包允许通过
2)默认接受一切 (你必须手动禁止每一个不允许通过的规则, 会很烦累)
明确选择的包禁止通过
.拒绝(Reject)和禁止(Deny)
1)拒绝
包不允许通过,同时返回发送者一个ICMP错误消息, 易造成Dos攻击或不必要的信息泄露
2)禁止
包被丢弃,对发送者无任何通知
.可以基于源IP、目的IP、源端口、目的端口和TCP标志来过滤每个包
1)从外面来的声称是我们自己IP的包
2)A,B,C,D,E,lo类LAN专用网址,因为他们不在Internet上访问
A类 10.0.0.0 - 10.255.255.255
B 172.16.0.0 - 172.31.255.255
C 192.168.0.0 - 192.168.255.255
D 224.0.0.0 - 239.255.255.255
E 240.0.0.0 - 247.255.255.255
lo 127.0.0.0 - 127.255.255.255
.在包一级,识别IP包发送者的唯一方法就是包头中的源地址
(但这样给IP源地址欺骗敞开了大门, 发送者可以在源地址字段放置一个不存在的或其他人的地址,而不是自己的真正的源正址)
1)把来自172.16.1.69的向主机3306端口的包丢弃
iptables -A INPUT -p tcp --dport 3306 -s 172.16.1.69 -j DROP
$mysql -h 172.16.1.10 -u cnscn -p123456 会处于长时的等待,而收不到服务器的反应
2)把来自172.16.1.69的向主机3306端口的包拒绝
iptables -A INPUT -p tcp --dport 3306 -s 172.16.1.69 -j REJECT
$mysql -h 172.16.1.10 -u cnscn -p123456 会收到
ERROR 2003 (HY000): Can't connect to MySql server on '172.16.1.10' (111)
3)接受来自172.16.1.69的向主机3306端口的包
iptables -A INPUT -p tcp --dport 3306 -s 172.16.1.69 -j ACCEPT
$mysql -h 172.16.1.10 -u cnscn -p123456 登陆成功
Welcome to the MySQL ...
mysql>
.iptables中的TARGETS
1)防火墙的规则指定所检查包的特征和目标。
2)如果包不匹配, 将送往该链中下一条规则检测
如果包匹配, 那么下一条规则由目标值确定, 此目标值可以是用户定义的链名,
或是某个专用值,如ACCEPT(接受)、DROP(丢弃)、QUEUE(排队)、RETURN(返回,
停止这条链的匹配,到前一个链的规则重新开始。 如果到了一个内建的链末端, 或遇到内建链的是RETURN, 包的命运将由链准则指定的目标决定)
.TABLES
当前有三个表
-t table
这个选项指定命令要操作的匹配包的表, 如果内核被配置为自动加载模块, 这时若模块没有加载, 系统将尝试为该表加载适合的模块
filter
这是默认的表, 包含了内建的链INPUT(处理进入的包)、 FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)
nat
这个表被查询时表示遇到了产生新的连接的包, 由三个内建的链构成: PREROUTING (修改到来的包)、 OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)
mangle
这个表用来对指定的包进行修改, 它有两个内建规则: PREROUTING(修改路由之前进入的包)和 OUTPUT(修改路由之前本地的包)
COMMANDS
-A -append
在所选择的链末添加一条或更多规则。 当源(地址)或与目的(地址)转换为多于一个(多个)地址时,这条规则会加到所有可能的地址(组合)后面
-D -delete
从所选的链中删除一条或多条规则
-R -replace
从选中的链中取代一条规则。
如果源或目的地址被转换为多地址, 此命令会失败。 规则序号从1开始
-I -insert
根据给出的规则序号向所选链中插入一条或更多规则, 所以如果规则序号为1, 规则会被插入链的头部。 这也是不指定规则序号时的默认方式
-L -list
列出所有或选择的规则链
-F -flush
清空所选链, 等于把所有规则一个个的删除
-Z -zero
把所有链的包及字节的计数器清空, 它可以和-L配合使用, 在清空前察看计数器
-N -new-chain
根据给出的名称建立一个新的用户定义链。 这必须保证没有同名的链存在
-X -delete-chain
删除指定的用户自定义链,
这个链必须没有被引用, 如果被引用, 在删除之前或者替换与之有关的规则, 如果没有给出参数, 这条命令将试着删除每个非内建的链
-P -polly
设置链的目标规则
-E -rename-chain
根据用户给出的名字对指定链进行重命名, 这仅仅是修餙,对整个表的结构没有影响。 TARGETS参数给出一个合法的目标。 只有非用户自定义链可以使用规则,而且内建链和用户自定义链都不能是规则的目标
-h
帮助
OPTIONS
-p -protocal [!]protocal
规则或包检查(待检查包)的协议。
指定协议可以是tcp、udp、icmp中的一个或全部,也可以是数值,代表这些协议中的某一个。
当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上!表示相反的规则。数字0相当于所有all。 Protocol
all会匹配所有协议, 而且这是缺省时的选项。在和check命令结合时,all可以不被使用
-s --source [!] address[/mask]
指定源地址, 可以是主机名、网络名和清楚的IP地址。
mask说明可以是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边“1”的个数, 因此,mask值为24等于255.255.255.0
在指定地址前加上 ! 说明指定了相反的地址段标志
-src 是这个选项的简写
-d --destination [!] address[/mask]
指定目标地址
-j --jump target
(-j 目标跳转)指定规则的目标; 也就是说,如果包匹配应当做什么。 目标可以是用户自定义链(不是这条规则所在的),
某个会立即决定包的命运的专用内建目标, 或者一个扩展,如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响, 不过规则的计数器会增加
-i --in-interface [!][name]
(-i进入的(网络)接口 [!][名称])这是包经由该接口接收的可选的入口名称,
包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。 当在接口名前使用”!“说明后,
指的是相反的名称。如果接口名后面加上+,则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略, 会假设为+,那么将匹配任意接口
-o --out-interface [!][name]
(-o 输出接口[名称])这是包经由该接口送出的可选的出口名称,
包通过该出口输出(在链OUTPUT和POSTROUTING中送出的包)。当在接口名前使用!说明后,指的是相反的名称。 如果接口名后面加上+,
则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为+, 那么将匹配所有任意接口
[!] -f --fragment
([!] -f 分片) 这意味着在分片的包中,
规则只询问第二及以后的片。自那以后由于无法判断这种把包的源端口或目标商品(或者是ICMP类型的),
这类包将不能匹配任何指定对他们进行匹配的规则。 如果!说明用在了-f标志之前, 表示相反的意思。
阅读(1166) | 评论(1) | 转发(0) |