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.