19.9. 使用 network RHEL 系统角色将特定子网的流量路由到不同的默认网关
您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。例如,您可以将 RHEL 配置为默认路由,使用默认路由将所有流量路由到互联网提供商 A 。但是,从内部工作站子网接收的流量路由到供应商 B。通过使用 Ansible 和网络
RHEL 系统角色,您可以在 playbook 中定义的主机上自动化这个过程并远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置连接配置文件,包括路由表和规则。
此流程假设以下网络拓扑:
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
受管节点使用
NetworkManager
和firewalld
服务。 您要配置的受管节点有 4 个网络接口:
-
enp7s0
接口已连接到提供商 A 的网络。提供商网络中的网关 IP 为198.51.100.2
,网络使用/30
网络掩码。 -
enp1s0
接口连接到提供商 B 的网络。提供商网络中的网关 IP 为192.0.2.2
,网络使用/30
网络掩码。 -
enp8s0
接口已与连有内部工作站的10.0.0.0/24
子网相连。 -
enp9s0
接口已与连有公司服务器的203.0.113.0/24
子网相连。
-
-
内部工作站子网中的主机使用
10.0.0.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp8s0
网络接口。 -
服务器子网中的主机使用
203.0.113.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp9s0
网络接口。
步骤
创建包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring policy-based routing hosts: managed-node-01.example.com tasks: - name: Routing traffic from a specific subnet to a different default gateway ansible.builtin.include_role: name: rhel-system-roles.network vars: network_connections: - name: Provider-A interface_name: enp7s0 type: ethernet autoconnect: True ip: address: - 198.51.100.1/30 gateway4: 198.51.100.2 dns: - 198.51.100.200 state: up zone: external - name: Provider-B interface_name: enp1s0 type: ethernet autoconnect: True ip: address: - 192.0.2.1/30 route: - network: 0.0.0.0 prefix: 0 gateway: 192.0.2.2 table: 5000 state: up zone: external - name: Internal-Workstations interface_name: enp8s0 type: ethernet autoconnect: True ip: address: - 10.0.0.1/24 route: - network: 10.0.0.0 prefix: 24 table: 5000 routing_rule: - priority: 5 from: 10.0.0.0/24 table: 5000 state: up zone: trusted - name: Servers interface_name: enp9s0 type: ethernet autoconnect: True ip: address: - 203.0.113.1/24 state: up zone: trusted
示例 playbook 中指定的设置包括:
表:< ;value>
-
将与
table
变量相同的列表条目中的路由分配给指定的路由表。 routing_rule: < list>
- 定义指定路由规则的优先级,以及从分配规则的路由表到的连接配置文件。
zone: <zone_name>
-
将网络接口从连接配置文件分配给指定的
firewalld
区域。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在内部工作站子网的 RHEL 主机上:
安装
traceroute
软件包:# yum install traceroute
使用
traceroute
工具显示到互联网上主机的路由:# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 10.0.0.1 (10.0.0.1) 0.337 ms 0.260 ms 0.223 ms 2 192.0.2.1 (192.0.2.1) 0.884 ms 1.066 ms 1.248 ms ...
命令的输出显示路由器通过
192.0.2.1
,即提供商 B 的网络来发送数据包。
在服务器子网的 RHEL 主机上:
安装
traceroute
软件包:# yum install traceroute
使用
traceroute
工具显示到互联网上主机的路由:# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 203.0.113.1 (203.0.113.1) 2.179 ms 2.073 ms 1.944 ms 2 198.51.100.2 (198.51.100.2) 1.868 ms 1.798 ms 1.549 ms ...
命令的输出显示路由器通过
198.51.100.2
,即供应商 A 的网络来发送数据包。
在使用 RHEL 系统角色配置的 RHEL 路由器上:
显示规则列表:
# ip rule list 0: from all lookup local 5: from 10.0.0.0/24 lookup 5000 32766: from all lookup main 32767: from all lookup default
默认情况下,RHEL 包含表
local
、main
和default
的规则。显示表
5000
中的路由:# ip route list table 5000 0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100 10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
显示接口和防火墙区:
# firewall-cmd --get-active-zones external interfaces: enp1s0 enp7s0 trusted interfaces: enp8s0 enp9s0
验证
external
区是否启用了伪装:# firewall-cmd --info-zone=external external (active) target: default icmp-block-inversion: no interfaces: enp1s0 enp7s0 sources: services: ssh ports: protocols: masquerade: yes ...
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件 -
/usr/share/doc/rhel-system-roles/network/
directory