• 高级运维学习(十三)三表五链


    iptables

    • iptables有多种功能,每一种功能都用一张表来实现
    • 最常用的功能是防火墙和NAT
    • 从RHEL7开始,默认的防火墙为firewalld,但是它的底层仍然调用iptables
    • 安装iptables服务
    1. # 关闭firewalld
    2. [root@node1 ~]# systemctl stop firewalld
    3. [root@node1 ~]# systemctl disable firewalld
    4. # 安装iptables
    5. [root@node1 ~]# yum install -y iptables-services.x86_64
    • iptables的表和链。我们只关心nat表和filter表。filter表是默认的表,它实现防火墙,也就是包过滤的功能。nat表实现网络地址转换。

    防火墙filter表

    • 配置iptables时,不指定表,就是使用filter表
    • 配置时不指定规则链,则配置所有链
    • 可以向规则链中加入很多规则,数据包进入该链时,从上向下匹配,一旦匹配就停止,开始应用规则。如果全都不匹配,则应用默认规则
    • 命令选项、链名、目标操作使用大写字母,其他小写
    filter中的三条链
    • INPUT:数据包的目标地址是自己,则进入INPUT链
    • OUTPUT:数据包的源地址是自己,则进入OUTPUT链
    • FORWARD:数据包穿过自己,则进入FORWARD链

    环境准备
    • client1:eth0 -> 192.168.88.10/24 网关:192.168.88.11
    • node1:eth0 -> 192.168.88.11/24,eth1 -> 192.168.99.11/24
    • server1:eth1 -> 192.168.99.100/24 网关:192.168.99.11
    iptables操作

    常用选项:

    1. -A 追加规则-->iptables -A INPUT
    2. -D 删除规则-->iptables -D INPUT 1(编号)
    3. -R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
    4. -I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
    5. -L 查看规则-->iptables -L INPUT 列出规则链中的所有规则
    6. 通用参数:
    7. -p 协议 例:iptables -A INPUT -p tcp
    8. -s 源地址 例:iptables -A INPUT -s 192.168.1.1
    9. -d 目的地址 例:iptables -A INPUT -d 192.168.12.1
    10. --sport 源端口 例:iptables -A INPUT -p tcp --sport 22
    11. --dport 目的端口 例:iptables -A INPUT -p tcp --dport 22
    12. -i 指定入口网卡 例:iptables -A INPUT -i eth0
    13. -o 指定出口网卡 例:iptables -A FORWARD -o eth0
    14. -j 指定要进行的处理动作
    15. 常用的ACTION:
    16. DROP:丢弃
    17. REJECT:明示拒绝
    18. ACCEPT:接受
    1. # 查看filter表中的规则。-t指定表名
    2. [root@node1 ~]# iptables -t filter -L # 所有规则链都是空的
    3. Chain INPUT (policy ACCEPT) # INPUT链默认规则是接受
    4. target prot opt source destination
    5. Chain FORWARD (policy ACCEPT) # FORWARD链默认规则是接受
    6. target prot opt source destination
    7. Chain OUTPUT (policy ACCEPT) # OUTPUT链默认规则是接受
    8. target prot opt source destination
    9. [root@node1 ~]# iptables -L # 不指定表名,默认操作filter表
    10. Chain INPUT (policy ACCEPT)
    11. target prot opt source destination
    12. Chain FORWARD (policy ACCEPT)
    13. target prot opt source destination
    14. Chain OUTPUT (policy ACCEPT)
    15. target prot opt source destination
    16. # 起动服务时,iptables将会出现一些默认规则
    17. [root@node1 ~]# systemctl start iptables.service
    18. [root@node1 ~]# iptables -L
    19. # 默认规则往往不合我们的要求,可以先将所有的规则清空
    20. [root@node1 ~]# iptables -F
    • iptables的语法
    iptables [-t 表名] 选项 [链名] [条件] [-j 满足条件的操作]
    • 示例

      • 可以设置默认拒绝,然后明确允许
      • 也可以设置默认允许,然后明确拒绝
    1. # 向INPUT链追加规则,192.168.88.254发来的包全部接受
    2. # -A是追加,-s是匹配源地址,-j为jump,采取的行为,ACCEPT是接受
    3. [root@node1 ~]# iptables -A INPUT -s 192.168.88.254 -j ACCEPT
    4. # 将INPUT链的默认规则改为DROP丢弃。-P设置默认规则
    5. [root@node1 ~]# iptables -P INPUT DROP
    6. # 查看INPUT链的规则
    7. [root@node1 ~]# iptables -L INPUT
    8. Chain INPUT (policy DROP)
    9. target prot opt source destination
    10. ACCEPT all -- 192.168.88.254 anywhere
    11. # 在192.168.88.10上访问node1,将会被拒绝
    12. [root@client1 ~]# ping -c2 192.168.88.11
    13. [root@client1 ~]# ssh 192.168.88.11
    14. # 注意,数据通信多数是双向的。现在node1也不能与192.168.88.254以外的其他机器通信,因为数据回不来。
    15. [root@node1 ~]# ping -c2 192.168.88.10 # 失败
    16. # 允许192.168.88.0网络的主机ssh连接node1
    17. # -I是插入到INPUT链的第1个位置。-p指定协议,--dport指定目标端口号。-j是执行的操作
    18. [root@node1 ~]# iptables -I INPUT 1 -s 192.168.88.0/24 -p tcp --dport 22 -j ACCEPT
    19. # 查看规则
    20. [root@node1 ~]# iptables -L INPUT
    21. Chain INPUT (policy DROP)
    22. target prot opt source destination
    23. ACCEPT tcp -- 192.168.88.0/24 anywhere tcp dpt:ssh
    24. ACCEPT all -- 192.168.88.254 anywhere
    25. # 查看规则,n是指用数字来表示端口号、主机等
    26. [root@node1 ~]# iptables -nL INPUT
    27. Chain INPUT (policy DROP)
    28. target prot opt source destination
    29. ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
    30. ACCEPT all -- 192.168.88.254 0.0.0.0/0
    31. # 测试,192.168.88.10已经可以ssh到node1,但是ping不通,因为只允许了ssh
    32. # 配置任何地址访问node180端口,即http协议,都接受
    33. [root@node1 ~]# yum install -y httpd
    34. [root@node1 ~]# systemctl start httpd
    35. # 不指定源,就是任何源
    36. [root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    37. [root@node1 ~]# iptables -nL INPUT
    38. Chain INPUT (policy DROP)
    39. target prot opt source destination
    40. ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
    41. ACCEPT all -- 192.168.88.254 0.0.0.0/0
    42. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
    43. # 拒绝192.168.88.254 ping node1。以下写法不会生效,因为插入到了规则尾部,在它上面已经存在允许192.168.88.254通信的规则了。
    44. # icmp就是ping命令底层用到的协议,叫Internet控制消息协议
    45. [root@node1 ~]# iptables -A INPUT -s 192.168.88.254 -p icmp -j REJECT
    46. [root@node1 ~]# iptables -nL INPUT
    47. Chain INPUT (policy DROP)
    48. target prot opt source destination
    49. ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
    50. ACCEPT all -- 192.168.88.254 0.0.0.0/0
    51. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
    52. REJECT icmp -- 192.168.88.254 0.0.0.0/0 reject-with icmp-port-unreachable
    53. # 查看规则的行号
    54. [root@node1 ~]# iptables -nL INPUT --line-numbers
    55. Chain INPUT (policy DROP)
    56. num target prot opt source destination
    57. 1 ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
    58. 2 ACCEPT all -- 192.168.88.254 0.0.0.0/0
    59. 3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
    60. 4 REJECT icmp -- 192.168.88.254 0.0.0.0/0 reject-with icmp-port-unreachable
    61. # 删除第4条规则
    62. [root@node1 ~]# iptables -D INPUT 4
    63. [root@node1 ~]# iptables -nL INPUT --line-numbers
    64. Chain INPUT (policy DROP)
    65. num target prot opt source destination
    66. 1 ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
    67. 2 ACCEPT all -- 192.168.88.254 0.0.0.0/0
    68. 3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
    69. # 拒绝192.168.88.254 ping node1。-I不指定位置,默认插到最上面
    70. [root@node1 ~]# iptables -I INPUT -s 192.168.88.254 -p icmp -j REJECT
    71. [root@node1 ~]# iptables -nL INPUT --line-numbers
    72. Chain INPUT (policy DROP)
    73. num target prot opt source destination
    74. 1 REJECT icmp -- 192.168.88.254 0.0.0.0/0 reject-with icmp-port-unreachable
    75. 2 ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
    76. 3 ACCEPT all -- 192.168.88.254 0.0.0.0/0
    77. 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
    78. # DROP是直接丢弃,REJECT是明确拒绝。
    79. # 保存规则。不保存规则,重启iptables服务,自定义规则将消失
    80. [root@node1 ~]# iptables-save > /etc/sysconfig/iptables
    • 此时,从其他机器访问node1已放行相关协议,但是从node1访问其他机器却无法成功。原因是数据可以发出去,但是返回的数据包也会进入INPUT,但是INPUT链中没有相关放行规则。
    • 从自身发出去,返回来的数据包属于某个连接,该连接的状态是ESTABLISHED,放行该状态的数据包即可。ESTABLISHED表示已经建立的连接,即数据包是响应一个已经建立的连接而来的。
    [root@node1 ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT

    验证FORWARD链

     准备环境

    1. # 为node1的eth1配置ip地址
    2. [root@node1 ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
    3. [root@node1 ~]# nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.11/24
    4. [root@node1 ~]# reboot
    5. # 配置server1
    6. [root@localhost ~]# hostnamectl set-hostname server1
    7. [root@localhost ~]# nmcli connection modify "System eth0" ipv4.addresses "" autoconnect no
    8. [root@localhost ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
    9. [root@localhost ~]# nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.100/24
    10. [root@localhost ~]# reboot

    为192.168.88.10和192.168.99.100配置网关

    1. [root@client1 ~]# nmcli connection modify "System eth0" ipv4.gateway 192.168.88.11
    2. [root@client1 ~]# nmcli connection down "System eth0"; nmcli connection up "System eth0"
    3. [root@server1 ~]# nmcli connection modify eth1 ipv4.gateway 192.168.99.11
    4. [root@server1 ~]# nmcli connection down eth1; nmcli connection up eth1
    5. # 在中间节点node1上打开路由转发功能
    6. [root@node1 ~]# sysctl -a | grep ip_forward
    7. [root@node1 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
    8. [root@node1 ~]# sysctl -p
    9. # client和server已经可以通信
    10. [root@client1 ~]# ping -c2 192.168.99.100
    • 在server1上安装httpd服务
    1. [root@server1 ~]# yum install -y httpd
    2. [root@server1 ~]# systemctl start httpd
    3. # 在客户端访问web服务,可以访问
    4. [root@client1 ~]# curl http://192.168.99.100/
    配置FORWARD链
    • 要求:在node1上配置防火墙,保护server1

      1. 默认拒绝所有数据包通过
      2. 从server1所在网段发往client1所在网段的包全部允许
      3. 从client1所在网段到server1所在网段,允许icmp,允许22、80、443端口通过
    1. # 默认拒绝所有数据包通过,此时client1和server1完全不通
    2. [root@node1 ~]# iptables -P FORWARD DROP
    3. # 源地址是192.168.99.0/24,目标地址是192.168.88.0/24的包,放行
    4. [root@node1 ~]# iptables -A FORWARD -s 192.168.99.0/24 -d 192.168.88.0/24 -j ACCEPT
    5. # 从client1到server1,允许icmp
    6. [root@node1 ~]# iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p icmp -j ACCEPT
    7. # client1和server1已经可以ping通了
    8. [root@client1 ~]# ping -c2 192.168.99.100
    9. # 允许从client1访问server12280443100-120端口范围
    10. # -m是引入扩展模块,multiport多端口
    11. [root@node1 ~]# iptables -A FORWARD -p tcp -m multiport --dport 22,80,443,100:120 -s 192.168.88.0/24 -j ACCEPT
    12. # 现在从client1到server1的ssh、http都可以放行了
    13. [root@client1 ~]# ssh 192.168.99.100
    14. [root@client1 ~]# curl http://192.168.99.100/
    15. # 拒绝192.168.88.10-192.168.88.20访问192.168.99.50-192.168.99.150
    16. # -m是引入扩展模块,src-range是源地址范围,dst-range目标地址范围
    17. [root@node1 ~]# iptables -I FORWARD -m iprange --src-range 192.168.88.10-192.168.88.20 --dst-range 192.168.99.50-192.168.99.150 -j REJECT

    NAT

    • NAT:网络地址翻译、网络地址转换

    • NAT技术产生,主要是解决IPV4地址不够用。

    • NAT一般用于将私有地址转成全球唯一的公有地址。

    • 私有地址:

      • A类:10.x.x.x
      • B类:172.16.x.x-172.31.x.x
      • C类:192.168.x.x
    • 私有地址,如果需要访问互联网中的公有地址,进行上网,可以通过NAT技术,将私有地址转成公有地址,再访问外界。

    配置SNAT

    • 现在的实验环境,client1可以访问server1,server1看到的是客户端地址是client1的地址。
    1. # 跟踪httpd日志的尾部
    2. [root@server1 ~]# tail -f /var/log/httpd/access_log
    3. # 在client上访问server1的web服务
    4. [root@client1 ~]# curl http://192.168.99.100/
    5. # 查看服务器终端的日志,将会显示client1的地址192.168.88.10访问了它
    6. 192.168.88.10 - - [13/Oct/2021:17:31:35 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"
    • 互联网环境下,运营商不允许私有地址出现在互联网上,发现有这样的数据,就直接丢弃。所以,私有地址发往互联网时,需要用NAT转换成公有地址,也叫合法地址。
    • 在我们的练习环境下,在node1上配置NAT,当client1访问server1时,将client1的地址转换成server1的192.168.99.x再发给server1。因为数据包的源地址改变了,所以叫SNAT,S即Source。
    1. # 向nat表中的POSTROUTING链添加规则。将源地址192.168.88.0/24转换成它外网卡地址。
    2. [root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
    3. [root@node1 ~]# iptables -t nat -nL
    4. # client1再次访问server1时,server1上的日志将会显示node1192.168.99.11访问
    5. [root@server1 ~]# tail -f /var/log/httpd/access_log
    6. 192.168.99.11 - - [13/Oct/2021:17:45:07 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"

  • 相关阅读:
    [工业自动化-8]:西门子S7-15xxx编程 - PLC主站 - CPU模块
    实战讲解网关接口统一认证SpringCloudGateway(图+文)
    【GlobalMapper精品教程】025:影像数据集的建立与巧妙使用
    【微软技术栈】C#.NET 中使用依赖注入
    web:[ACTF2020 新生赛]Exec
    使用ChatGPT创建Makefile构建系统:使用Make运行Docker
    如何使用GitHub托管代码(简易版)
    [力扣 Hot100]Day38 翻转二叉树
    Android Automotive (一) 介绍
    二十六、Eclipse 查找
  • 原文地址:https://blog.csdn.net/2301_79227925/article/details/133242336