【iptables】防火墙详解~

853 阅读22分钟

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

image.png

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(分摊流量)

image.png

2.4 包过滤的工作层次:

  • 主要是网络层,针对ip数据包
  • 体现在对包内的ip地址、端口等信息的处理上

image.png

小拓展:内核空间和用户空间:

  • 内核空间:内核空间大,是无法控制的区域,超过用户权限的部分
  • 用户空间:用户空间小,是可以控制的区域,用户权限范围内

内核空间包含用户空间。

3、iptables 语法格式⭐⭐

小tips:启动iptables前,要先把firewallld关掉!

image.png

 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代表回复包

image.png

实验:

实验目的: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...]   星期几,17 分别表示星期一到星期日
 --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模块,用户访问有问题,查看日志发现如下错误:

image.png

 `解决方法:`
 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

网络防火墙实验:

image.png

实验环境:

7-1 外网

7-4 网关服务器

7-2和7-3 内网

实验目的:内网可以访问外网,但外网不可以访问内网。

实验步骤:

  1. 设置内网设备,创建访问网页:
 `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
  1. 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不通的,会报错拒绝连接。
  1. 配置网关:
 `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
  1. 设置外网服务器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   //这个时候就会断掉或者卡死
 然后将网卡模式改为仅主机模式!
  1. 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
  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选项:

MASQUERADE:基于nat表的target,适用于动态的公网IP,如:拨号网络

MASQUERADE选项:

  • to-ports port[-port]
  • random

6.1.1 SNAT实验:

image.png

实验目的:内网可以访问外网,并且在外网中的日志看到的是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

实验步骤:

  1. 设置内网
 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
  1. 设置外网
 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
 并将网卡设置为仅主机模式!
  1. 设置网关服务器
 *****添加网卡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
  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
  1. 内网访问外网
 [root@7-3 ~]#  curl 12.0.0.100
 7-1 7-1
  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实验:

image.png

实验目的:使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
  • 记得重启网络
  • 记得开机自启