1、防火墙简介
1.1 netfilter 真正的防火墙
netfilter 网络过滤,是真正的防火墙。
查看防火墙版本:
iptables --version
小拓展:防火墙和防水墙
- 防火墙:防止外部入侵内部
- 防水墙:(data lock protect)的简称,防止内部信息泄露到外部
1.2 防火墙工具
- iptables 三个里 最难
- firewalld 三个里 中度 有图形界面
- nftables 三个里 最简单
1.3 防火墙分类
-
按保护范围划分:
- 主机防火墙: 服务范围为当前一台主机,也就是单机防火墙。
- 网络防火墙:服务范围为防火墙一侧的局域网,可以服务多台主机设备。
-
按实现方式划分:
- 硬件防火墙:有图形化界面,操作方便,因为要花钱。
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件。
-
按七层模型划分:
-
网络层(四层)防火墙:OSI模型下四层,又称为包过滤防火墙。
- 速度快,但是功能少。
- 根据协议、端口号、ip、mac四个过滤数据包。
- 四层无法向上兼容。
-
应用层(七层)防火墙:proxy 代理网关,OSI模型七层
- 速度慢,但是功能多。
- 根据协议、端口号、ip、mac、真实数据五个过滤数据包。
- 七层可以向下兼容。
-
小拓展:2、3、4层模型的原理
- 2层原理:根据mac地址转发
- 3层原理:根据ip地址转发
- 4层原理:根据协议、端口号转发
2、四表五链⭐⭐
表中有链,链中有规则
- 表的作用:规定了具体的功能,如何处理数据包
- 链的作用:链是规则的集合,容纳管理存放各种防火墙规则。 规则就是判断是否可以通过,分为通过 和 不通过
- 规则作用:对数据包进行过滤和处理。 规则是立即生效!!!
2.1 四表
| 表名 | 功能 |
|---|---|
| raw | 是否跟踪数据流量 |
| mangle | 是否标记数据流量 |
| nat | 地址转换 PREROUTING、POSTROUTING |
| filter(用的最多) | 过滤数据流量,决定数据是否通过。input、output、forward |
2.2 五链 chain
五个勾子函数,也就是五链。
通式:
iptables -t 表 链 规则(过和不过)
| 链名 | 含义 | 备注 |
|---|---|---|
| INPUT | 处理入站数据包,也就是处理需要进入本机的流量 | 数据过滤 |
| OUTPUT | 处理从本机出去的流量 | 数据过滤 |
| FORWARD(转发) | 在数据转发前,处理需要被本机转发的流量 | 数据过滤 |
| PREROUTING | 在路由选择前 进行处理 ,判断过还是不过,(一般不会在这个地方进行处理。 | 数据转换 |
| POSTROUTING | 处理路由选择后的数据包,明确是给自己还是给别人的数据后,处理数据包 | 数据转换 |
filter表 和 INPUT链组合起来使用,意思是:只有进入本机的数据会被过滤。
服务器A 收到数据包的两种情况:
- 直接给服务器A
- 需要服务器A,转发给B
2.3 三种报文流向:
- 流入本机:PREROUTING --> INPUT--> 用户空间进程(访问我的服务)
- 流出本机:用户空间进程 --> OUTPUT--> POSTROUTING(穿过我)
- 转发 :PREROUTING --> FORWARD --> POSTROUTING(分摊流量)
2.4 包过滤的工作层次:
- 主要是网络层,针对ip数据包
- 体现在对包内的ip地址、端口等信息的处理上
小拓展:内核空间和用户空间:
- 内核空间:内核空间大,是无法控制的区域,超过用户权限的部分
- 用户空间:用户空间小,是可以控制的区域,用户权限范围内
内核空间包含用户空间。
3、iptables 语法格式⭐⭐
小tips:启动iptables前,要先把firewallld关掉!
iptables -vnL --line-numbers //-vnL的默认规则是允许
3.1 table
| 选项 | 含义 |
|---|---|
| -t | 指定表,默认的表是filter。所以-t filter 可以省略 |
3.2 command 管理选项
| 选项 | 含义 |
|---|---|
| -v | 显示更详细的信息 |
| -n | 以数字形式显示 |
| -L | 防火墙里的规则列表,L必须在最后 |
| -A | 追加,后面跟链名,一般是INPUT链或者FORWARD链 |
| -I | 插入,-I后面加链名 和 编号 |
| -D | 删除,后面也是加链名 和 编号 |
| -R | 替换 |
| -F | 清空 |
| -E | 重命名自定义链 |
| -N | 新建自定义链 |
| -X | 清空自定义链,不影响其他规则 |
| -P(大P) | 指定默认规则 iptables -P OUTPUT ACCEPT |
iptables -vnL //查看规则
iptables -vnL --line-numbers //查看规则,并显示规则的顺序号。
3.3 匹配条件
3.3.1 协议匹配
| 选项 | 含义 |
|---|---|
| -p(小p) | 指定协议,tcp协议或者udp协议,如果没有规定协议,就是指所有协议 |
3.3.2 地址匹配
| 选项 | 含义 |
|---|---|
| -s | 指定源地址 |
| -d | 指定目标地址 |
3.3.3 接口匹配
| 选项 | 含义 |
|---|---|
| -i | 指定入站网卡(静态网卡) |
| -o | 指定出站网卡(数据网卡) |
3.3.4 端口号匹配
| 选项 | 含义 |
|---|---|
| - - sport | 指定源端口 |
| - -dport | 指定目标端口 |
3.4 target 跳转
-j 后面必须是大写!
| 选项 | 含义 |
|---|---|
| -j ACCEPT | 允许 数据包通过 |
| -j DROP | 直接丢弃,已读不回 |
| -j REJECT | 拒绝 |
| LOG | 在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则 |
| SNAT | 修改数据包的源地址 内网可以上外网 |
| DNAT | 修改数据包的目的地址 外网可以上内网 |
| -j MASQUERADE | 伪装 |
小拓展:
prot 协议
port 端口
抓包:
tcpdump -i ens33 host 192.168.125.xxx -nn //-nn以数字形式显示。
4、iptables 增删改查⭐⭐
通式:
iptables -t 表名 -[AIDR] 链名 规则(-s源地址) -j 处理动作(允许、拒绝、丢弃)
4.1 增加规则
iptables -t filter -A INPUT -s 192.168.125.0/24 -j REJECT
基本的语法:意思是来源于192.168.125.0 段的所有数据包都拒绝,如果后面是DROP,那就是都丢弃。
4.2 插入规则
iptables -t filter -I INPUT 1 -s 192.168.125.0/24 -j DROP //-I INPUT 1 是在第1行插入
注意:iptables的规则是立即生效。
4.3 删除规则
`删一条规则:` -D
iptables -t 表 -D 链名 编号 //只删除一条
`删全部规则:` -F
iptables -t 表 -F 清空 //删除所有规则
iptables -t filter -D INPUT 2 //删除第二条规则
注意:删除的话,一定要指定表,不指定表,就默认删除整个表。
--上述的增删改查都是临时性的。
4.4 指定默认规则
默认策略的控制类型为 ACCEPT(允许),-P后面不支持REJECT
iptables -P INPUT DROP //设置默认规则是已读不回
默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。
4.5 黑名单和白名单
- ACCEPT:默认是黑名单;
- DROP: 默认是白名单。
小拓展1:
- 白名单:默认不允许,加到名单里才允许;
- 黑名单:默认全允许,加到名单里才不允许。
白名单相对安全,设置规则时,尽量使用白名单。
小拓展2:
添加回环网卡:
iptables -A INPUT -i lo -j ACCEPT //-i 是指定入站网卡,lo是回环地址
添加回环地址,默认本机所有地址 都可以通
5、规则匹配
都是四层:只能通过协议和端口设置防火墙规则。
规则匹配:
-
通用匹配:不需要调用iptables模块
-
扩展匹配
- 隐式匹配:模块名和协议名相同时,可以省略模块名
- 显式匹配:必须要加模块名
5.1 通用匹配
| 选项 | 含义 |
|---|---|
| -p | 协议名,比如icmp、tcp、ssh协议(22端口) |
| -m | 模块名 |
--sport | 源端口,匹配报文源端口 |
--dport | 目的端口,匹配报文目标端口 |
| -s | 源地址 |
| -d | 目的地址 |
| -i | 入站网卡,只应用于PREROUTING INPUT FORWARD链 |
| -o | 出站网卡,只应用于FORWARD OUTPUT POSTROUTING链 |
| ! -p | 表示取反 |
端口连续范围:
--sport 1000 //s是源 port是端口,意思为匹配端口为1000的数据包
--sport 1000:3000 //匹配源端口是1000-3000的数据包
--sport :3000 //匹配源端口是3000及以下的数据包
--sport 1000: //匹配源端口是1000及以上的数据包
示例:拒绝源ip为 192.168.125.100的设备 ping本机
[root@7-3 ~]# iptables -A INPUT -p icmp -s 192.168.125.100 -j REJECT //ping用的是icmp协议
5.2 扩展匹配 ⭐⭐
man iptables-extensions
查看扩展帮助
5.2.1 隐式匹配
5.2.1.1 tcp协议
-m 模块名 -p 协议名
-m tcp -p tcp //模块名和协议名重复时,可以省略模块名
示例:拒绝源地址为192.168.125.120的设备,访问本机的80端口
[root@7-1 ~]# iptables -A INPUT -m tcp -p tcp --dport 80 -s 192.168.125.120 -j REJECT //拒绝源地址为192.168.125.120的设备,访问我的80端口
*****同样也可以在OUTPUT链上,设置规则,达到上面的效果:
[root@7-1 ~]# iptables -A OUTPUT -p tcp --sport 80 -d 192.168.125.100 -j REJECT //对应修改链名、端口、地址,但尽量不要这么设置,因为在OUTPUT上设置,消耗资源。
示例:检查tcp 的控制位(控制位一共6位)
主要分为3部分:
(1) (2) (3)
--tcp-flags SYN,ACK,FIN,RST SYN //第一次握手。表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK //第二次握手
拆分第(3)部分:有就是1、没有就是0
SYN //有控制位,后面不写,就默认等于1,也就是SYN=1;其余没写的,就默认等于0
SYN,ACK //就是SYN=1、ACK=1 另外没写的FIN=0、RST=0
ALL ALL //意思为 所有的控制位都等于1
ALL NONE //意思为 所有的控制位都等于0
5.2.1.2 icmp协议
格式:
--icmp-type 8 //8代表请求包
--icmp-type 0 //0代表回复包
实验:
实验目的:7-1能ping通7-2,但7-2ping不通7-1
实验环境:
7-1 192.168.125.100
7-2 192.168.125.120
实验步骤:7-1拒绝7-2的请求包(type 8),但不拒绝7-2的回复包(type 0)
7-1:
iptables -F //可以先把之前的规则清空,以防出不来实验效果。但是生产环境中慎用该命令!!!
iptables -A INPUT -p icmp --icmp-type 8 -s 192.168.125.120 -j DROP
*****如果在OUTPUT链上加规则:
iptables -A OUTPUT -p icmp --icmp-type 0 -d 192.168.125.120 -j DROP //OUTPUT是要回复给7-2的包,那么120就是回复包的目标地址,所以要用-d
小总结:
INPUT链 对应 -s源地址
OUTPUT链 对应 -d目的地址
5.2.2 显示扩展模块
显示匹配 必须使用-m选项,指明要调用的扩展模块名称,需要手动加载扩展模块。
[-m matchname [per-match-options]]
5.2.2.1 multiport 扩展
以离散方式定义多端口匹配,最多指定15个端口 混合端口
多个端口之间用逗号隔开
-m multiport --dports 22,80 //指定multiport模块,目标端口是22和80
示例:
iptables -A INPUT -p tcp -m multiport --dports 22,80 -s 192.168.125.120 -j REJECT
//拒绝ip为192.168.125.120 访问当前机器的tcp22和80端口
小拓展:redis
端口号6379
bind 0.0.0.0 //允许任意ip地址
5.2.2.2 iprange 模块
指明连续的ip地址范围(但一般不是整个网络)
--src-range from[-to] 源IP地址范围
--dst-range from[-to] 目标IP地址范围
`!是取反`
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
`格式:`
-m iprange --src-range 192.168.125.125-192.168.125.130
示例:
iptables -A INPUT -m iprange --src-range 192.168.125.125-192.168.125.130 -j REJECT //拒绝源地址为192.168.125.125到130的ip访问当前主机
5.2.2.3 mac 模块
mac模块,可以指明源mac地址,适用于:PREROUTING、FORWARD、INPUT链
-m mac --mac-source XX:XX:XX:XX:XX:XX //源mac,没有目的mac
示例:
iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j REJECT
5.2.2.4 string 字符串
对报文中的应用层数据 做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法
--from offset 开始查询的地方
--to offset 结束查询的地方
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
例子:
后面跟的是真实数据。
–algo 字符串匹配检测算法
- bm
- kmp
--from offset 开始查询的地方
--to offset 结束查询的地方
小拓展:
完整的数据包分为:mac头部+ip头部+tcp/udp端口+真实数据+校验位
string字符串对应的是真实数据! 跳过前面三部分,大概62字节。
示例:
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "cxk" -j REJECT //--from 62 是跳过前62字节
//注意 请求的包不带字符,回复的包带字符 所以要 output
什么要在OUTPUT链上做规则:
因为客户端的请求包里 是没有东西的,但是回复包里,一定是本机确实存在的东西,才会回复给客户机,所以通过OUTPUT链。
5.2.2.5 time 模块
根据将报文到达的时间 与指定的时间范围进行匹配(centos8有bug,ubuntu没问题)
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 时间
--timestop hh:mm[:ss]
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几,1 – 7 分别表示星期一到星期日
--kerneltz:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
示例:
iptables -A INPUT -m time --timestart 3:00 --timestop 8:00 -j REJECT
如何破解上面的防火墙策略?
date -s '+10 hours' //修改时间,不在上述的起始时间范围内即可
小拓展1:如何查看格林威治时间(UTC时间)
date -u
5.2.2.6 connlimit 扩展
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N //连接的数量小于等于N时匹配
--connlimit-above N //连接的数量大于N时匹配
示例:
模拟攻击:
[root@localhost3 ~]# gcc flood_connect.c -o flood //编译安装 黑客文件
[root@localhost3 ~]# ./flood 192.168.125.100 //运行黑客脚本
[root@localhost 7-1]# ss -natp |grep 80
[root@localhost1 ~]# iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 5 -j REJECT //设置超过5次就拒绝
小拓展:limit 限制流量
--limit-burst number //前多少个包不限制
5.2.2.7 state⭐⭐
状态类型:
| 状态 | 含义 |
|---|---|
| NEW | 第一次访问的新用户 |
| ESTABLISHED | 老用户 |
| RELATED | 新发起的 但与已有连接相关联的连接 |
| INVALID | 无效的连接 |
| UNTRACKED | 未进行追踪的连接 |
格式:
-m state --state NEW
-m state --state ESTABLISHED
示例1:老用户可以继续访问,拒绝新用户的访问
iptables -A INPUT -m state --state NEW(新用户) -j REJECT //拒绝所有访问本机的新用户
iptables -A INPUT -m state --state ESTABLISHED(老用户) -j ACCEPT //允许所有访问本机的老用户
示例2:7-1可以访问7-2,但7-2不可以访问7-1
7-1:
iptables -A INPUT -s 192.168.125.120 -m state --state NEW -j REJECT
示例3:故障案例
启用了state模块,用户访问有问题,查看日志发现如下错误:
`解决方法:`
cat /proc/sys/net/netfilter/nf_conntrack_max //可能是参数设置的太小
echo 65536 > /proc/sys/net/netfilter/nf conntrack max //将值调大,设置为65536
小拓展:开启路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
5.3 永久保存防火墙规则
iptables防火墙的规则是临时性的。
5.3.1 save 永久保存
`保存规则:`
iptables-save //打印策略,输出在屏幕上
iptables-save > 文件名 //打印策略,并输出到指定的文件夹
`加载规则:`
iptables-restore < 文件名 //重新导入策略
小拓展:save的保存和加载规则,如何实现开机自启?
`方法1:`
vim .bashrc //只对当前用户生效。比如当前用户是root,但如果切换到用户zhangsan,该规则就会消失。
`方法2:`
vim /etc/rc.d/rc.local //写入后全局生效,但是必须要加执行权限(+x)
iptables-restore < 文件名
`方法3:`
vim /etc/profile //将上面重定向的命令写入到该文件
5.3.2 iptables-services
[root@7-1 ~]# yum -y install iptables-services //安装软件,防火墙工具
[root@7-1 ~]# rpm -ql iptables-services //查询配置文件列表
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables⭐ //这个比较重要,里面存放的是默认策略
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init
[root@7-1 ~]# cp /etc/sysconfig/iptables{,.bak} //备份
[root@7-1 ~]# systemctl enable --now iptables.service //开机自启
5.4 自定义链
自定义链不能直接运行, 自定义链类似于规则的集合,相当于是一个别名,需要调用才能生效。自定义的链 也默认存放在filter表中。
| 选项 | 含义 |
|---|---|
| -N | 新建自定义链 |
| -E | 重命名自定义链,修改自定义链的名称 |
| -X | 清空自定义链,不影响其他规则 |
`新建自定义链:`
iptables -N database //新建自定义链名称为database
`重命名自定义链:`
iptables -E database DB //将自定义链database,改名为DB
`删除自定义链:`
iptables -X DB //将自定义链DB删除
iptables -vnL //查看防火墙规则
如何使用自定义链:
`7-2`
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# cd /var/www/html
[root@localhost html]# echo "123123" > index.html //创建网页
`7-1`
[root@localhost ~]# curl 192.168.125.120
123123
`7-2`
[root@localhost html]# iptables -F
[root@localhost html]# iptables -N DB //新建自定义链
[root@localhost html]# iptables -A DB -p tcp -m multiport --dport 80,443 -j DROP //自建的自定义链定义规则,但是规则并没有生效
[root@localhost html]# iptables -A INPUT -s 192.168.125.100 -j DB //必须要调用。借助INPUT链,跳转到DB,自定义才可以生效。
5.5 网络防火墙
前面讲的都是单机防火墙。
网络防火墙 对比单机防火墙,是把规则作用在FORWARD链上,单机是在INPUT链。
iptables -A INPUT -i lo -j ACCEPT //允许所有通过本地回环接口 进入的流量
iptables -A OUTPUT -o lo -j ACCEPT //允许所有从本地回环接口 出去的流量
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,873,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,873,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,3389 -j DROP
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
网络防火墙实验:
实验环境:
7-1 外网
7-4 网关服务器
7-2和7-3 内网
实验目的:内网可以访问外网,但外网不可以访问内网。
实验步骤:
- 设置内网设备,创建访问网页:
`7-2`
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname 7-2;echo "7-2 7-2" > /var/www/html/index.html //先安装、再开启、修改主机名、生成网页文件
[root@7-2 ~]# systemctl start httpd
`7-3`
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname 7-3;echo "7-3 7-3" > /var/www/html/index.html
[root@7-3 ~]# systemctl start httpd
- 7-1测试访问,看是否有问题
`7-1`
[root@7-1 ~]# curl 192.168.125.10
7-2
[root@7-1 ~]# curl 192.168.125.130
7-3
//用7-1 测试,如果上面没有开启httpd,是ping不通的,会报错拒绝连接。
- 配置网关:
`7-2`
[root@7-2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@7-2 ~]# systemctl restart network
`7-3`
[root@7-3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@7-3 ~]# systemctl restart network
`7-4`
设置ens33网卡的网关:
[root@7-4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.125.140 //设为自己
[root@7-4 ~]# cp -a /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
添加ens36网卡,并设为仅主机模式
[root@7-4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
NAME=ens36
DEVICE=ens36
IPADDR=12.0.0.1 //将ens36网卡的ip,改为外网
GATEWAY=12.0.0.1
[root@7-4 ~]# systemctl restart network
- 设置外网服务器7-1
`7-1`
[root@7-1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=12.0.0.100
GATEWAY=12.0.0.1
[root@7-1 ~]# systemctl restart network //这个时候就会断掉或者卡死
然后将网卡模式改为仅主机模式!
- 7-4添加路由转发功能:为什么要在网关处设置开启路由转发?因为服务器默认是不作为路由使用的,若想要使用路由功能,需要对其进行设置,开启转发功能。
`7-4`
[root@localhost ~]# sysctl -a | grep ip_forward //查看内核参数,并过滤
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens36.stable_secret"
net.ipv4.ip_forward = 0 //只需要这个,复制
net.ipv4.ip_forward_use_pmtu = 0
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 //将0改成1
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
- 在7-4网关处,添加防火墙规则,使7-2和7-3可以访问7-1,但7-1不可以访问7-2和7-3
`7-4`
iptables -A FORWARD -m state --state NEW ! -s 192.168.125.0/24 -d 192.168.125.0/24 -j REJECT //拒绝源地址不是192.168.125.0网段、且目标地址是192.168.125.0网段的设备访问我
小拓展:如何设置防火墙规则,使使7-1可以访问7-2,但不能访问7-3
`7-4`
iptables -I FORWARD -m state --state NEW ! -s 192.168.125.0/24 -d 192.168.125.10 -p tcp --dport 80 -j ACCEPT //允许源地址不是192.168.125.0网段的,访问目标地址为192.168.125.10
小tips: 仅主机模式搭建本地yum仓库⭐
mount /dev/sr0 /mnt
cd /etc/yum.repos.d
mkdir bak
mv *.repo bak
vim local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
yum clean all
yum makecache
通过搭建的本地yum仓库,下载httpd:
yum install httpd -y
systemctl start httpd //不启动的话,访问时会报错!!!
6、NAT
NAT:地址转换技术,network address translation。支持INPUT、OUTPUT、PREROUTING、POSTROUTING4个链
iptables -t nat -vnL //查看nat表 所支持的链名
nat分为:
1、静态nat
2、动态nat
3、easy //前3个 对应的是SNAT
4、nat server //第4个是DNAT
NAT的实现分为下面类型:
- SNAT: 源nat(source NAT),内网可以访问外网,只能在路由选择后,支持POSTROUTING、INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
- DNAT: 目的nat(estination NAT),外网可以访问内网,只能在路由选择前,支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
6.1 SNAT
SNAT:
- 出去的时候,把源ip从内网改成外网;
- 回来的时候,把目的ip从外网改成内网。
SNAT选项:
- to-source ipaddr[-ipaddr]]
- random
MASQUERADE:基于nat表的target,适用于动态的公网IP,如:拨号网络
MASQUERADE选项:
- to-ports port[-port]
- random
6.1.1 SNAT实验:
实验目的:内网可以访问外网,并且在外网中的日志看到的是12.0.0.1网关
实验环境:
7-1 12.0.0.100
7-2 ens33:192.168.125.101 ens36:12.0.0.1
7-3 192.168.125.130
实验步骤:
- 设置内网
7-3:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname 7-3;echo "7-3 7-3" > /var/www/html/index.html
[root@7-3 ~]# systemctl start httpd //开启
[root@7-3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改网关
GATEWAY=192.168.125.101
[root@7-3 ~]# systemctl restart network
[root@7-3 ~]# curl 127.0.0.1 //回环地址,相当于是访问自己
7-3 7-3
- 设置外网
7-1:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname 7-1;echo "7-1 7-1" > /var/www/html/index.html
[root@7-1 ~]# systemctl start httpd //改ip之前,一定要先开启!!!
[root@7-1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改ip地址和网关
[root@7-1 ~]# systemctl restart network
并将网卡设置为仅主机模式!
- 设置网关服务器
*****添加网卡ens36,仅主机模式*****
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改ip地址和网关
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36
[root@localhost network-scripts]# vim /etc/sysconfig/network-scripts/ifcfg-ens36 //修改ip地址和网关
[root@localhost network-scripts]# systemctl restart network
7-2按照新的内网ip,重新连接xshell
开启路由转发:
[root@7-2 ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
[root@7-2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 //添加,并将0改成1
[root@7-2 ~]# sysctl -p
net.ipv4.ip_forward = 1
- 网关设置防火墙规则⭐
7-2:
iptables -F
iptables -t nat -A POSTROUTING -o ens36 -s 192.168.125.0/24 -j SNAT --to 12.0.0.1 //--to的意思是转换。就是将源地址为192.168.125.0段的私网地址 全部转化为网关地址
也可以使用伪装的方式:(与上面规则二选一即可)
iptables -t nat -A POSTROUTING -o ens36 -s 192.168.125.0/24 -j MASQUERADE //伪装成ens36网卡的ip
- 内网访问外网
[root@7-3 ~]# curl 12.0.0.100
7-1 7-1
- 查看日志:
tail -f /var/log/httpd/access_log
6.2 DNAT
格式:
-j DNAT --to 192.168.125.130:8080 //转换为192.168.125.130,8080是端口号,不写的话默认端口号是80
示例:
iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.125.130:8080 //进入ens36网卡,目的地址是12.0.0.1,并且目的端口是80的流量,转换成192.168.125.130的8080端口
6.2.1 DNAT实验:
实验目的:使12.0.0.100 外网机器,访问网关,显示的内网机器的网页。
7-2:
iptables -F
`方法一:`
iptables -t nat -A PREROUTING -d 12.0.0.1 -p tcp --dport 80 -i ens36 -j DNAT --to 192.168.125.130 //从 ens36 网卡进入的流量,目的地址是12.0.0.1的并且访问tcp的 目的端口是80的流量,就替换为 192.168.125.130
`方法二:`
iptables -t nat -A POSTROUTING -s 192.168.125.0/24 -o ens36 -MASQUERADE
7-1:
[root@7-1 ~]# curl 12.0.0.1 //如果报错,显示拒绝连接,可以尝试不设置仅主机模式,全部用nat模式!!!
7-3 7-3 //实验成功
小拓展1:
检验实验结果,需要查看日志:
tail -f /var/log/httpd/access_log
小拓展2:
icmp协议 是3层
arp协议 是2层或者3层
实验避坑指南:
- 打开httpd
- 记得重启网络
- 记得开机自启