netfilter //netfilter是防火墙的名字,工具的名字叫iptables。
#Netfilter与iptables的关系
#我们常听说Linux防火墙叫做“iptables”,其实这样的称呼并不是很正确,什么是iptables呢?
Netfilter所需要的规则是存放在内存中的,但问题是防火墙管理人员该如何将规则存放到内存呢?
因此,防火墙管理人员会需要一个规则编辑工具,通过这个工具来对内存中的规则执行添加、删除
及修改等操作,这个工具就是iptables以及ip6tables,其中iptables是在IPV4网络环境中使用,
而ip6tables是在IPV6网络环境中使用,因此,Linux防火墙比较正确的名称应该是Netfilter/iptables。
table--->chain //表-->链
iptables -t filter -nvL //查看filter表。
-t //-t选项去指定表,filter是防火墙三个表之一。
-nvL //查看表的内容。
#filter下默认有三个chain:INPUT,OUTPUT,FORWARD.
iptables -t nat -nvL //查看nat表,nat是防火墙三个表之一。
#nat下默认有三个chain:PREROUTING,POSTROUTING,OUTPUT.
iptables -t mangle -nvL //查看mangle表,mangle是防火墙三个表之一。
#mangle下默认有五个chain:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD.
filter //这个表用来过滤进出网卡的包。
iptables -t filter -I INPUT -p tcp --dport 80 -s 源IP -j ACCEPT
-I //-I类似于insert.(可以设置两条同样的规则。)
#增加规则后,从浏览器去访问虚机地址,然后在虚机上用iptables -nvL去查看情况。
--dport //目的端口。(端口可以不指定。)
-j //如何处理这个包:DROP //不会去看,而是直接扔掉。 REJECT //研究一下这个包后,才拒绝。
ACCEPT //表示接受
iptables -nvL //在不用-t指定表的情况,默认就是filter表。
iptables -t filter -D INPUT -p tcp --dport 80 -s 源IP -j //清除这个规则。
-D //-D类似于delete.
iptables -t filter -A INPUT -p tcp --dport 80 -s 源IP -j //增加一条规则。
-A //-A类似于ADD.用-A选项,规则会增加到chain的最下层。用-I选项,规则会增加到chain的最下层。
#每一条chain中的规则像一条条栅栏,最上边的栅栏先起作用。
技巧:用ip138.com查看自己的公网IP。
#关于规则生效问题,与ACL控制访问列表相似,当第一条规则匹配到后,不去管后面的规则是如何规定的,不会出现规则相互矛盾的现象。
iptables -Z //把包的数据置零。默认为filter,对别的表进行操作,需要加-t.
-Z //把规则里关于包的记数置零。
iptables -F //把所有规则清空。默认为filter,对别的表进行操作,需要加-t.
-F //把所有规则清空
service iptables restart //重启防火墙。(之前插入的规则如果不保存,重启iptables之后,会被清空。)
service iptables save //保存规则。规则会被写到/etc/sysconfig/iptables
iptables-save >1.ipt //把规则备份到1.ipt里去。
iptables -F ;iptables-restore < 1.ipt //清除规则之后,通过反向重定向把规则恢复。
iptables -F ;service iptables save //清除原有规则并保存。
iptables -t filter -I OUTPUT -d 192.168.31.105 -j DROP
-s //-s选项,引出源IP.
-d //-d选项,引出目标IP.
FORWARD链作用于与本机无关的包,即把包转发到别的主机。
nat表用于网络地址转换。
PREROUTING //作用于要到达防火墙的包,把目标IP由公网IP转换为私网IP.
POSTROUTING //作用于包在从防火墙出去的时候,把包的源IP由私网IP转换为公网IP.
OUTPUT //改变本地产生的包的目标IP.
mangle表 //用于给包打标记,然后根据这些标记去做一些操作。
PREROUTING
POSTROUTING
OUTPUT
INPUT
FORWARD
#对于系统工程师来说,filter表和它的INPUT链是最重要的,可以把带有不可信源IP的包挡住防火墙外面。
iptables -P INPUT ACCEPT //用iptables -nvL去查看 ,会发现INPUT (policy 后的策略变为ACCEPT.)
#另外,不要轻易去设置DROP,因为一旦设置了DROP,那么SSH的22端口也是不通的。如果设置了DROP,只能去
机房或通过带外管理界面去补救。
-P //即策略,设置的策略相当于链的总开关。EG:如果设置为ACCEPT(默认),即所有的包都是允许通过状态。可以增加规则去限制不想要的包。
如果设置为DROP,即所有的包都是丢弃状态。可以增加规则去匹配想要的包。
iptables -nvL --line-numbers //先显示规则序号。
iptables -D INPUT/OUTPUT 序号 //之后用这条命令,就可以删除该序号所对应的规则了
EG:INPUT DROP; 192.168.0.0/24 22 accept;all 80 accpet;all 21 accept;
vim 12.ipt.sh //通过脚本去添加规则
#!/bin/bash
ipt="iptables" //因为iptables要使用多次,所以设置成变量。
$ipt -F //每次执行这脚本,都会增加新的规则。 为了防止和之前的规则混淆,先把之前的规则清空,然后再添加新的规则。可以执行多次。
$ipt -P INPUT DROP //尽量不要去设置DROP,测试时改为ACCEPT去测试。
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -s 192.168.31.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
$ipt -A INPUT -p tcp --dport 22 -j DROP //剩下的IP全部DROP掉。
# $是对之前定义的变量进行引用的。
执行脚本时,出现以下报错信息。
[root@sunlocalhost ~]# sh !$
sh 12.ipt.sh
Bad argument `22'
Try `iptables -h' or 'iptables --help' for more information.
Bad argument `80'
Try `iptables -h' or 'iptables --help' for more information.
Bad argument `21'
Try `iptables -h' or 'iptables --help' for more information.
造成这个报错的原因,是因为我把--dport写成-dport.