Iptables防火墙详解

1.防火墙种类及使用说明

1.1 防火墙种类

  • 硬件 【访问量巨大可以选硬件防火墙】

    • 三层路由器:H3C 华为 Cisco(思科)

    • 深信服

  • 软件 【推荐iptables,大部分场景都 可用】

    • iptables 【写入到linux内核中】

    • firewalld 【从CentOS 7开始】

  • 云防护墙 【公司使用的公有云,推荐使用这些服务】

    • 阿里云:安全组(部分的iptables功能),态势感知(云安全中心)

    • 阿里云:安全组

1.2 防火墙的作用和目标

  • # 防火墙的作用
    1.网站入口的安全防护机制. 数据的过滤工具
    2.符合规则的可以进入
    3.不符合的,拒绝在外
    ​
    # 防火墙的目标
    通过iptables实现对ip或端口开启或禁止
    通过防火墙nat功能实现:共享上网
    通过防火墙nat功能实现:端口映射

2.iptables防火墙基础

  • 防火墙处理用户请求的流程

  • 四表五链

2.1 iptables防火墙基本名词

  • 1.容器: 瓶子 罐子 存放东西
    2.表(table): 存放链的容器,防火墙最大概念
    3.链(chain): 存放规则的容器
    4.规则(policy): 准许或拒绝规则 ,未来书写的防火墙条件就是各种防火墙规则
  • Netfilter表(tables)链(chains)规则(Policy)
    一栋楼楼里的房子房子里的柜子柜子里衣服,摆放规则

2.2 防火墙如何处理用户请求的规则

  • 工作流程小结:
    1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的
    2. 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配
    新的规则
    3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配
    默认规则得到明确的阻止还是通过
    4. 防火墙的默认规则是所有规则都匹配完才会匹配的。
  • image-20220725155459078

  • image-20220725155542623

2.3 iptables防火墙-四表五链

1. 四表五链
  • 四表filter 表 nat表 raw表 mangle表

  • 五链INPUT OUTPUT FORWARD PREROUTING POSTROUTING

  • 四表五链应用
    filter表INPUT ,OUTPUT ,FORWARD防火墙功能,过滤功能
    nat表PREROUTING,POSTROUTING,OUTPUT共享上网,端口映射
    raw表了解
    mangle表了解
2. 表链的请求关系
  • image-20220725160358889

3. 表的规则
  • image-20220725171059909

3.iptables常用参数与环境准备

3.1 常用参数

  • iptables参数含义
    -t指定表,必须是【filter 表 nat表 raw表 mangle表】中的一个。如果不指定此选项,默认的是 filter 表
    -nL查看表中链与规则
    -I(insert) 把规则插入到所有规则之前。 拒绝类规则
    -A(append) 把规则追加到所有规则之后
    -D删除规则
    -s--source 指定源ip地址
    -d--destination 指定目标ip地址
    -pprotocal 指定协议 tcp,udp,icmp……
    --dport目标端口 (destination)指定端口 加上协议 -p tcp
    --sport源端口 (source) 源
    -m指定模块,multiport模块
    -j指定规则准许,拒绝 ACCEPT,DROP,REJECT
    DROP REJECT拒绝 DROP把数据丢掉 不会返回信息给用户 REJECT 拒绝 返回拒绝信息
    -F清空指定表中所有规则
    -x删除用户自定义链
    -z链的计数器清零(数据包计数器与数据包字节计数器)
    -iinput 输入的时候 从哪个网卡进来
    -oouput 输出的时候 从哪个网卡出去

3.2 iptables环境准备

  • 1.安装iptables管理工具,systemctl管理。
    root@web03 16:38:40 ~ # yum install -y iptables-services
    root@web03 16:53:37 ~ # rpm -ql   iptables-services
    /etc/sysconfig/ip6tables
    /etc/sysconfig/iptables                        # 防火墙的配置文件
    /usr/lib/systemd/system/ip6tables.service
    /usr/lib/systemd/system/iptables.service       # 防火墙服务配置文件(命令)
    ​
    ​
    2.关闭firewalld 
    root@web03 16:40:01 ~ # systemctl stop firewalld 
    root@web03 16:40:01 ~ # systemctl disable firewalld
    ​
    3.启动防火墙并加入开机自启
    root@web03 16:40:01 ~ # systemctl start iptables.service
    root@web03 16:40:42 ~ # systemctl enable iptables.service
    ​
    4.加载防火墙内核选项并写入到开机自启动/etc/rc.d/rc.local
    root@web03 17:01:30 ~ # modprobe ip_tables
    root@web03 17:01:37 ~ # modprobe iptable_filter
    root@web03 17:01:40 ~ # modprobe iptable_nat
    root@web03 17:01:45 ~ # modprobe ip_conntrack
    root@web03 17:01:48 ~ # modprobe ip_conntrack_ftp
    root@web03 17:01:54 ~ # modprobe ip_nat_ftp
    root@web03 17:01:57 ~ # 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
    # 给/etc/rc.d/rc.local可执行权限
    root@web03 17:03:22 ~ # chmod +x /etc/rc.d/rc.local
    ​
    5.检查加载的内容
    root@web03 16:55:08 ~ # lsmod |egrep 'filter|nat|ipt'
    nf_nat_ftp             12809  0 
    nf_conntrack_ftp       18478  1 nf_nat_ftp
    iptable_nat            12875  0 
    nf_nat_ipv4            14115  1 iptable_nat
    nf_nat                 26583  2 nf_nat_ftp,nf_nat_ipv4
    ipt_REJECT             12541  2 
    nf_reject_ipv4         13373  1 ipt_REJECT
    nf_conntrack          139264  7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
    iptable_filter         12810  1 
    ip_tables              27126  2 iptable_filter,iptable_nat
    libcrc32c              12644  3 xfs,nf_nat,nf_conntrack
    ​
    6.查看防火墙当前的规则
    root@web03 17:04:22 ~ #  iptables  -nL
    Chain INPUT (policy ACCEPT)
    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   
    ​
    7.清空规则
    iptables -F #清空指定表中所有规则。
    iptables -X #删除自定义链。
    iptables -Z #清空统计信息。
    root@web03 17:04:29 ~ # iptables -F
    root@web03 17:07:08 ~ # 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    
    ​
    8.书写规则: 
    iptables -t 表名 -A/I/D/R 规则链名/规则号 -i/o 网卡名 -p 协议名 -s 源IP/源子网 -- sport 源端口 -d 目标IP/目标子网 -- dport 目标端口 -j 动作
    ​

4. FILTER表 (iptables默认的表)

4.1 filter表作用

  • 1.不指定任何表的情况下,默认使用filter表 
    2.filter表实现的就是防火墙功能,屏蔽或准许 端口 IP 访问
    3.阿里云安全组,相当于是防火墙的filter表。

4.2 filter表包含的链

  • filter表主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) 【应用:主机防火墙】
    INPUT负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤进入主机的数据包
    OUTPUT处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包
    FORWARD负责转发流经主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍 LVS NAT模式,net.ipv4.ip_forward=0

4.3 filter表实践

1. 禁止用户访问22端口
  • # 禁止用户访问22端口
    root@web03 17:18:40 ~ # iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
    ​
    # 查看防火墙当前的规则
    root@web03 17:07:08 ~ # 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:22       
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination    
    ​
    # 发现Xshell连不上了,需要删除刚才添加的规则
    方法一:
    iptables -t filter -D INPUT 1
    方法二:
    iptables -t filter -D INPUT -p tcp --dport 22 -j DROP
    ​
    # 再次连接Xshell发现可以了
    ​
    ​
2. 禁止IP10.0.0.200访问
  • # 禁止IP10.0.0.200主机访问
    root@web03 17:38:16 ~ # iptables -t filter -I INPUT -s 10.0.0.200/32  -j DROP
    root@web03 17:38:31 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       all  --  10.0.0.200           0.0.0.0/0           
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination    
    ​
    # 用10.0.0.200连接web03的10.0.0.9测试
    root@SSH 17:36:55 ~ # ssh 10.0.0.9               # 发现卡住了不通
    # 再用ping命令测试
    root@SSH 17:45:15 ~ # ping 10.0.0.9
    PING 10.0.0.9 (10.0.0.9) 56(84) bytes of data.   # 发现也不通
    # 测试ping172.16.1.9
    root@SSH 17:46:09 ~ # ping 172.16.1.9            # 发现可以通
    PING 172.16.1.9 (172.16.1.9) 56(84) bytes of data.
    64 bytes from 172.16.1.9: icmp_seq=1 ttl=64 time=0.366 ms
    64 bytes from 172.16.1.9: icmp_seq=2 ttl=64 time=0.345 ms
    ​
    # 清除防火墙规则
    root@web03 17:47:30 ~ # iptables -D INPUT 1
3. 禁止IP10.0.0.200访问22端口
  • # 禁止IP10.0.0.200访问22端口
    root@web03 17:47:57 ~ # iptables -t filter -I INPUT -s 10.0.0.200 -p tcp --dport 22 -j DROP
    # 查看防火墙规则
    root@web03 17:59:32 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       tcp  --  10.0.0.200           0.0.0.0/0            tcp dpt:22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination    
    ​
    # 用10.0.0.200主机 ssh连接 10.0.0.9发现连接不上
    # 删除防火墙规则
    root@web03 18:02:16 ~ # iptables -D INPUT 1
    ​
4. 屏蔽10.0.0.0/24访问8888端口
  • # 屏蔽10.0.0.0/24访问8888端口
    1.先模拟一个8888端口
    root@web03 18:10:31 ~ # yum -y install nc
    --------------------------------------------
    nc ncat netcat    
    nc -l 
    -l 使用监听模式,管控传入的资料
    -v 显示指令执行过程。
    -k 接受多个连接请求
    --------------------------------------------
    root@web03 19:04:20 ~ # nc -l 8888   模拟监听一个8888端口
    root@web03 18:14:11 ~ # netstat -tnulp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name        tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      31818/nc      
    ​
    2.测试8888端口,测试成功
    [c:\~]$ telnet 10.0.0.9 8888
    Connecting to 10.0.0.9:8888...
    Connection established.
    To escape to local shell, press 'Ctrl+Alt+]'.
    oldboy
    haha
    ​
    root@web03 19:04:20 ~ # nc -l 8888
    oldboy
    haha
    ​
    3.屏蔽10.0.0.0/24访问8888端口
    root@web03 19:14:09 ~ # iptables -I INPUT -s 10.0.0.0/24  -p tcp --dport 8888 -j DROP
    root@web03 19:17:13 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       tcp  --  10.0.0.0/24          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
    ​
    4.测试连接,发现连不上了
    [c:\~]$ telnet 10.0.0.9 8888
    Connecting to 10.0.0.9:8888...
    ​
5. 只允许指定网段连入(允许10.0.0.0网段)
  • 1.方法一:这里用到!取反
    # 只允许指定网段连入(允许10.0.0.0网段)
    root@web03 19:42:10 ~ # iptables -I INPUT ! -s 10.0.0.0/24  -j DROP
    root@web03 19:43:10 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       all  -- !10.0.0.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@web03 19:44:32 ~ # ping 172.16.1.9
    PING 172.16.1.9 (172.16.1.9) 56(84) bytes of data.
    root@web03 19:44:54 ~ # ping 10.0.0.9
    PING 10.0.0.9 (10.0.0.9) 56(84) bytes of data.
    64 bytes from 10.0.0.9: icmp_seq=1 ttl=64 time=0.151 ms
    64 bytes from 10.0.0.9: icmp_seq=2 ttl=64 time=0.058 ms
    ​
    ​
    2.方法二:修改匹配默认规则为DROP,只允许10.0.0.0/24的访问规则
    # 添加接受10.0.0.0/24网段访问
    root@web03 19:49:30 ~ # iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT
    root@web03 19:51:28 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     all  --  10.0.0.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     
    ​
    # 修改匹配默认规则为DROP
    root@web03 19:51:29 ~ # iptables -P INPUT ACCEPT
    root@web03 19:53:52 ~ # iptables -nL
    Chain INPUT (policy DROP)
    target     prot opt source               destination         
    ACCEPT     all  --  10.0.0.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@SSH 19:54:47 ~ # ssh 172.16.1.9   无法访问
    root@SSH 19:55:07 ~ # ssh 10.0.0.9     可以访问
    root@10.0.0.9's password: 
    Last login: Mon Jul 25 19:54:42 2022 from 10.0.0.200
    root@web03 19:55:09 ~ # 
6. 只允许10.0.0.200通过22端口访问
  • 1.采用取反的方式允许22端口访问 【先允许再拒绝测试默认匹配顺序】
    root@web03 20:05:42 ~ # iptables -I INPUT -s 10.0.0.200/32  -p tcp ! --dport 22 -j DROP
    root@web03 20:06:25 ~ # iptables -A INPUT -s 10.0.0.200/32  -p tcp  --dport 22 -j DROP
    root@web03 20:06:57 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       tcp  --  10.0.0.200           0.0.0.0/0            tcp dpt:!22
    DROP       tcp  --  10.0.0.200           0.0.0.0/0            tcp dpt:22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination  
    ​
    2.连接测试
    [c:\~]$ telnet 10.0.0.9 22    # 发现连不上了
    Connecting to 10.0.0.9:22...
    ​
    3.结论
      如果用取反的话,下面出现参数相同但是动作相反的规则,还是会继续向下匹配
      如果不用取反的话,则默认按照第一条规则匹配,即使下面有参数相同但是动作相反的规则。
    ​
7. 指定多个端口
  • 1.当允许连接的端口不相邻时
    root@web03 20:56:59 ~ # iptables -I INPUT -p tcp -m multiport --dport 80,443,22 -j ACCEPT
    root@web03 20:58:29 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443,22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination   
    ​
    # 测试均可以连接
    ​
    2.当允许连接的端口相邻时
    root@web03 21:00:23 ~ # iptables -I INPUT -p tcp  --dport 888:999 -j ACCEPT
    root@web03 21:01:40 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpts:888:999
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443,22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    ​
    # 测试链接成功
    root@web03 21:00:25 ~ # nc -l 899
    [c:\~]$ telnet 10.0.0.9 899
    ​
    ​
    Connecting to 10.0.0.9:899...
    Connection established.
    To escape to local shell, press 'Ctrl+Alt+]'.
    ​
    root@web03 21:02:47 ~ # nc -l 999
    [c:\~]$ telnet 10.0.0.9 999
    ​
    ​
    Connecting to 10.0.0.9:999...
    Connection established.
    To escape to local shell, press 'Ctrl+Alt+]'.
    ​
8. 匹配ICMP类型
  • ICMP(Internet Control Message Protocol)Internet控制报文协议 【主要是用来ping测试】

  • 通过防火墙规则 控制是否可以ping

  • 1.设置ICMP规则不让别人ping自己
    root@web03 21:27:21 ~ # iptables -I INPUT  -p icmp --icmp-type 8  -j DROP
    root@web03 21:27:27 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination    
    ​
    2.测试是否可以ping通10.0.0.9
    [c:\~]$ ping 10.0.0.9
    ​
    正在 Ping 10.0.0.9 具有 32 字节的数据:
    请求超时。
    ​
    --------------------------------------------------------------------------------------
    3.设置规则无法ping通外网,但是正常连接上网
    root@web03 22:06:49 ~ # iptables -I INPUT  -p icmp --icmp-type 8  -j DROP
    root@web03 22:10:59 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 0
    DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination    
    ​
    4.测试是否可以ping通www.baidu.com
    root@web03 22:12:06 ~ # ping www.baidu.com
    PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
    # 发现无法ping通www.baidu.com
  • 通过内核参数 控制 禁止被ping

  • 1.通过内核参数控制不让别人ping通自己
    root@web03 22:18:44 ~ # echo  1  >/proc/sys/net/ipv4/icmp_echo_ignore_all 
    root@web03 22:18:44 ~ # net.ipv4.icmp_echo_ignore_all=1 写入到 /etc/sysctl.conf
    2.可以让别人ping通自己
    root@web03 22:18:44 ~ # echo  0 >/proc/sys/net/ipv4/icmp_echo_ignore_all 
    root@web03 22:18:44 ~ # net.ipv4.icmp_echo_ignore_all=0 写入到 /etc/sysctl.conf
9. 匹配网络状态【TCP/IP连接状态】
  • 网络状态参数含义
    -m state --stateNEW已经或将启动新的连接
    ESTABLISHED已建立的连接
    RELATED正在启动的新连接
    INVALID非法或无法识别的
  • # 指定匹配规则,匹配网络状态
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
10. 限制并发及速率
  • -m limit 限制模块

  • -m limit --limit 10/minute     #每分钟只能有10个数据包 每6秒生成
  • -m limit --limit n/{second/minute/hour}: 指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时

  • -m limit --limit 10/minute   --limit-burst 5  每6秒释放工牌 给别人使用 
    ​
    #10个数据包   
    前5个  1个1个工牌   从第6个开始 每6秒 才能释放1个工牌 
  • --limit-burst [n]:在同一时间内允许通过的请求”n”为数字,不指定默认为5

  • # ping  icmp 协议  进行测试
    iptables -I INPUT  -p icmp  -m limit --limit 10/minute    --limit-burst 5   -j ACCEPT 
    iptables -A INPUT  -p tcp  --dport 22 -j  ACCEPT 
    iptables -P INPUT DROP 
    ​
    # ping 测试
    root@SSH 22:16:29 ~ # ping 10.0.0.9 
    PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
    64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.240 ms
    64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.376 ms
    64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.474 ms
    64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.693 ms
    64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=2.43 ms
    64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=0.351 ms    
    64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.869 ms   
    64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.482 ms
    64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.378 ms
    # 前5个一次/s 后面一次/6s
11. 防火墙规则的保存与恢复
  • 命令含义
    iptables-save防火强规则保存【默认输出到屏幕】
    iptables-restore防火强规则导入
  • 重启继续生效需要写入到/etc/sysconfig/iptables文件中

  • 1.将规则带备份导入到配置文件
    root@web03 22:45:12 ~ # iptables -I INPUT -s 172.16.1.0/24  -p tcp --dport 22 -j DROP
    root@web03 22:45:56 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       tcp  --  172.16.1.0/24        0.0.0.0/0            tcp dpt:22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination  
    ​
    2.导入规则到配置文件
    root@web03 22:46:55 ~ # iptables-save >/etc/sysconfig/iptables
    root@web03 22:47:19 ~ # cat /etc/sysconfig/iptables
    # Generated by iptables-save v1.4.21 on Mon Jul 25 22:47:19 2022
    *nat
    :PREROUTING ACCEPT [407:33962]
    :INPUT ACCEPT [127:12818]
    :OUTPUT ACCEPT [166:12418]
    :POSTROUTING ACCEPT [166:12418]
    COMMIT
    # Completed on Mon Jul 25 22:47:19 2022
    # Generated by iptables-save v1.4.21 on Mon Jul 25 22:47:19 2022
    *filter
    :INPUT ACCEPT [93:7420]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [62:6908]
    -A INPUT -s 172.16.1.0/24 -p tcp -m tcp --dport 22 -j DROP  # 规则已写入
    COMMIT
    # Completed on Mon Jul 25 22:47:19 2022
    ​
    3.重启服务,并清空规则
    root@web03 22:48:21 ~ # systemctl restart iptables       
    root@web03 22:48:36 ~ # iptables -D INPUT 1
    root@web03 22:48:47 ~ # 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         
    ​
    4.从备份文件中导出规则
    root@web03 22:48:49 ~ # iptables-restore </etc/sysconfig/iptables
    root@web03 22:50:08 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       tcp  --  172.16.1.0/24        0.0.0.0/0            tcp dpt:22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination       
    # 发现规则又回来了
    ​
    补充:
    也可以拷贝别人的配置文件来导入规则

4.4 filter表小结

1. filter主要作用
  • - 封ip 端口 网段 
    - 禁止ping
    - 限制速度和并发  
    - iptables filter表 功能可以在云服务器使用 
2. filter表企业应用
  • # 在企业中,为了降低网站风险,我们可以把filter表的默认规则由ACCEPT改为DROP,然后再放行我们自己的ip和端口即可,这样别人就无法访问了
    ​
    1.添加允许我们自己的ip和端口范文规则到filter表
    root@web03 23:10:48 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     tcp  --  10.0.0.0/24          0.0.0.0/0            tcp dpt:22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination    
    ​
    2.将默认规则改为DROP
    root@web03 23:10:51 ~ # iptables -P INPUT DROP
    root@web03 23:12:18 ~ # iptables -nL
    Chain INPUT (policy DROP)
    target     prot opt source               destination         
    ACCEPT     tcp  --  10.0.0.0/24          0.0.0.0/0            tcp dpt:22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination    
    ​
    3.这样使用ssh连接就只能通过10.0.0.0段的ip了
    ​
    root@SSH 22:16:29 ~ # ssh 172.16.1.9  # 连接失败
    ^C
    root@SSH 23:13:34 ~ # ssh 10.0.0.9  # 连接成功
    root@10.0.0.9's password: 
    Last login: Mon Jul 25 22:06:41 2022 from 10.0.0.1
    root@web03 23:13:41 ~ # 
    ​
    # 测试完记得改回去
    root@web03 23:14:44 ~ # iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     tcp  --  10.0.0.0/24          0.0.0.0/0            tcp dpt:22
    ​
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    ​
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination
3. 常用规则汇总
  • root@web03 23:14:45 ~ # iptables-save
    # Generated by iptables-save v1.4.21 on Mon Jul 25 23:18:28 2022
    *nat
    :PREROUTING ACCEPT [8:1011]
    :INPUT ACCEPT [4:599]            
    :OUTPUT ACCEPT [10:628]
    :POSTROUTING ACCEPT [10:628]
    COMMIT
    # Completed on Mon Jul 25 23:18:28 2022
    # Generated by iptables-save v1.4.21 on Mon Jul 25 23:18:28 2022
    *filter
    :INPUT ACCEPT [6:521]                
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [22:2022]
    -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT                   # 放行ssh端口 添加来源IP地址              
    -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT        # 放行业务接口
    -A INPUT -i lo -j ACCEPT                                      # 放行回环测试接口
    -A INPUT -s 10.0.0.0/24 -j ACCEPT
    -A INPUT -s 172.16.1.0/24 -j ACCEPT                           # 放心所有内网ip
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A OUTPUT -o lo -j ACCEPT
    -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT      # 根据需求放行状态
    COMMIT
    # Completed on Mon Jul 25 23:18:28 2022   

5.NAT表

5.1 NAT表作用

  • 1.内网服务器共享上网
    2.端口映射/转发

5.2 NAT表包含的链

  • nat表作用应用场景
    PREROUTING用户请求到达防火墙后先经历nat表的PREROUTING链处理,修改请求的ip或端口端口映射/转发
    POSTROUTING用户请求离开防火墙的时候经历nat表的POSTROUTING链处理,修改ip共享上网(无公网服务器访问外网)
    OUTPUT转发出口

5.3 SNAT共享上网

  • image-20220725234049648

1. 内部服务器共享上网原理
  • 使用了防火墙的NAT表的POSTROUTING链对数据包中的源ip进行修改,把数据包中的源ip修改为公网ip

2. 共享上网原理图
  • image-20220726081256202

3. 实战
  • 0.实战要求
      1)web01的网关要设置为web03的防火墙172.16.1.9
      2)关闭web02的eth0网卡
      3)nat表的POSTROUTING链对内网数据进行伪装
      4)开启ip_forword功能,ip转换功能
      
    ------------------------------------------------------------------------------------------------------ 
      
    1.web01主机环境设置
    # 设置web01的eth1网卡网关为web03的内网ip
    root@web01 08:44:46 network-scripts # vim ifcfg-eth1   
    TYPE=Ethernet
    BOOTPROTO=none
    NAME=eth1
    DEVICE=eth1
    ONBOOT=yes
    IPADDR=172.16.1.7
    PREFIX=24
    GATEWAY=172.16.1.9   网关设置为web03的内网ip
    DNS1=223.5.5.5
    ​
    # 关闭web01的eth0网卡
    root@web01 08:44:46 network-scripts # vim ifcfg-eth0   
    TYPE=Ethernet
    BOOTPROTO=none
    NAME=eth0
    DEVICE=eth0
    ONBOOT=no
    IPADDR=10.0.0.7
    PREFIX=24
    GATEWAY=10.0.0.2
    DNS1=223.5.5.5
    ​
    # 重启web01的网卡并查看ip
    root@web01 08:46:10 network-scripts # systemctl restart network
    root@web01 08:48:37 ~ # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
        link/ether 00:0c:29:91:91:2e brd ff:ff:ff:ff:ff:ff
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:91:91:38 brd ff:ff:ff:ff:ff:ff
        inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe91:9138/64 scope link 
           valid_lft forever preferred_lft forever
           
    # 查看路由表
    root@web01 08:48:40 ~ # route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         172.16.1.9      0.0.0.0         UG    0      0        0 eth1
    169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
    172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
    ​
    # ping外网测试
    root@web01 08:52:37 ~ # ping 114.114.114.114
    PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
    # 测试web01已经上不了外网了
    ------------------------------------------------------------------------------------------------------
    ​
    2.web03设置防火墙规则
    # 添加共享上网规则到web03的NAT表
    root@web03 08:58:03 ~ # iptables -t nat -A POSTROUTING  -s 172.16.1.0/24   -j SNAT  --to-source 10.0.0.9
    root@web03 08:58:23 ~ # iptables -t nat -nL  【查看NAT表】
    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         
    SNAT       all  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.9
    ​
    #用户的请求通过nat表的POSTROUTING链进行处理。处理的时候把源ip是172.16.1.0/24网段的ip 都伪装成为10.0.0.9 (修改的是源IP)
    ​
    # 修改防火墙服务器的内核参数开启ip_forward功能
    root@web03 08:59:38 ~ # vim /etc/sysctl.conf
    root@web03 09:06:30 ~ # tail -2 /etc/sysctl.conf
    net.ipv4.icmp_echo_ignore_all = 0
    net.ipv4.ip_forward = 1     # #开启内核转发功能。请求到达eth1网卡,转发到eth0网卡,需要开启内核转发。
    ​
    # 加载内核
    root@web03 09:06:40 ~ # sysctl -p
    net.ipv4.icmp_echo_ignore_all = 0
    net.ipv4.ip_forward = 1
    ​
    3.到web01主机测试是否可以ping通外网
    root@web01 09:06:40 ~ # ping www.baidu.com
    PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
    64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=127 time=12.4 ms
    64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=127 time=11.5 ms
    64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=3 ttl=127 time=12.2 ms
    ​
    # web01可以上网了
4. 小结
  • 1.内网服务器,访问公网的案例
    2.原理:iptables nat表POSTROUTING链实现 SNAT
    3.防火墙开启内核转发,后端节点网关指向防火墙

5.4 DNAT端口转发

1. DNAT端口转发原理
  • 外部用户访问内网服务器或服务端某个端口

  • 1.用户请求到达一个防火墙后,通过nat表的PREROUTING链处理请求
    2.用用户请求的ip+端口(10.0.0.9:9000)转发到某台内网服务期的ip+端口
    (172.16.1.7:22)
2. DNAT端口转发原理图
  • image-20220726093353631

3. 实战
  • 0.实战要求 【连接10.0.0.9的9000端口直接转发到钱2.16.1.7的22端口】
      1)后端这些无公网的服务器,他们的网关要设置为防火墙172.16.1.61
      2)关闭eth0网卡
      3)配置防火墙,nat表的PRETROUTING链对内网数据进行伪装
      4)开启ip_forword功能,ip转换功能
    -------------------------------------------------------------------------------------------------------
    1.web03设置防火墙规则
    root@web03 09:38:57 ~ # iptables -t nat -A PREROUTING -d 10.0.0.9 -p tcp --dport 9000 -j DNAT  --to-destination 172.16.1.7:22
    root@web03 09:44:17 ~ # iptables -t nat -nL
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    DNAT       tcp  --  0.0.0.0/0            10.0.0.9             tcp dpt:9000 to:172.16.1.7:22
    ​
    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         
    SNAT       all  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.9
    ------------------------------------------------------------------------------------------------------
    3.再本地windows连接10.0.0.9:9000测试
    [c:\~]$ ssh 10.0.0.9 9000
    ​
    ​
    Connecting to 10.0.0.9:9000...
    Connection established.
    To escape to local shell, press 'Ctrl+Alt+]'.
    ​
    Last login: Tue Jul 26 09:09:03 2022 from 10.0.0.9
    root@web01 09:45:56 ~ # 
    # 连接成功
    ​
    root@web02 09:47:34 ~ # ssh 10.0.0.9 -p9000
    The authenticity of host '[10.0.0.9]:9000 ([10.0.0.9]:9000)' can't be established.
    ECDSA key fingerprint is SHA256:LbUlfXUR6bxgVQ4caeFc77yXbxJtNMHdElVbXZV3ybg.
    ECDSA key fingerprint is MD5:e8:cf:9d:e8:43:9b:86:2d:52:a4:b9:4d:3b:d7:13:2d.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[10.0.0.9]:9000' (ECDSA) to the list of known hosts.
    root@10.0.0.9's password: 
    Last login: Tue Jul 26 09:45:55 2022 from 10.0.0.1
    root@web01 09:47:51 ~ # 
    # 连接成功
4. 小结
  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值