栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

防火墙编程 - Linux企业级应用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

防火墙编程 - Linux企业级应用


[TOC]

# Netfilter网络框架
防火墙(iptables)基于Netfilter(http://www.netfilter.org/ )实现,它在Linux内核中的一个软件框架,用于管理网络数据包。不仅具有网络地址转换(NAT)的功能,也具备数据包内容修改、以及数据包过滤等防火墙功能。

# 防火墙的备份与恢复
我们来看一下防火墙的备份与恢复,在使用它前建议提前备份这是一个不错的习惯。
1.查看当前规则。
```
iptables -L -nv --line
```
2.通过iptables-save + “>” 将当前iptables规则备份在文件中。
```
iptables-save > iptables.2020.10.1
```
3. 通过iptables-restore命令来恢复之前备份好的防火墙规则。
```
iptables-restore < iptables.2020.10.1
```
# 防火墙编程基础
学习防火墙编程的顺序(Tables(表) -> Chains (链)-> Rules(规则))

## 表与链
火墙(iptables) 分为常用的表和链,先介绍三张表分别为:
* filter 过滤数据
* nat 转发数据
* mangle 数据包打标记

根据每张表的不同常用的链如下:
* INPUT 用于匹配进入的数据包
* OUTPUT 用于匹配出的数据包
* FORWARD 用于匹配转发的数据包
* PREROUTING 用于匹配NAT之前的数据包
* POSTROUTING 用于匹配NAT之后的数据包

## 防火墙数据生命周期流程
![](https://img.kancloud.cn/74/df/74df3126fb81c15b4ee3eddee8400b2c_1422x752.png)

## Filter 表
Filter表主要用户数据包的过滤。

### 操作命令
-A {-C | -D} , -A (append) 追加一条规则到防火墙中; -C (check) 检测一条规则是否存在 ;-D 删除一条规则。
```
# 追加一条规则到防火墙中
iptables -t filter -A INPUT -j DROP
# 删除一条已经存在的防火墙规则
iptables -t filter -D INPUT 1 (规则id,可以通过iptalbes -L -nv --line 查到)
# 确认当前规则是否存在
iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
echo $?
1
iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT
iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
echo $?
0
```
-I 插入规则。
```
iptables -t filter -I INPUT 1 (插入序号)
```
-R 替换规则
-P 设置链的目标规则
-F 清空规则
```
# 清空INPUT链规则
iptables -t filter -F INPUT
# 清空OUTPUT链的规则
iptables -t filter -F OUIPUT
```
-E 修改链名
```
iptables -E 源表名 新表名
```
-Z 清空计数器
```
iptables -Z INPUT
```
-N 创建一个自定义链
```
iptables -N test
```
-X 删除自定义链
```
iptables -X test
```
### 参数
* -p 接协议 udp、tcp、icmp
* -s 接源地址IP或IP段
* -d 接目的地址IP或IP段
* -i 进数据的网卡,如eth0
* -o 出数据的网卡,如eht0

### 扩展匹配
* --dport 通常与-p连用,-p后可以接--dport ,但没有-p 参数无法使用--dpport参数
* --sport 通dport相同
* --tcp-flag 如 SYN, ACK, FIN, RST
* --mac-source 匹配硬件地址
* --limit 可赋的值有'/second', '/minute', '/hour', or '/day'这样的单位,默认是3/hour
* --limit-burst number 匹配最大值
* --multiport 可以将多个规则转为一个规则

### owner
* --uid-owner uid 通常用于OUPUT表出数据的uid控制
* --gid-owner gid 通常用于OUTPUT表出数据的gid控制
* --sid-owner seessionid  通常用于OUTPUT表数出数据的会话控制

### 状态防火墙
--state state 可能的状态是:INVALID表示包是未知连接,ESTABLISHED表示是双向传送的连接,NEW 表示包为新的连接,否则是非双向传送的,而RELATED表示包由新连接开始,但是和一个已存在的连接在一起,如FTP数据传送,或者一个ICMP错误。

### IP数据包打标签
--tos tos 这个参数可以是一个标准名称,(用iptables -m tos -h 察看该列表),或者数值

### 日志记录
* --log-level level 
* --log-prefix prefix 
* --log-tcp-sequence 
* --log-tcp-options

### Filter表综合案例
**案例1**
允许本服务器的80、443和22对外提供访问,同时支持icmp协议。
```
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A INPUT -j DROP
```
升级一下规则:
* 22端口只准许202.106.184.183这个服务器访问
* 支持本地回环访问
* 将80和443规则合并为1条提高效率
* 支持状态防火墙

```
iptables -F
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p -s 202.106.184.183 tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A INPUT -j DROP
```
**案例2**
1.准许某个网段访问。
```
iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT
```
2.禁止icmp协议。
```
iptables -A INPUT -p icmp -j DROP
```
3.如果你的网络中有两块网卡分别为eth0和eht1,可以限制指定网卡访问的IP。
```
如果你的网络中有两块网卡分别为eth0和eht1 ,可以限制指定网卡访问的IP
```
4. 很多网络攻击都会尝试用黑客自定义的非法数据包进行尝试,我们可以使用如下命令来丢弃无效数据包。
```
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
```
5. 清理INPUT链规则。
```
iptables -A INPUT -F
```
6. 端口转发,将80端口数据包转发到8989端口上。
```
iptables -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8989
```
7.对ping本服务器的icmp报进行限制。
```
ping 106.53.60.21 -l 100 -c 100
iptables -A INPUT -p icmp -m limit --limit 5/sec --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
```
每秒钟5个包,最高5个包以下为测试数据结果。

8.防止syn flood攻击。
```
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
```

## NAT 表
NAT为转发数据表,以下为相关链的数据流向:
* 入站顺序:PREROUTING→INPUT
* 出站顺序:OUTPUT→POSTROUTING
* 转发顺序:PREROUTING→FORWARD→POSTROUTING

### NAT数据转发案例
我们来配置一个NAT转发的案例。
```
# 临时
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久
vi /etc/sysctl.conf
net.ipv4.ip_forward=1

# 清空转发表规则
iptables -t filter -A FORWARD -F

# 172.16.16.18 为主机公网对应的内网IP, 172.16.32.10 为内网MySQL的IP
iptables -t nat -A PREROUTING -d 172.16.16.18 -p tcp --dport 7788
-j DNAT --to-destination 172.16.32.10:3306

# 反过来写
iptables -t nat -A POSTROUTING -d 172.16.32.10 -p tcp --dport 3306
-j SNAT --to-source 172.16.16.18
```

## Mangle 表
Mnangle表主要用于数据包的打标签,我们来看两个案例:

### 端口打标签案例
对不通的端口进行数据包打标签,并按照端口的特性对网络使用有优先权限。
```
iptables -A PREROUTING -t mangle -p tcp --dport telnet -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --dport ftp -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --dport ftp-data -j TOS --set-tos Maximize-Throughput
```

### 数据包打标签案例
通过TTL值来伪装服务器。当黑客在攻击你的服务器前首先要判断服务器的操作系统,判断操作系统最简单方式就是通过TTL值,以下通过iptables来伪装的TTL值,以实现隐藏操作系统的目的。
```
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 128
```
Linux系统返回TTL值为64 , Windows的TTL值返回为128 。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/213706.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号