一,概念

1,容器:包含或者说属于的关系

 

2,Netfilter/iptables是表的容器,iptables包含的各个表:filter(如不指定参数,默认为filter) /  NAT  / MANGLE /   RAW(少用)

 

3,ptables的表又是链的容器

链:INPUT  /   OUTPUT   /   FORWARD  /   PREROUTING  /  POSTROUTING

 

4,链是规则的容器

 

5,规则:一条条过滤的语句

 

二,iptables表(tables)和链(chains)的对应关系

 

表(tables)

链(chains)

INPUT

FORWARD

OUTPUT

PREROUTING

POSTROUTING

FILTER

YES

YES

YES

NO

NO

NAT

NO

NO

YES

YES

YES

MANGLE

YES

YES

YES

YES

YES

 

三,filter表

 

强调:主要和主机自身有关,真正负责主机防火墙功能(过滤流入流出主机的数据包),filter表是iptables默认使用的表。企业工作场景:主机防火墙。

定义了三个链(Chains),强调:对于filter表的控制是我们实现本机防火墙功能的重要手段,特别是对INPUT链的控制:

 

INPUT:负责过滤所有目标地址是本机地址的数据包。通俗的讲,就是过滤进入主机的数据包。

 

FORWARD:负责转发经主机的数据包。起转发的作用,和NAT关系很大;LVS  NAT模式;net.ipv4.ip_forward=0

 

OUTPUT:处理所有源地址是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包。

 

四,NAT表:

负责网络地址转换,即来源与目的IP地址和port的转换。应用:和主机本身无关,应用:局域网共享上网 或 特殊的端口转换服务(端口映射,访问外网IP指定端口就能访问内网某IP指定的端口)

 

NAT 功能一般企业工作场景:

1)用于做企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)

2)做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING)

3)web单个端口的映射,nat功能相当于网络的acl控制。和网络交换机acl类似

 

OUTPUT:和主机发出去的数据包有关。改变主机发出去数据包的目标地址。

 

PREROUTING:在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等;例如:把公网IP:124.42.60.113映射到局域网的10.0.0.19服务器上,如果是web服务,可以把80转为局域网的服务器上9000端口;

 

POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址、源端口等,例如:我们现在的笔记本和虚拟机都是10.0.0.0/24,就是出网的时候被我们企业路由器把源地址改成了公网地址了。生产应用:局域网共享上网

 

五,mangle:略~

 

六,iptables的工作流程

iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则来进行匹配,来决定是否可以进入主机。

 

数据包的流向是从左向右的(如果匹配DROP或Accept后,则不再往下走了;反之,往下一条规则进行判断):

iptables docker 配置 iptables docker链_IP

小结:

1、防火墙是层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的

2、如果匹配上规则,则明确表明是阻止还是通过,数据包就不再往下匹配新的规则了

3、如果规则中没有明确表明是阻止还是通过,则就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过

4、防火墙默认规则是对应链的所有的规则执行完才会执行的

 

七,iptables表和链工作的流程图

 

八,参数命令讲解

 

1,防火墙开启

/etc/init.d/iptables start

防火墙状态

/etc/init.d/iptables status

iptables   -L -n

 

lsmod | egrep "nat|filter|ipt"   #查看内核是否载入nat , filter , ipt模块

 

#内核载入模块
modprobe ip_tables
modprobe iptables_filter
modprobe iptables_nat
modprobe ip_conntrack
modprobe ip_conntrack_fpt
modprobe ip_nat_ftp
modprobe ipt_state

 

2,清除规则

-F :清楚所有规则,不会处理默认的规则

-X :删除用户自定义的链(不讲)

-Z :链的计数器清零

 

3,禁止规则

#禁止ssh端口

(1)找出当前机器SSH端口

netstat -lntup | grep ssh

 

(2)禁止当前SSH端口,这里是22

语法:

iptables  -t   [table]    -[AD]    chain   rule-specification   [options]

具体命令:

iptables                       -A    INPUT    -p    tcp    --dport   22   -j   DROP      #   -A    附加到最后     ;    -I   放到最前;    -D   清除        

iptables    -t   fileter    -A    INPUT    -p    tcp    --dport   22   -j   DROP     #   -A    附加到最后      ;    -I   放到最前;    -D   清除        

注意:

a、iptables默认用的就是filter表,因此上面2条命令等价

b、其中的INPUT  DROP  要大写

c、 --jump      -j   target

target  for   rule  (may  load  target  extension)

基本的处理行为:ACCEPT(接受)    、     DROP(丢弃)    、   REJECT(拒绝)

比较:DROP好于REJECT

d、命令行执行的规则,仅仅在内存里临时生效

 

(3) iptables -L -n --line-numbers  # 显示规则的行号,方便后面快捷删除规则,例如: iptables -D INPUT 1

 

4,禁止源地址

禁止10.0.0.0网段连入

iptables   -A   INPUT    -i    eth0    -s   10.0.0.0/24    -j    DROP   # 禁止10.0.0.0/24 网段 通过eth0 入口,链接到本机   #  -i   进入的接口

iptables   -A   INPUT    -i    eth0    -s   10.0.0.7    -j    DROP   # 禁止10.0.0.7  通过eth0 入口,链接到本机

iptables   -A   INPUT    -i    eth0   !  -s   10.0.0.7    -j    DROP   # 除10.0.0.7可以链接到本机外,禁止 其他IP 通过eth0 入口,链接到本机

 

5,禁PING

iptables   -I  INPUT   -p  icmp  --icmp-type  8   -i   eth0   -j   DROP

 

6,封端口范围

iptables   -A   INPUT   -p  tcp   --sport   22:80

iptables   -I   INPUT   -p   tcp   -m   multiport   ---dprot   31,22,23,24   -j  DROP    

 

7,匹配网络状态

-m   state    --state

NEW:已经或将启动新的链接
ESTABLISHED:已建立的链接
RELATED:正在启动新链接
INVALID:非法或无法识别的

FTP服务是特殊的,需要配状态链接

 

#允许关联的状态包

iptables   -A   INPUT     -m   state   --state   ESTABLISHED,RELATED   -j   ACCEPT

iptables   -A   OUTPUT -m   state   --state   ESTABLISHED,RELATED   -j   ACCEPT

 

8,包的速率进行控制

-m   limit    --limit

 

九,生产环境实战 主机防火墙,总原则:默认不能进

1,清除旧的规则

iptables -F   # 删除所有规则

iptables -X   # 删除自定义链

iptables -Z   # 计数器清零

 

2,让自己人能通过

iptables   -A   INPUT   -p   tcp   --dport   22   -s   10.0.0.0/24   -j   ACCEPT

 

3,允许本机回环接口进和出

iptables   -A   INPUT   -i   lo   -j   ACCEPT

iptables   -A   OUTPUT   -o   lo   -j   ACCEPT

 

4,设置默认的防火墙禁止和允许的规则(重要,配置后需要重启iptables,就像电影院,默认不允许随便进,但允许出)

设置默认DROP掉FORWARD,INPUT链,允许OUTPUT链

 

iptables   --policy   INPUT   DROP            #    -P  等价于  --policy

 

iptables   -P   OUTPUT    ACCEPT          

iptables   --policy   FORWARD   DROP

 

5,允许IDC LAN / WAN和办公网IP的访问,及对外合作机构的合法的进入:

iptables   -A   INPUT   -s   124.43.62.96/27   -p   all   -j   ACCEPT

iptables   -A   INPUT   -s   192.168.1.0/24   -p   all   -j   ACCEPT

iptables   -A   INPUT   -s   10.0.0.0/24   -p   all   -j   ACCEPT

iptables   -A   INPUT   -s   203.83.24.0/24   -p   all   -j   ACCEPT

iptables   -A   INPUT   -s   201.82.34.0/24   -p   all   -j   ACCEPT

 

6,允许业务服务端口对外访问(允许http服务无条件通过)

iptables    -A    INPUT    -p    tcp    --dport    80    -j    ACCEPT

 

7,允许PING主机(如果不允许就不执行)

iptables    -A    INPUT    -p    icmp    --icmp-type    8    -j    ACCEPT

 

#如果对内开,对外不开

iptables    -A    INPUT    -p    icmp    -s    192.168.11.0/24    -m    icmp    --icmp-type    any    -j    ACCEPT

 

8,允许关联的状态包通过(WEB服务不要使用FTP服务)

iptables    -A    INPUT   -m   state   --state   ESTABLISHED,RELATED   -j   ACCEPT

iptables    -A   OUTPUT -m   state   --state   ESTABLISHED,RELATED   -j  ACCEPT

 

9,扫描开发的端口

nmap   IP地址    -p    1-65535

 

10,自定义链处理syn攻击

iptables   -N   syn-flood

iptables   -A   INPUT   -i   eth0   -syn  -j   syn-flood

iptables   -A   syn-flood   -m   limit   -limit   5000/s   -limit-burst   200   -j    RETURN

iptables   -A    syn-flood    -j   REJECT

 

十,保存规则到文件,永久有效

/etc/init.d/iptables    save  #  保存规则到   /etc/sysconfig/iptables,在此文件中进行规则修改调整等(不用命令行,命令行重启防火墙将失效)

 

十一,从192.168.18.20的16888端口,通过18.20的NAT 转发到另外一台机10.221.162.26的6891端口:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 16888 -j DNAT --to-destination 10.221.162.26:6891
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 10.221.162.26 -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.18.20