iptables

### 1.防火墙概述

封端口，封ip

实现NAT功能

共享上网

端口映射（端口转发），ip映射

### 2.防火墙

#### 2.1防火墙种类及使用说明

硬件：整个企业入口

三层路由：H3C，华为，Cisco(思科)。

深信服



软件：开源软件网站内部封ip封端口

iptables 写入到Linux内核中，以后服务docker   工作在4层（大部分）

firewalld 	C7

nftalbes 	 C8

ufw （ubuntu fire wall） 	 Ubuntu



云防火墙（公有云）

阿里云：

■安全组（封ip，封端口）

NAT网关（共享上网，端口映射....）

waf防火墙（应用防火墙，处理7层的攻击）SQL注入





#### 2.2必须熟悉的名词

容器：瓶子罐子存放东西

表(table)：存放**链**的容器

链chain)：存放**规则**的容器

规则(policy）：准许或拒绝规则

| *Netfilter*（防火墙） | 表(tables) | 链(chains)   | 规则(PoIicy)         |
| --------------------- | ---------- | ------------ | -------------------- |
| 一栋楼                | 楼里的房子 | 房子里的柜子 | 柜子里衣服，摆放规则 |



#### 2.3 iptables执行过程

工作流程小结：

1.防火墙是层层过滤的，实际是按照配置规则的顺序从上到下，从前到后进行过滤的。

2.如果匹配成功规则，即明确表示是拒绝（drop）还是接收（accept），数据包就不再向下匹配新的规则。

3.如果规则中没有明确表明是阻止还是通过的，也就是没有匹配规则，向下进行匹配，直到匹配默认规则得到明确的阻止还是通过。

4.防火墙的默认规则是所有规则执行完才执行的。



![image-20221023072853833](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202210230728890.png)

Q:如果配置了一条拒绝的规则，该放在哪里？







#### 2.4表与链※※※※※

##### 2.4.1简介

iptables是4表5链

4表：**filter表**	**nat表**	raw表	mangle表

5链：INPUT 	OUTPUT 	FORWARD 	PREROUTING 	POSTROUTING

##### 2.4.2每个表说明

1）filter表

防火墙：屏蔽或准许端口ip

| filter表 | 强调：主要和主机自身相关，真正负责主机防火墙功能的（过滤流入流出主机的数据包）   filter表示iptables默认使用的表，这个表定义了三个链(chains)企业工作场景：主机防火墙 |
| -------- | ------------------------------------------------------------ |
| INPUT    | 负责过滤所有目标地址是本机地址的数据包通俗来说：就是过滤进入主机的数据包 |
| FORWARD  | 负责转发流经主机的数据包。起转发的作用，和NAT关系很大，net.ipv4.ip_forward=0 |
| OUTPUT   | 处理所有源地址是本机地址的数据包通俗的讲：就是处理从主机发出去的数据包 |



2）nat表

实现NAT功能

共享上网

端口映射（端口转发），ip映射



| nat         | 负责网络地址转换的，即来源与目的P地址和port的转换。                                                   应用：和主机本身无关，一般用于局域网共享上网或者特殊的端口转换服务相关。                                                             工作场景：                                                                                                                                   1.用于企业路由(zebra)或网关(iptables)，共享上网(POSTROUTING)                                2.做内部外部1P地址一对一映射(dmz)，硬件防火墙映射1P到内部服务器，ftp服务(PREROUTING)                                                                                                                      3.WEB，单个端口的映射，直接映射80端口(PREROUTING)这个表定义了3个链，nat功能相当于网络的acl控制。和网络交换机acl类似。 |
| ----------- | ------------------------------------------------------------ |
| OUTPUT      | 和主机放出去的数据包有关，改变主机发出数据包的目的地址。     |
| PREROUTING  | 在数据包到达防火墙时，进行路由判断之前执行的规则，作用是改变数据包的目的地址、目的端口等  就是收信时，根据规则重写收件人的地址。                                                       例如：把公网IP:XX.XXX.XXX.XXX映射到局域网的Xx.XX.XXXx服务器上。如果是web服务，可以报80转换为局域网的服务器9000端口上                                                                       10.0.0.61  8080(目标端口)--nat 192.168.245.1  8022 |
| POSTROUTING | 在数据包离开防火墙时进行路由判断之后执行的规则，作用改变数据包的源地址，源端口等。写好发件人的地址，要让家人回信时能够有地址可回。                                                     例如。默认笔记本和虚拟机都是局域网地址，在出网的时候被路由器将源地址改为了公网地址。生产应用：局域网共享上网。 |
|             |                                                              |
|             |                                                              |



![img](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202210230754896.png)





## 环境准备及命令

### **iptables启动或关闭的命令**

```text
iptables1  10.0.0.61   172.16.1.61
web01   192.168.245.180  172.16.1.7

```



```text
rpm -qa |grep iptables
iptables-1.4.21-18.0.1.el7.centos.x86_64		#只是一个空壳命令
[root@iptables1 ~]# yum install -y  iptables-services 


[root@iptables1 ~]# rpm -ql   iptables-services 
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables                          #防火墙的配置文件    
/usr/lib/systemd/system/ip6tables.service 
/usr/lib/systemd/system/iptables.service         #防火墙服务配置文件(命令)  systemctl start iptables 


[root@iptables1 ~]# rpm -ql iptables 
/usr/sbin/iptables           #iptables 命令 添加/删除/查看 规则(4表5链)
/usr/sbin/iptables-save      #iptables规则 输出(保存)
/usr/sbin/iptables-restore   #  恢复

#防火墙相关模块 加载到内核中
查看内核模块命令
lsmod
lsmod |egrep 'nat|filter'

#写入到开机自启动.
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state 

#永久 
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state 
EOF

[root@iptables1 ~]# lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp             12770  0 
nf_conntrack_ftp       18638  1 nf_nat_ftp
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26787  2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack          133053  6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter         12810  0 
ip_tables              27126  2 iptable_filter,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

[root@iptables1 ~]# systemctl stop firewalld 
[root@iptables1 ~]# systemctl disable   firewalld 

[root@iptables1 ~]# systemctl start iptables 
[root@iptables1 ~]# systemctl enable iptables 
[root@iptables1 ~]# systemctl status iptables.service 


#查看filter表中的规则 ,默认查看的是filter表 

[root@iptables1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)			#INPUT链默认规则
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     

#查看指定表中的规则
[root@iptables1 ~]# iptables  -t nat -nL 
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
```

## iptables命令参数

![img](https://pic1.zhimg.com/80/v2-22f97b4aa6e00ef89088dde62c302838_1440w.webp)

![img](https://pic4.zhimg.com/80/v2-b874aa849c2fa91218203fa506ec19a3_1440w.webp)

![img](https://pic4.zhimg.com/80/v2-558300ef17a3ac0562fe3295620f635b_1440w.webp)

![img](https://pic2.zhimg.com/80/v2-679b934db157c35ff9060bf63a35f935_1440w.webp)

![img](https://pic4.zhimg.com/80/v2-f886fbc9cc916a666ff0826b6888d2ff_1440w.webp)

## ***配置filter表规则\***

在正式配置前，先备份，清空规则

```text
[root@iptables1 ~]# iptables -F 
[root@iptables1 ~]# iptables -X
[root@iptables1 ~]# iptables -Z

[root@iptables1 ~]# iptables -nL 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

### **禁止访问22端口**

```text
#拒绝用户访问22端口 
iptables -t filter  -A  INPUT   -p tcp --dport 22 -j DROP		#指定端口，一定要加-p协议
请截图

#查看规则并加上序号
iptables -t filter  -nL   --line-number 

请截图
#删除规则
iptables -t filter  -D INPUT  1   #根据序号删除
```





### **封ip 屏蔽某个ip**

```text
[root@iptables1 ~]# iptables -I INPUT  -s 192.168.245.180   -j DROP 
[root@iptables1 ~]# 
[root@iptables1 ~]# iptables -nL   
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  192.168.245.160      0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination      


```

### **禁止网段连入(禁止192.168.245.0/24网段访问 8888端口)**

```text
iptables -I INPUT  -s 192.168.245.0/24  -p tcp  --dport 8888  -j DROP
```





### **只允许指定网段连入(允许192.168.245.0网段)**

```text
#方法1: 利用 !  进行排除 

#只准许 192.168.245.0/24 访问  言外之意   除了 192.168.245.0/24  都拒绝 
iptables -I INPUT ! -s 192.168.245.0/24  -j DROP
```



```text
#方法2:  修改链默认规则  修改为拒绝  添加准许
先配置好规则 准许规则
修改默认规则
       
[root@iptables1 ~]# iptables -A  INPUT   -s 192.168.245.0/24   -j  ACCEPT 
[root@iptables1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  192.168.245.0/24          0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@iptables1 ~]# iptables -P INPUT DROP                #修改默认规则 
[root@iptables1 ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.245.0/24          0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

此时ping还能继续，因为会匹配
ACCEPT     all  --  192.168.245.0/24          0.0.0.0/0 
不会往下读默认规则

[root@iptables1 ~]# iptables -D INPUT 1
[root@iptables1 ~]# iptables -P  INPUT  ACCEPT


```



### **指定多个端口**

```text
[root@iptables1 ~]# iptables -I  INPUT  -p tcp --dport 8888   -j DROP 
[root@iptables1 ~]# iptables -I  INPUT  -p tcp --dport 9999   -j DROP 
[root@iptables1 ~]# iptables -nL 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9999
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

#指定多个端口  
-m multiport   -p tcp   --dport 80,443  


#白名单，除了80，443端口可以访问，其它全拒绝
iptables  -A INPUT   -m multiport -p tcp  --dport 80,443  -j  ACCEPT 
iptables -nL 

#如果是 连续的端口  可以不加上-m multiport   1:1024 
iptables  -A INPUT    -p tcp  --dport 1:1024   -j  ACCEPT 



```























