IPtables防火墙
基础
安全优化
- 尽可能不给服务器配置外网ip。可以通过代理转发或者通过防火墙映射
- 并发不是特别大情况在外网ip的环境要开启iptables防火墙
OSI7层模型以及不同层对应的协议
TCP/IP三次握手四次断开的过程
常用的服务器端口
简介
Iptables
- 基于包过滤的防火墙工具,可以对流入和流出服务器的数据包进行很精细的控制
- 主要工作在OSI七层的二三四层,重新编译内核可以支持七层控制
工作流程
iptables会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
Client请求数据->IPtables Filter->获取主机Service
- 接收到请求数据后防火墙开始逐层过滤(从上到下,从左到右)
- 如果匹配上规则(明确表明是阻止还是通过),则不再匹配新规则
- 若匹配不上,则继续向下匹配规则
- 所一直匹配不上,则匹配默认规则,得到明确的阻止和通过
表与链
关系
-
表table>链chain>规则policy
-
iptables包含四张表
-
表是链的容器,每个表中包含若干链
-
链式规则的容器,真正的过滤规则是属于链里面的
表\链 Input Forward Output Prerouting Postrouting Filter 1 1 1 0 0 Nat 0 0 1 1 1 Mangle 1 1 1 1 1
各表和链详解
-
Filter:真正的防火墙功能,对filter表的控制是我们实现本机防火墙功能的重要手段,特别是对INPUT链的控制
- INPUT:过滤进入主机的数据包
- FORWORD:转发流经主机的数据包,和NAT关系很大
- OUTPUT:处从主机出去的数据包
-
NAT表:负责网络地址转换,即来源与目的ip地址和port的转换(相当于网络交换机acl)。主要应用于局域网共享上网或者特殊的端口和IP转换服务器,做地址一对一映射(dmz)通过iptables防火墙映射ip到内部服务器,ftp服务
- OUTPUT:和主机发送出去的数据包有关,改变主机发出数据包的目标地址
- PREPOUTING:在数据包到达防火墙进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等【大概就是收信的时候重写收件人的地址】把ip:123.23.3.23->10.0.0.1 端口 80->9000
- POSTPOUTING:在数据包离开防火墙进行路由判断之后执行的规则,作用是改变数据包的源地址、源端口(把pre改了的地址改回来)等【大概是寄信的时候,写好发件人的地址】
-
Mangel表:做一些路由标记
- 不怎么用
-
Raw表
- 基本不用
# 查看表 sudu su
man iptables
```
表和链示意图
【主机服务器防火墙】
|---------------------LOCAL PROCESS------ROUTING
| |
FILTER(INPUT) NAT(OUTPUT)
| FILTER(OUTPUT)
| |
-NAT(PREROUTING)–FORWARD-----------FLTER(FORWARD)------------NAT(POSTROUTING)
[外部ip和端口映射为内部ip和端口] [局域网上网共享]
常用命令
-
查看版本号
iptables -V
-
查看完整信息
iptables -h
-
ubuntu中关于防火墙的命令
#查看防火墙状态 sudo ufw status #开放防火墙 sudo ufw enable #关闭防火墙,inactive为关闭 sudo ufw disable #外来访问默认允许/拒绝 ufw default allow/deny #允许/拒绝 访问20端口,20后可跟/tcp或/udp,表示tcp或udp封包。 ufw allow/deny 20 #ufw从/etc/services中找到对应service的端口,进行过滤。 ufw allow/deny servicename #允许自10.0.1.0/10的tcp封包访问本机的25端口。 ufw allow proto tcp from 10.0.1.0/10 to 本机ip port 25 #删除以前定义的"允许/拒绝访问20端口"的规则 ufw delete allow/deny 20
-
把iptable_filter加载进内核
sudo modprobe iptable_nat
-
清除所有规则留下默认规则
sudo iptables -F
-
清空用户自定义的链
sudo iptables -X
-
清空链的计数器
sudo iptables -Z
-
查看iptable的链
sudo iptables -L
-
查询ssh端口
#第一次使用ssh/scp命令时要先安装ssh服务 sudo spt install openssh-server #查询端口 sudo netstat -lntup|grep ssh
-
操纵链
#-t指定表 -A添加规则到指定链的结尾 -p执行协议 --dport表示对客户端来说是目的 -j执行行为(丢弃接受拒绝) # -I添加规则到指定链的开头 #处理行为 ACCEPT DROP sudo iptables -t filter -A IPPUT -p tcp --dport 52113 -j DROP
-
在 filter 表的 INPUT 链里追加一条规则(作为最后一条规则)匹配所有访问本机 IP 的数据包,匹配到的丢弃
iptables -t filter -A INPUT -j DROP