当前位置: 首页 > news >正文

OpenStack Yoga版安装笔记(十七)安全组笔记

一、安全组与iptables的关系

OpenStack的安全组(Security Group)默认是通过Linux的iptables实现的。以下是其主要实现原理和机制:

  1. 安全组与iptables的关系
    OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的iptables规则,这些规则会动态生成并应用到计算节点的iptables中。

  2. 规则链的生成

    安全组规则会根据虚拟机的网络接口(如虚拟机网卡)生成特定的iptables规则链。

二、回顾“启动一个实例”中的内容

在《OpenStack Yoga版安装笔记(十四)启动一个实例》中,执行了以下命令:

1、创建networkroot@osclient ~(admin/amdin)# openstack network create  --share --external --provider-physical-network provider --provider-network-type flat provider
2、创建subnetroot@osclient ~(admin/amdin)# openstack subnet create --network provider --allocation-pool start=203.0.113.101,end=203.0.113.250 --dns-nameserver 8.8.4.4 --gateway 203.0.113.1 --subnet-range 203.0.113.0/24 provider
3、创建一个新的计算实例类型(flavor)root@osclient ~(admin/amdin)# openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
4、user "myuser"登录到project "myproject"root@osclient:~# cat demo-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='\u@\h \W(myproject/myuser)\$ '
root@osclient:~# source demo-openrc 
root@osclient ~(myproject/myuser)# pwd
/root
root@osclient ~(myproject/myuser)#
5、生成一个 SSH 密钥对(公钥和私钥)

root@osclient ~(myproject/myuser)# ssh-keygen -q -N ""
Enter file in which to save the key (/root/.ssh/id_rsa): 
root@osclient ~(myproject/myuser)# ls .ssh
authorized_keys  id_rsa  id_rsa.pub  known_hosts

注:id_rsa,私钥;id_rsa.pub,公钥。

6、用户myuser使用 OpenStack CLI 将公钥上传到项目 myproject 中

root@osclient ~(myproject/myuser)# openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
7、列出当前项目中所有已注册的 SSH 密钥对root@osclient ~(myproject/myuser)# openstack keypair list
8、在project myporject中,为默认的安全组(default)添加一条允许 ICMP 流量的入向规则(缺省为入向)root@osclient ~(myproject/myuser)# openstack security group rule create --proto icmp default
9、在project myporject中,为默认的安全组(default)添加一条允许所有来源的 TCP 流量访问 22 端口(SSH)的入向规则(缺省为入向)root@osclient ~(myproject/myuser)# openstack security group rule create --proto tcp --dst-port 22 default
10、列出当前项目中所有安全组的规则root@osclient ~(myproject/myuser)# openstack security group rule list

11、在 OpenStack 中创建一个新的云实例。通过指定 flavor、镜像、网络、安全组和 SSH 密钥对,可以配置实例的资源和访问权限。确保所有指定的资源(如 flavor、镜像、网络和密钥对)在当前项目中可用,并验证实例的状态以确保其正常运行。

可以使用之前产生的私钥(id_rsa)通过SSH登录到云实例:

ssh -i ~/.ssh/id_rsa <username>@<instance_ip>

root@osclient ~(myproject/myuser)# openstack server create --flavor m1.nano --image cirros   --nic net-id=48f2b88e-7740-4d94-a631-69e2abadf25b --security-group default   --key-name mykey provider-instance

三、创建虚机后的网络拓扑

创建虚机后,Openstack视角的抽象网络拓扑:

Openstack视图的网络拓扑

实际的网络拓扑,其中openstack创建了qdhcpxxxx、brqxxxx、provider-instance:

实际网络拓扑示意

另外,本次环境中,还有一台运行openstack client的虚机(ip address: 10.0.20.100):

root@osclient:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:ff:20:81 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 10.0.20.100/24 brd 10.0.20.255 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feff:2081/64 scope link valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:44:6b:2d:6a brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
root@osclient:~# ls
admin-openrc  demo-openrc  myproject-admin-openrc
root@osclient:~# 

 四、查看虚机运行所在的主机

1、普通role的user无法查看虚机所在的主机信息

user "myuser” 在project "myproject"中赋予role "myrole",这是普通权限。

root@osclient ~(admin/amdin)# source demo-openrc 
root@osclient ~(myproject/myuser)# cat demo-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='\u@\h \W(myproject/myuser)\$ '
root@osclient ~(myproject/myuser)# openstack server list
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| ID                                   | Name              | Status  | Networks               | Image  | Flavor  |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| d2e4bc39-63c8-4c80-b33f-52f4e1891f50 | provider-instance | SHUTOFF | provider=203.0.113.125 | cirros | m1.nano |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
root@osclient ~(myproject/myuser)# openstack server show d2e4bc39-63c8-4c80-b33f-52f4e1891f50 
+-----------------------------+----------------------------------------------------------+
| Field                       | Value                                                    |
+-----------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL                                                   |
| OS-EXT-AZ:availability_zone | nova                                                     |
| OS-EXT-STS:power_state      | Shutdown                                                 |
| OS-EXT-STS:task_state       | None                                                     |
| OS-EXT-STS:vm_state         | stopped                                                  |
| OS-SRV-USG:launched_at      | 2024-09-28T03:28:51.000000                               |
| OS-SRV-USG:terminated_at    | None                                                     |
| accessIPv4                  |                                                          |
| accessIPv6                  |                                                          |
| addresses                   | provider=203.0.113.125                                   |
| config_drive                |                                                          |
| created                     | 2024-09-28T02:49:20Z                                     |
| flavor                      | m1.nano (0)                                              |
| hostId                      | 892d1a79d804f6b0fbfb68938ec0df8a0abc8e3d52660529538123e4 |
| id                          | d2e4bc39-63c8-4c80-b33f-52f4e1891f50                     |
| image                       | cirros (429decdd-9230-49c0-b735-70364c226eb5)            |
| key_name                    | mykey                                                    |
| name                        | provider-instance                                        |
| project_id                  | f5e75a3f7cc347ad89d20dcfe70dae01                         |
| properties                  |                                                          |
| security_groups             | name='default'                                           |
| status                      | SHUTOFF                                                  |
| updated                     | 2025-03-28T22:36:21Z                                     |
| user_id                     | 9382b59561c04dd1abf0a4cb7a8252ec                         |
| volumes_attached            |                                                          |
+-----------------------------+----------------------------------------------------------+
root@osclient ~(myproject/myuser)#

2、”admin" role的用户可以查看虚机所在主机的信息

google关键字搜索”openstack server show hostId“,查看到类似的问题和解决办法:

Question #246423 “host-ids and extended server attributes” : Questions : OpenStack Compute (nova)

将user"admin"在project "myproject" 中赋予"admin" role:

root@osclient ~(myproject/amdin)# source admin-openrc 
root@osclient ~(admin/amdin)# openstack role list
+----------------------------------+----------+
| ID                               | Name     |
+----------------------------------+----------+
| 17552c9a365d4944a50fd8ac271791c6 | member   |
| 48fa6b74f7b74d8698fe20b21ae8a02b | testrole |
| 83144b48ff1b4c54bb21d1fcb15921b5 | myrole   |
| be23525c20c44f05b3ba071455522fcb | reader   |
| e434c66b7af647158bcaa77686ca6e93 | admin    |
+----------------------------------+----------+
root@osclient ~(admin/amdin)# openstack role add --project myproject --user admin admin
root@osclient ~(admin/amdin)#

使用admin role的user可以查看虚机所在的主机信息,根据输出结果,这台虚机运行在host "compute1":

root@osclient ~(myproject/myuser)# source myproject-admin-openrc 
root@osclient ~(myproject/admin)# cat myproject-admin-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='\u@\h \W(myproject/admin)\$ '
root@osclient ~(myproject/admin)# openstack server list
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| ID                                   | Name              | Status  | Networks               | Image  | Flavor  |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| d2e4bc39-63c8-4c80-b33f-52f4e1891f50 | provider-instance | SHUTOFF | provider=203.0.113.125 | cirros | m1.nano |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
root@osclient ~(myproject/admin)# openstack server show d2e4bc39-63c8-4c80-b33f-52f4e1891f50
+-------------------------------------+----------------------------------------------------------+
| Field                               | Value                                                    |
+-------------------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig                   | MANUAL                                                   |
| OS-EXT-AZ:availability_zone         | nova                                                     |
| OS-EXT-SRV-ATTR:host                | compute1                                                 |
| OS-EXT-SRV-ATTR:hypervisor_hostname | compute1                                                 |
| OS-EXT-SRV-ATTR:instance_name       | instance-00000004                                        |
| OS-EXT-STS:power_state              | Shutdown                                                 |
| OS-EXT-STS:task_state               | None                                                     |
| OS-EXT-STS:vm_state                 | stopped                                                  |
| OS-SRV-USG:launched_at              | 2024-09-28T03:28:51.000000                               |
| OS-SRV-USG:terminated_at            | None                                                     |
| accessIPv4                          |                                                          |
| accessIPv6                          |                                                          |
| addresses                           | provider=203.0.113.125                                   |
| config_drive                        |                                                          |
| created                             | 2024-09-28T02:49:20Z                                     |
| flavor                              | m1.nano (0)                                              |
| hostId                              | 892d1a79d804f6b0fbfb68938ec0df8a0abc8e3d52660529538123e4 |
| id                                  | d2e4bc39-63c8-4c80-b33f-52f4e1891f50                     |
| image                               | cirros (429decdd-9230-49c0-b735-70364c226eb5)            |
| key_name                            | mykey                                                    |
| name                                | provider-instance                                        |
| project_id                          | f5e75a3f7cc347ad89d20dcfe70dae01                         |
| properties                          |                                                          |
| security_groups                     | name='default'                                           |
| status                              | SHUTOFF                                                  |
| updated                             | 2025-03-28T22:36:21Z                                     |
| user_id                             | 9382b59561c04dd1abf0a4cb7a8252ec                         |
| volumes_attached                    |                                                          |
+-------------------------------------+----------------------------------------------------------+
root@osclient ~(myproject/admin)# 
字段
OS-EXT-AZ:availability_zonenova
OS-EXT-SRV-ATTR:hostcompute1
OS-EXT-SRV-ATTR:hypervisor_hostnamecompute1

信息解读:

  1. availability_zone: nova

    • 实例部署在默认的可用区(Availability Zone)nova中。

    • OpenStack中,nova是默认的可用区名称,表示实例运行在未特别配置的区域。

  2. host: compute1

    • 实例当前运行在名为compute1的计算节点(Compute Node)上。

    • 这是物理主机的名称,负责承载虚拟机实例。

  3. hypervisor_hostname: compute1

    • 该计算节点的虚拟化平台(如KVM、Xen)的主机名也是compute1

    • 通常与host字段一致,表示实例运行在同一个物理节点上。

五、虚机关闭状态时查看iptables

1、查看虚机处于关闭状态

root@osclient ~(myproject/admin)# source demo-openrc 
root@osclient ~(myproject/myuser)# cat demo-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='\u@\h \W(myproject/myuser)\$ '
root@osclient ~(myproject/myuser)# openstack server list
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| ID                                   | Name              | Status  | Networks               | Image  | Flavor  |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| d2e4bc39-63c8-4c80-b33f-52f4e1891f50 | provider-instance | SHUTOFF | provider=203.0.113.125 | cirros | m1.nano |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
root@osclient ~(myproject/myuser)# 

2、 此时虚拟网络环境

root@compute1:~# virsh net-listName      State    Autostart   Persistent
--------------------------------------------default   active   yes         yesroot@compute1:~# brctl show
bridge name     bridge id               STP enabled     interfaces
brq48f2b88e-77          8000.ea99122ddd99       no
virbr0          8000.525400db7049       yes
root@compute1:~# 

3、查看iptables

查看“provider-instance"虚机运行所在的主机compute1的iptables,由于虚机关闭,此时OpenStack Neutron没有为该虚机添加相应规则。

root@compute1:~# iptables-save
# Generated by iptables-save v1.8.7 on Sun Mar 30 05:56:29 2025
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
-A LIBVIRT_PRT -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Sun Mar 30 05:56:29 2025
# Generated by iptables-save v1.8.7 on Sun Mar 30 05:56:29 2025
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:LIBVIRT_FWI - [0:0]
:LIBVIRT_FWO - [0:0]
:LIBVIRT_FWX - [0:0]
:LIBVIRT_INP - [0:0]
:LIBVIRT_OUT - [0:0]
-A INPUT -j LIBVIRT_INP
-A FORWARD -j LIBVIRT_FWX
-A FORWARD -j LIBVIRT_FWI
-A FORWARD -j LIBVIRT_FWO
-A OUTPUT -j LIBVIRT_OUT
-A LIBVIRT_FWI -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A LIBVIRT_FWI -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A LIBVIRT_FWO -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A LIBVIRT_FWO -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A LIBVIRT_FWX -i virbr0 -o virbr0 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 68 -j ACCEPT
COMMIT
# Completed on Sun Mar 30 05:56:29 2025
# Generated by iptables-save v1.8.7 on Sun Mar 30 05:56:29 2025
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
COMMIT
# Completed on Sun Mar 30 05:56:29 2025
root@compute1:~# root@compute1:~# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         
13804 3614K LIBVIRT_INP  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 LIBVIRT_FWX  all  --  *      *       0.0.0.0/0            0.0.0.0/0           0     0 LIBVIRT_FWI  all  --  *      *       0.0.0.0/0            0.0.0.0/0           0     0 LIBVIRT_FWO  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         
12954 4090K LIBVIRT_OUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain LIBVIRT_FWI (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachableChain LIBVIRT_FWO (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachableChain LIBVIRT_FWX (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           Chain LIBVIRT_INP (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:530     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:530     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:670     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67Chain LIBVIRT_OUT (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:530     0 ACCEPT     tcp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            tcp dpt:530     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:680     0 ACCEPT     tcp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            tcp dpt:68
root@compute1:~# 

LIBVIRT_FWI、LIBVIRT_FWO、LIBVIRT_FWX、LIBVIRT_INP、LIBVIRT_OUT是Libvirt在管理虚拟机网络时创建的iptables规则链,可参考<Ubuntu22.04 KVM安装笔记>相关内容。

这些链表不属于Openstack Neutron管理。

六、虚机开启时查看iptables

1、开启虚机

root@osclient ~(myproject/myuser)# openstack server list
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| ID                                   | Name              | Status  | Networks               | Image  | Flavor  |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
| d2e4bc39-63c8-4c80-b33f-52f4e1891f50 | provider-instance | SHUTOFF | provider=203.0.113.125 | cirros | m1.nano |
+--------------------------------------+-------------------+---------+------------------------+--------+---------+
root@osclient ~(myproject/myuser)# openstack server start provider-instance
root@osclient ~(myproject/myuser)# openstack server list
+--------------------------------------+-------------------+--------+------------------------+--------+---------+
| ID                                   | Name              | Status | Networks               | Image  | Flavor  |
+--------------------------------------+-------------------+--------+------------------------+--------+---------+
| d2e4bc39-63c8-4c80-b33f-52f4e1891f50 | provider-instance | ACTIVE | provider=203.0.113.125 | cirros | m1.nano |
+--------------------------------------+-------------------+--------+------------------------+--------+---------+
root@osclient ~(myproject/myuser)# 
root@osclient ~(myproject/myuser)# 

2、此时虚拟网络环境

root@compute1:~# virsh net-listName      State    Autostart   Persistent
--------------------------------------------default   active   yes         yesroot@compute1:~# brctl show
bridge name     bridge id               STP enabled     interfaces
brq48f2b88e-77          8000.ea99122ddd99       no              ens35tap2d863922-bc
virbr0          8000.525400db7049       yes
root@compute1:~# 
root@compute1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:51:16:68 brd ff:ff:ff:ff:ff:ffaltname enp2s0inet 10.0.20.12/24 brd 10.0.20.255 scope global ens32valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe51:1668/64 scope link valid_lft forever preferred_lft forever
3: ens35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master brq48f2b88e-77 state UP group default qlen 1000link/ether 00:0c:29:51:16:72 brd ff:ff:ff:ff:ff:ffaltname enp2s3inet6 fe80::20c:29ff:fe51:1672/64 scope link valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 52:54:00:db:70:49 brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
5: brq48f2b88e-77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether ea:99:12:2d:dd:99 brd ff:ff:ff:ff:ff:ff
6: tap2d863922-bc: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master brq48f2b88e-77 state UNKNOWN group default qlen 1000link/ether fe:16:3e:60:78:cd brd ff:ff:ff:ff:ff:ffinet6 fe80::fc16:3eff:fe60:78cd/64 scope link valid_lft forever preferred_lft forever
root@compute1:~# 

3、查看iptables-save

开启虚机后,OpenStack Neutron根据安全组配置,在iptables中为该虚机插入相应的安全组规则。

root@compute1:~# iptables-save
# Generated by iptables-save v1.8.7 on Sun Mar 30 06:11:29 2025
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
-A LIBVIRT_PRT -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Sun Mar 30 06:11:29 2025
# Generated by iptables-save v1.8.7 on Sun Mar 30 06:11:29 2025
*raw
:PREROUTING ACCEPT [1116:236588]
:OUTPUT ACCEPT [853:288723]
:neutron-linuxbri-OUTPUT - [0:0]
:neutron-linuxbri-PREROUTING - [0:0]
-A PREROUTING -j neutron-linuxbri-PREROUTING
-A OUTPUT -j neutron-linuxbri-OUTPUT
-A neutron-linuxbri-PREROUTING -m physdev --physdev-in brq48f2b88e-77 -m comment --comment "Set zone for d863922-bc" -j CT --zone 4097
-A neutron-linuxbri-PREROUTING -i brq48f2b88e-77 -m comment --comment "Set zone for d863922-bc" -j CT --zone 4097
-A neutron-linuxbri-PREROUTING -m physdev --physdev-in tap2d863922-bc -m comment --comment "Set zone for d863922-bc" -j CT --zone 4097
COMMIT
# Completed on Sun Mar 30 06:11:29 2025
# Generated by iptables-save v1.8.7 on Sun Mar 30 06:11:29 2025
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:LIBVIRT_FWI - [0:0]
:LIBVIRT_FWO - [0:0]
:LIBVIRT_FWX - [0:0]
:LIBVIRT_INP - [0:0]
:LIBVIRT_OUT - [0:0]
:neutron-filter-top - [0:0]
:neutron-linuxbri-FORWARD - [0:0]
:neutron-linuxbri-INPUT - [0:0]
:neutron-linuxbri-OUTPUT - [0:0]
:neutron-linuxbri-i2d863922-b - [0:0]
:neutron-linuxbri-local - [0:0]
:neutron-linuxbri-o2d863922-b - [0:0]
:neutron-linuxbri-s2d863922-b - [0:0]
:neutron-linuxbri-sg-chain - [0:0]
:neutron-linuxbri-sg-fallback - [0:0]
-A INPUT -j neutron-linuxbri-INPUT
-A INPUT -j LIBVIRT_INP
-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-linuxbri-FORWARD
-A FORWARD -j LIBVIRT_FWX
-A FORWARD -j LIBVIRT_FWI
-A FORWARD -j LIBVIRT_FWO
-A OUTPUT -j neutron-filter-top
-A OUTPUT -j neutron-linuxbri-OUTPUT
-A OUTPUT -j LIBVIRT_OUT
-A LIBVIRT_FWI -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A LIBVIRT_FWI -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A LIBVIRT_FWO -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A LIBVIRT_FWO -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A LIBVIRT_FWX -i virbr0 -o virbr0 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 68 -j ACCEPT
-A neutron-filter-top -j neutron-linuxbri-local
-A neutron-linuxbri-FORWARD -m physdev --physdev-out tap2d863922-bc --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain
-A neutron-linuxbri-FORWARD -m physdev --physdev-in tap2d863922-bc --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain
-A neutron-linuxbri-INPUT -m physdev --physdev-in tap2d863922-bc --physdev-is-bridged -m comment --comment "Direct incoming traffic from VM to the security group chain." -j neutron-linuxbri-o2d863922-b
-A neutron-linuxbri-i2d863922-b -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN
-A neutron-linuxbri-i2d863922-b -d 203.0.113.125/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
-A neutron-linuxbri-i2d863922-b -d 255.255.255.255/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
-A neutron-linuxbri-i2d863922-b -m set --match-set NIPv415dfe688-d6fc-4231-a670- src -j RETURN
-A neutron-linuxbri-i2d863922-b -p icmp -j RETURN
-A neutron-linuxbri-i2d863922-b -p tcp -m tcp --dport 22 -j RETURN
-A neutron-linuxbri-i2d863922-b -m state --state INVALID -m comment --comment "Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack." -j DROP
-A neutron-linuxbri-i2d863922-b -m comment --comment "Send unmatched traffic to the fallback chain." -j neutron-linuxbri-sg-fallback
-A neutron-linuxbri-o2d863922-b -s 0.0.0.0/32 -d 255.255.255.255/32 -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN
-A neutron-linuxbri-o2d863922-b -j neutron-linuxbri-s2d863922-b
-A neutron-linuxbri-o2d863922-b -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN
-A neutron-linuxbri-o2d863922-b -p udp -m udp --sport 67 --dport 68 -m comment --comment "Prevent DHCP Spoofing by VM." -j DROP
-A neutron-linuxbri-o2d863922-b -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN
-A neutron-linuxbri-o2d863922-b -j RETURN
-A neutron-linuxbri-o2d863922-b -m state --state INVALID -m comment --comment "Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack." -j DROP
-A neutron-linuxbri-o2d863922-b -m comment --comment "Send unmatched traffic to the fallback chain." -j neutron-linuxbri-sg-fallback
-A neutron-linuxbri-s2d863922-b -s 203.0.113.125/32 -m mac --mac-source fa:16:3e:60:78:cd -m comment --comment "Allow traffic from defined IP/MAC pairs." -j RETURN
-A neutron-linuxbri-s2d863922-b -m comment --comment "Drop traffic without an IP/MAC allow rule." -j DROP
-A neutron-linuxbri-sg-chain -m physdev --physdev-out tap2d863922-bc --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-i2d863922-b
-A neutron-linuxbri-sg-chain -m physdev --physdev-in tap2d863922-bc --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-o2d863922-b
-A neutron-linuxbri-sg-chain -j ACCEPT
-A neutron-linuxbri-sg-fallback -m comment --comment "Default drop rule for unmatched traffic." -j DROP
COMMIT
# Completed on Sun Mar 30 06:11:29 2025
# Generated by iptables-save v1.8.7 on Sun Mar 30 06:11:29 2025
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
COMMIT
# Completed on Sun Mar 30 06:11:29 2025
root@compute1:~# root@compute1:~# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         
77331  147M neutron-linuxbri-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
92507  151M LIBVIRT_INP  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         4387  679K neutron-filter-top  all  --  *      *       0.0.0.0/0            0.0.0.0/0           4387  679K neutron-linuxbri-FORWARD  all  --  *      *       0.0.0.0/0            0.0.0.0/0           0     0 LIBVIRT_FWX  all  --  *      *       0.0.0.0/0            0.0.0.0/0           0     0 LIBVIRT_FWI  all  --  *      *       0.0.0.0/0            0.0.0.0/0           0     0 LIBVIRT_FWO  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         
73417   18M neutron-filter-top  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
73417   18M neutron-linuxbri-OUTPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
87631   23M LIBVIRT_OUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain LIBVIRT_FWI (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachableChain LIBVIRT_FWO (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachableChain LIBVIRT_FWX (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           Chain LIBVIRT_INP (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:530     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:530     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:670     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67Chain LIBVIRT_OUT (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:530     0 ACCEPT     tcp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            tcp dpt:530     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:680     0 ACCEPT     tcp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            tcp dpt:68Chain neutron-filter-top (2 references)pkts bytes target     prot opt in     out     source               destination         
77804   19M neutron-linuxbri-local  all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain neutron-linuxbri-FORWARD (1 references)pkts bytes target     prot opt in     out     source               destination         4122  641K neutron-linuxbri-sg-chain  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-out tap2d863922-bc --physdev-is-bridged /* Direct traffic from the VM interface to the security group chain. */265 37986 neutron-linuxbri-sg-chain  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-in tap2d863922-bc --physdev-is-bridged /* Direct traffic from the VM interface to the security group chain. */Chain neutron-linuxbri-INPUT (1 references)pkts bytes target     prot opt in     out     source               destination         0     0 neutron-linuxbri-o2d863922-b  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-in tap2d863922-bc --physdev-is-bridged /* Direct incoming traffic from VM to the security group chain. */Chain neutron-linuxbri-OUTPUT (1 references)pkts bytes target     prot opt in     out     source               destination         Chain neutron-linuxbri-i2d863922-b (1 references)pkts bytes target     prot opt in     out     source               destination         245 22997 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */2   732 RETURN     udp  --  *      *       0.0.0.0/0            203.0.113.125        udp spt:67 dpt:680     0 RETURN     udp  --  *      *       0.0.0.0/0            255.255.255.255      udp spt:67 dpt:680     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set NIPv415dfe688-d6fc-4231-a670- src1    60 RETURN     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           2   104 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:220     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack. */3872  617K neutron-linuxbri-sg-fallback  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */Chain neutron-linuxbri-local (1 references)pkts bytes target     prot opt in     out     source               destination         Chain neutron-linuxbri-o2d863922-b (2 references)pkts bytes target     prot opt in     out     source               destination         2   670 RETURN     udp  --  *      *       0.0.0.0              255.255.255.255      udp spt:68 dpt:67 /* Allow DHCP client traffic. */263 37316 neutron-linuxbri-s2d863922-b  all  --  *      *       0.0.0.0/0            0.0.0.0/0           0     0 RETURN     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:68 dpt:67 /* Allow DHCP client traffic. */0     0 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:67 dpt:68 /* Prevent DHCP Spoofing by VM. */246 36272 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */17  1044 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack. */0     0 neutron-linuxbri-sg-fallback  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */Chain neutron-linuxbri-s2d863922-b (1 references)pkts bytes target     prot opt in     out     source               destination         263 37316 RETURN     all  --  *      *       203.0.113.125        0.0.0.0/0            MACfa:16:3e:60:78:cd /* Allow traffic from defined IP/MAC pairs. */0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Drop traffic without an IP/MAC allow rule. */Chain neutron-linuxbri-sg-chain (2 references)pkts bytes target     prot opt in     out     source               destination         4122  641K neutron-linuxbri-i2d863922-b  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-out tap2d863922-bc --physdev-is-bridged /* Jump to the VM specific chain. */265 37986 neutron-linuxbri-o2d863922-b  all  --  *      *       0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-in tap2d863922-bc --physdev-is-bridged /* Jump to the VM specific chain. */515 61879 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain neutron-linuxbri-sg-fallback (2 references)pkts bytes target     prot opt in     out     source               destination         3872  617K DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Default drop rule for unmatched traffic. */
root@compute1:~# 

neutron-XXX都是OpenStack Neutron配置的相关的链。

neutron-linuxbri-XXX 是 OpenStack Neutron 中与 Linux Bridge 插件相关的自定义链,是由 Neutron 在使用 Linux Bridge 网络驱动时自动创建和管理的。

OpenStack管理的虚机的流量都是需要经过FORWARD链。

OpenStack创建的安全组就是通过在filter表的FORWARD链插入相关规则实现。

1/ 虚机入站和出站流量首先送到安全组链(neutron-linuxbri-sg-chain)

-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-linuxbri-FORWARD

-A neutron-filter-top -j neutron-linuxbri-local

-A neutron-linuxbri-FORWARD -m physdev --physdev-out tap2d863922-bc --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain
-A neutron-linuxbri-FORWARD -m physdev --physdev-in tap2d863922-bc --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain

-A neutron-linuxbri-sg-chain -m physdev --physdev-out tap2d863922-bc --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-i2d863922-b
-A neutron-linuxbri-sg-chain -m physdev --physdev-in tap2d863922-bc --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-o2d863922-b
-A neutron-linuxbri-sg-chain -j ACCEPT

neutron-filter-top 是一个顶层链,通常被插入到 FORWARDOUTPUT 链中。它的主要功能是将流量转发到其他 Neutron 定义的链进行进一步处理。

neutron-linuxbri-local一般表示和本地(local)机器上的网络接口或规则有关,通常用于处理本地出入的流量。

  • 本文中neutron-linuxbri-local有定义,但没有定义规则。“被跳转的链存在但没有任何规则,流量会“返回”到原来的链,继续后面的规则执行。”

neutron-linuxbri-FORWARD 是一个与 Linux Bridge 插件相关的链,用于处理虚拟机的转发流量。

1. -A neutron-linuxbri-FORWARD

  • -A:表示将规则添加到一个已经存在的链中。

  • neutron-linuxbri-FORWARD:这是一个已经存在的链,通常用于处理通过 Linux Bridgelinuxbridge 网络插件)转发的流量。


2. -m physdev

  • -m physdev:这是一个用于匹配物理设备的扩展模块,用来标识和过滤基于 物理设备(比如虚拟机网卡、物理网卡等)的流量。


3. --physdev-out tap2d863922-bc

  • --physdev-out:表示匹配流量从指定的物理接口出去。

  • tap2d863922-bc:这是虚拟机的网络接口设备名,通常是 虚拟网卡,代表这条规则仅适用于通过此虚拟网卡发送的流量。这个 tap 接口可能是由 Open vSwitch (OVS)Linux Bridge(由 Neutron 管理)创建的。

    tap2d863922-bc 可能是 Neutron 创建的某个虚拟机接口的名称,每个虚拟机都有类似的 tap 接口。

    注意:physdev-out是流量从网桥发往虚拟机的方向,即虚拟机入站流量;physdev-in是流量从虚拟机进入网桥的方向,即虚拟机出站流量。


4. --physdev-is-bridged

  • --physdev-is-bridged:指定这个流量是通过 桥接网络(即 bridge 模式)发送的。此标志确保该规则仅匹配通过桥接设备转发的流量。

    这个标志通常在 Neutron 使用 Linux Bridge 或 OVS 作为网络插件时出现。


5. -m comment --comment "Direct traffic from the VM interface to the security group chain."

  • -m comment:这是一个用于添加注释的模块,它可以帮助解释规则的目的。

  • --comment "Direct traffic from the VM interface to the security group chain.":这段注释表明,这条规则的目的是将流量从虚拟机接口直接转发到安全组链(neutron-linuxbri-sg-chain


6. -j neutron-linuxbri-sg-chain

  • -j:表示 跳转到(jump to)指定的链。

  • neutron-linuxbri-sg-chain:表示将匹配到的流量转发到 neutron-linuxbri-sg-chain 链,通常这个链是用来处理与安全组相关的规则。也就是说,所有来自虚拟机接口(如 tap2d863922-bc)的流量将被送往 安全组链 进行检查和处理

neutron-linuxbri-sg-chain对流量进行进一步处理,虚机的入站流量送到该虚机的入站流量安全组链处理(neutron-linuxbri-i2d863922-b),虚机的出站流量送到该虚机的出站流量安全组链处理(neutron-linuxbri-o2d863922-b),最后接受所有未被前面规则匹配的流量。

2/ 虚机的入站流量送到该虚机的入站流量安全组链处理(neutron-linuxbri-i2d863922-b)

-A neutron-linuxbri-sg-chain -m physdev --physdev-out tap2d863922-bc --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-i2d863922-b

  • -A neutron-linuxbri-sg-chain:将这条规则添加到 neutron-linuxbri-sg-chain 链。

  • -m physdev --physdev-out tap2d863922-bc:匹配来自虚拟机接口 tap2d863922-bc虚拟机入站流量

  • --physdev-is-bridged:确保这个流量是通过桥接设备(bridge)发送的,表示该流量经过了桥接网络。

  • --comment "Jump to the VM specific chain.":注释解释该规则的作用是跳转到虚拟机特定的链

  • -j neutron-linuxbri-i2d863922-b:这条规则将流量跳转到 neutron-linuxbri-i2d863922-b 链。这个链的规则与虚拟机的入站流量相关(控制该虚拟机接收流量的安全组规则)。

作用:

  • 如果流量从虚拟机接口 tap2d863922-bc 发往虚拟机(即虚拟机入站流量),它会跳转到 neutron-linuxbri-i2d863922-b 链进行进一步处理。

3/ 虚机的出站流量送到该虚机的出站流量安全组链处理(neutron-linuxbri-o2d863922-b)

-A neutron-linuxbri-sg-chain -m physdev --physdev-in tap2d863922-bc --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-o2d863922-b

 -A neutron-linuxbri-sg-chain:将这条规则添加到 neutron-linuxbri-sg-chain 链。

  • -m physdev --physdev-in tap2d863922-bc:匹配流量进入虚拟机接口 tap2d863922-bc虚拟机出站流量

  • --physdev-is-bridged:确保这个流量是通过桥接设备发送的。

  • --comment "Jump to the VM specific chain.":注释表示这条规则的作用是跳转到虚拟机特定的链

  • -j neutron-linuxbri-o2d863922-b:这条规则将流量跳转到 neutron-linuxbri-o2d863922-b 链。这个链的规则与虚拟机的出站流量相关(控制该虚拟机发送流量的安全组规则)。

作用:

  • 如果流量是从虚拟机流入虚拟机接口 tap2d863922-bc(即虚拟机出站流量,虚拟机接口连接虚拟机的网卡),它会跳转到 neutron-linuxbri-o2d863922-b 链进行进一步处理。

七、虚机入站流量安全组链规则解读(neutron-linuxbri-i2d863922-b)

-A neutron-linuxbri-i2d863922-b -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN
-A neutron-linuxbri-i2d863922-b -d 203.0.113.125/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
-A neutron-linuxbri-i2d863922-b -d 255.255.255.255/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
-A neutron-linuxbri-i2d863922-b -m set --match-set NIPv415dfe688-d6fc-4231-a670- src -j RETURN
-A neutron-linuxbri-i2d863922-b -p icmp -j RETURN
-A neutron-linuxbri-i2d863922-b -p tcp -m tcp --dport 22 -j RETURN
-A neutron-linuxbri-i2d863922-b -m state --state INVALID -m comment --comment "Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack." -j DROP
-A neutron-linuxbri-i2d863922-b -m comment --comment "Send unmatched traffic to the fallback chain." -j neutron-linuxbri-sg-fallback

neutron-linuxbri-i2d863922-b定义了针对来自虚拟机接口(tap2d863922-bc)的虚拟机入站流量的处理方式。

1. 第一条规则:

-A neutron-linuxbri-i2d863922-b -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN

  • -A neutron-linuxbri-i2d863922-b:将这条规则添加到 neutron-linuxbri-i2d863922-b 链。

  • -m state --state RELATED,ESTABLISHED:匹配已经建立的或相关的连接的流量。即这些流量属于一个已经存在的连接或会话。

  • --comment "Direct packets associated with a known session to the RETURN chain.":注释表示该规则的作用是将已知会话的流量直接跳转到 RETURN

  • -j RETURN:流量会跳转到 RETURN 链,通常这意味着会话相关的流量被允许通过或交给上级链进行进一步处理。

2. 第二条规则:

-A neutron-linuxbri-i2d863922-b -d 203.0.113.125/32 -p udp -m udp --sport 67 --dport 68 -j RETURN

  • -d 203.0.113.125/32:匹配目的 IP 地址为 203.0.113.125 的流量。

  • -p udp:匹配 UDP 协议的流量。

  • --sport 67 --dport 68:匹配源端口为 67,目标端口为 68 的流量,这通常是 DHCP 流量(DHCP 客户端与服务器之间的通信端口)。

  • -j RETURN:该流量会被直接跳转到 RETURN 链,通常表示允许或不做任何处理。

3. 第三条规则:

-A neutron-linuxbri-i2d863922-b -d 255.255.255.255/32 -p udp -m udp --sport 67 --dport 68 -j RETURN

  • -d 255.255.255.255/32:匹配目的地址为广播地址(255.255.255.255)的流量。

  • -p udp:匹配 UDP 协议。

  • --sport 67 --dport 68:匹配源端口为 67,目标端口为 68 的流量,同样是 DHCP 流量。

  • -j RETURN:此流量也会跳转到 RETURN 链,通常表示允许广播流量通过。

4. 第四条规则:

-A neutron-linuxbri-i2d863922-b -m set --match-set NIPv415dfe688-d6fc-4231-a670- src -j RETURN

  • -m set --match-set NIPv415dfe688-d6fc-4231-a670- src:匹配源 IP 地址属于 NIPv415dfe688-d6fc-4231-a670- 这个 IP 地址集合的流量。这个集合可能是事先定义的 IP 地址池或范围。

  • -j RETURN:这些流量会直接跳转到 RETURN 链,可能是允许这些流量通过或跳过其他检查。

5. 第五条规则:

-A neutron-linuxbri-i2d863922-b -p icmp -j RETURN

  • -p icmp:匹配 ICMP 协议的流量(例如 Ping 请求)。

  • -j RETURN:此类流量会直接跳转到 RETURN 链,通常表示允许 ICMP 流量通过。

6. 第六条规则:

-A neutron-linuxbri-i2d863922-b -p tcp -m tcp --dport 22 -j RETURN

  • -p tcp:匹配 TCP 协议的流量。

  • --dport 22:匹配目标端口为 22 的流量,通常是 SSH 流量。

  • -j RETURN:允许目标端口为 22 的流量直接通过,跳转到 RETURN 链。

7. 第七条规则:

-A neutron-linuxbri-i2d863922-b -m state --state INVALID -m comment --comment "Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack." -j DROP

  • -m state --state INVALID:匹配无效状态的流量,通常这些流量与已知连接不匹配,可能是损坏或伪造的包。

  • --comment "Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack.":注释解释这条规则会丢弃看起来像是与现有连接相关的流量(例如,TCP ACK/FIN 包),但没有连接跟踪条目。

  • -j DROP:丢弃这些无效的包。

8. 第八条规则:

-A neutron-linuxbri-i2d863922-b -m comment --comment "Send unmatched traffic to the fallback chain." -j neutron-linuxbri-sg-fallback

  • -j neutron-linuxbri-sg-fallback:如果流量没有匹配到以上规则,它将跳转到 neutron-linuxbri-sg-fallback 链。这个链可能包含其他的处理逻辑,例如安全组检查或丢弃流量。

注1:其中5、6条虚拟机入站规则,是之前添加到default安全组当中的。

注2:第4条规则涉及的IP地址集合,可以通过以下命令查看:

root@compute1:~# ipset list
Name: NIPv415dfe688-d6fc-4231-a670-
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xc7f31013
Size in memory: 504
References: 1
Number of entries: 1
Members:
203.0.113.125

注3:查看连接跟踪(connection tracking)信息,可以使用conntrack命令。这个工具用于查看和管理内核中的连接跟踪表。

root@compute1:~# conntrack -L
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59454 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59454 [ASSURED] mark=0 use=1
udp      17 2 src=203.0.113.90 dst=239.255.255.250 sport=49337 dport=1900 [UNREPLIED] src=239.255.255.250 dst=203.0.113.90 sport=1900 dport=49337 mark=0 zone=4097 use=1
tcp      6 112 TIME_WAIT src=10.0.20.12 dst=10.0.20.11 sport=41734 dport=8778 src=10.0.20.11 dst=10.0.20.12 sport=8778 dport=41734 [ASSURED] mark=0 use=1
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59474 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59474 [ASSURED] mark=0 use=1
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=47200 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=47200 [ASSURED] mark=0 use=1
tcp      6 300 ESTABLISHED src=10.0.20.1 dst=10.0.20.12 sport=9901 dport=22 src=10.0.20.12 dst=10.0.20.1 sport=22 dport=9901 [ASSURED] mark=0 use=1
tcp      6 431992 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59486 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59486 [ASSURED] mark=0 use=1
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59470 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59470 [ASSURED] mark=0 use=1
tcp      6 431991 ESTABLISHED src=203.0.113.90 dst=203.0.113.125 sport=2101 dport=22 src=203.0.113.125 dst=203.0.113.90 sport=22 dport=2101 [ASSURED] mark=0 zone=4097 use=1
tcp      6 51 TIME_WAIT src=10.0.20.12 dst=10.0.20.11 sport=47018 dport=8778 src=10.0.20.11 dst=10.0.20.12 sport=8778 dport=47018 [ASSURED] mark=0 use=1
tcp      6 431984 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59440 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59440 [ASSURED] mark=0 use=1
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59504 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59504 [ASSURED] mark=0 use=1
tcp      6 431984 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59432 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59432 [ASSURED] mark=0 use=1
udp      17 15 src=203.0.113.90 dst=224.0.0.251 sport=5353 dport=5353 [UNREPLIED] src=224.0.0.251 dst=203.0.113.90 sport=5353 dport=5353 mark=0 zone=4097 use=1
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59418 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59418 [ASSURED] mark=0 use=1
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=48460 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=48460 [ASSURED] mark=0 use=1
tcp      6 75 TIME_WAIT src=203.0.113.90 dst=203.0.113.125 sport=2078 dport=22 src=203.0.113.125 dst=203.0.113.90 sport=22 dport=2078 [ASSURED] mark=0 zone=4097 use=1
tcp      6 428627 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=55168 dport=3306 src=10.0.20.11 dst=10.0.20.12 sport=3306 dport=55168 [ASSURED] mark=0 use=1
tcp      6 431992 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59494 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59494 [ASSURED] mark=0 use=2
tcp      6 57 CLOSE_WAIT src=10.0.20.12 dst=10.0.20.11 sport=33748 dport=8778 src=10.0.20.11 dst=10.0.20.12 sport=8778 dport=33748 [ASSURED] mark=0 use=1
tcp      6 431987 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=41996 dport=9696 src=10.0.20.11 dst=10.0.20.12 sport=9696 dport=41996 [ASSURED] mark=0 use=1
udp      17 24 src=203.0.113.90 dst=239.255.255.250 sport=62791 dport=1900 [UNREPLIED] src=239.255.255.250 dst=203.0.113.90 sport=1900 dport=62791 mark=0 zone=4097 use=1
tcp      6 431992 ESTABLISHED src=127.0.0.1 dst=127.0.0.1 sport=37286 dport=38013 src=127.0.0.1 dst=127.0.0.1 sport=38013 dport=37286 [ASSURED] mark=0 use=1
tcp      6 431986 ESTABLISHED src=10.0.20.12 dst=10.0.20.11 sport=59512 dport=5672 src=10.0.20.11 dst=10.0.20.12 sport=5672 dport=59512 [ASSURED] mark=0 use=1
conntrack v1.4.6 (conntrack-tools): 24 flow entries have been shown.
root@compute1:~# conntrack -L | grep 203.0.113.125
conntrack v1.4.6 (conntrack-tools): 22 flow entries have been shown.
tcp      6 431960 ESTABLISHED src=203.0.113.90 dst=203.0.113.125 sport=2101 dport=22 src=203.0.113.125 dst=203.0.113.90 sport=22 dport=2101 [ASSURED] mark=0 zone=4097 use=1
tcp      6 44 TIME_WAIT src=203.0.113.90 dst=203.0.113.125 sport=2078 dport=22 src=203.0.113.125 dst=203.0.113.90 sport=22 dport=2078 [ASSURED] mark=0 zone=4097 use=1
root@compute1:~# 

🧑‍💻 入站流量安全组链小结

这些规则在 neutron-linuxbri-i2d863922-b 链中处理虚拟机入站流量。根据不同的流量特征(如协议、端口、状态等),它们会:

  1. 允许已知会话的流量通过(如已经建立的连接)。

  2. 允许 DHCP、ICMP、SSH 等特定流量通过

  3. 丢弃无效的、无法匹配连接的流量(如无效的 TCP 包)。

  4. 将未匹配的流量发送到回退链,以便进一步处理。

 八、虚机出站流量安全组链规则解读(neutron-linuxbri-o2d863922-b)

-A neutron-linuxbri-o2d863922-b -s 0.0.0.0/32 -d 255.255.255.255/32 -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN
-A neutron-linuxbri-o2d863922-b -j neutron-linuxbri-s2d863922-b
-A neutron-linuxbri-o2d863922-b -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN
-A neutron-linuxbri-o2d863922-b -p udp -m udp --sport 67 --dport 68 -m comment --comment "Prevent DHCP Spoofing by VM." -j DROP
-A neutron-linuxbri-o2d863922-b -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN
-A neutron-linuxbri-o2d863922-b -j RETURN
-A neutron-linuxbri-o2d863922-b -m state --state INVALID -m comment --comment "Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack." -j DROP
-A neutron-linuxbri-o2d863922-b -m comment --comment "Send unmatched traffic to the fallback chain." -j neutron-linuxbri-sg-fallback

其他相关安全组链:

-A neutron-linuxbri-s2d863922-b -s 203.0.113.125/32 -m mac --mac-source fa:16:3e:60:78:cd -m comment --comment "Allow traffic from defined IP/MAC pairs." -j RETURN
-A neutron-linuxbri-s2d863922-b -m comment --comment "Drop traffic without an IP/MAC allow rule." -j DROP

-A neutron-linuxbri-sg-fallback -m comment --comment "Default drop rule for unmatched traffic." -j DROP

neutron-linuxbri-i2d863922-b定义了针对来自虚拟机接口(tap2d863922-bc)的虚拟机出站流量的处理方式。

1. 第一条规则:

-A neutron-linuxbri-o2d863922-b -s 0.0.0.0/32 -d 255.255.255.255/32 -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN

  • -s 0.0.0.0/32 -d 255.255.255.255/32:匹配源地址为 0.0.0.0(通常是 DHCP 客户端的源地址)和目标地址为广播地址 255.255.255.255 的流量。

  • -p udp:匹配 UDP 协议。

  • --sport 68 --dport 67:匹配源端口为 68,目标端口为 67 的流量,这是 DHCP 客户端与 DHCP 服务器之间的标准端口。

  • -j RETURN:允许这类 DHCP 客户端的流量通过,跳转到 RETURN 链。

2. 第二条规则:

-A neutron-linuxbri-o2d863922-b -j neutron-linuxbri-s2d863922-b

  • -j neutron-linuxbri-s2d863922-b:如果流量没有匹配前面规则,它将跳转到 neutron-linuxbri-s2d863922-b 链,这可能是针对其他流量进行的进一步处理。

  • neutron-linuxbri-s2d863922-b 链,主要用于 基于 IP 地址和 MAC 地址的流量控制,对于没有与 IP/MAC 地址对匹配的流量,直接丢弃

3. 第三条规则:

-A neutron-linuxbri-o2d863922-b -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN

  • 这条规则和第一条规则相同,允许源端口为 68,目标端口为 67 的 DHCP 客户端流量。

4. 第四条规则:

-A neutron-linuxbri-o2d863922-b -p udp -m udp --sport 67 --dport 68 -m comment --comment "Prevent DHCP Spoofing by VM." -j DROP

  • -p udp:匹配 UDP 协议。

  • --sport 67 --dport 68:匹配源端口为 67,目标端口为 68 的流量,这是 DHCP 服务器与客户端的标准端口。

  • -j DROP丢弃任何源端口为 67,目标端口为 68 的流量,防止虚拟机进行 DHCP 欺骗(即伪造 DHCP 服务器响应)。

5. 第五条规则:

-A neutron-linuxbri-o2d863922-b -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN

  • -m state --state RELATED,ESTABLISHED:匹配与已知会话相关的流量(即已建立或相关的连接)。

  • -j RETURN:流量会直接跳转到 RETURN 链,表示这些流量可以继续通过(通常是已建立的连接或会话)。

6. 第六条规则:

-A neutron-linuxbri-o2d863922-b -j RETURN

  • -j RETURN:没有条件的 RETURN,这意味着流量直接返回,通常是默认的接受行为。

  • 由于这条规则没有指定任何过滤条件(如 -s、-d、-p 等),它会匹配所有流量。因此,只要流量经过了 neutron-linuxbri-o2d863922-b 链,它就会立即匹配到这一条规则,并且流量会跳转到 RETURN 链。这会使得其他规则(比如第 7 条和第 8 条规则)几乎没有机会被执行。。

7. 第七条规则:

-A neutron-linuxbri-o2d863922-b -m state --state INVALID -m comment --comment "Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack." -j DROP

  • -m state --state INVALID:匹配无效状态的流量,通常是一些无法匹配已建立连接的包,例如非法的 TCP ACK/FIN 包。

  • -j DROP丢弃这些无效的流量包。

8. 第八条规则:

-A neutron-linuxbri-o2d863922-b -m comment --comment "Send unmatched traffic to the fallback chain." -j neutron-linuxbri-sg-fallback

  • -j neutron-linuxbri-sg-fallback:如果流量没有匹配前面所有的规则,它将跳转到 neutron-linuxbri-sg-fallback 链,进行进一步的安全组处理。

🧑‍💻 出站流量安全组链小

这些规则主要负责处理 虚拟机到外部网络的出站流量,特别关注 DHCP 流量和安全性。它们的作用包括:

  1. 允许 DHCP 客户端的流量通过(源端口 68,目标端口 67)。

  2. 防止虚拟机进行 DHCP 欺骗(丢弃源端口 67,目标端口 68 的流量)。

  3. 允许已知会话的流量通过,跳转到 RETURN 链。

  4. 丢弃无效的、无法匹配已知连接的流量(如无效的 TCP 包)。

  5. 未匹配的流量被送到回退链(fallback),进行额外的安全组处理。

九、总结

OpenStack安全组是在计算节点本机上,通过iptables实现,不是在虚机(实例)中实现。

相关文章:

OpenStack Yoga版安装笔记(十七)安全组笔记

一、安全组与iptables的关系 OpenStack的安全组&#xff08;Security Group&#xff09;默认是通过Linux的iptables实现的。以下是其主要实现原理和机制&#xff1a; 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…...

开源身份和访问管理方案之keycloak(三)keycloak健康检查(k8s)

文章目录 开源身份和访问管理方案之keycloak&#xff08;三&#xff09;keycloak健康检查启用运行状况检查 健康检查使用Kubernetes下健康检查Dockerfile 中 HEALTHCHECK 指令 健康检查Docker HEALTHCHECK 和 Kubernetes 探针 开源身份和访问管理方案之keycloak&#xff08;三&…...

棋盘问题(DFS)

在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放 kk 个棋子的所有可行的摆放方案数目 C…...

verilog学习--1、语言要素

先看一个例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B&#xff1b; endmodule; Verilog以module为单位编写&#xff0c;每个文件一个module&#…...

from fastmcp import FastMCP和from mcp.server.fastmcp import FastMCP的区别是什么?

文章目录 困惑以方式一开启一个mcp server,并用cline进行调用mcp install server.py修改配置文件以方式二开启MCP server困惑 一直比较困惑的是,好像用python实现mcp server有两种实现方式。 一是使用: https://github.com/modelcontextprotocol/python-sdk 二是使用: …...

QT工程建立

打开软件新建一个工程 选择chose 工程命名&#xff0c;选择保存路径&#xff0c;可以自己选择&#xff0c;但是不要有中文路径 默认的直接下一步 任意选一个下一步 点击完成 之后是这个界面&#xff0c;点击右下角的绿色三角形编译一下 实验内容 添加类 第一个是建立cpp和.h文件…...

Day82 | 灵神 | 快慢指针 重排链表

Day82 | 灵神 | 快慢指针 重排链表 143.重排链表 143. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者直接给跪了&#xff0c;这个难度真是mid吗 直接去看灵神的视频 环形链表II【基础算法精讲 07】_哔哩哔哩_bilibili 1.简单来说就是&#xf…...

TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测(Matlab完整源码和数据)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 2.运行环境为Matlab2023b&#xff1b; 3.data为数据集&#xff0c;输入多个特征&#xff0c;输出单个变量&a…...

语法: lcd_load( buffer_pointer, offset, length);

LCD_LOAD() 语法: lcd_load( buffer_pointer, offset, length); 参数: buffer_pointer指向发送给LCD的用户数据; offset是用来将该数据写入LCD,用作进入LCD segment memory的偏移量; length是传送的字节数. 要求: 没有. 功能: 该函数将从CPU的buffer_pointer存储区…...

分治(8题)

目录 一、快排 1.颜色分类 2.排序数组 3.数组中的第k个最大元素 4.最小的K个数 二、归并 1. 排序数组 2.数组中的逆序对 3.计算右侧小于当前元素的个数 4.翻转对 一、快排 1.颜色分类 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; left和right&#xff0c;初…...

【9】数据结构的串篇章

目录标题 串的定义顺序串的实现初始化赋值打印串求串的长度复制串判断两个串长度是否相等连接两个串比较两个串内容是否相等插入操作删除操作调试与代码合集 串的模式匹配算法朴素的模式匹配算法KMP算法实现模式匹配 串的定义 定义&#xff1a;由0个或多个字符组成的有限序列&…...

Linux file命令

目录 一. file命令简介二. -b 输出结果不显示文件名三. --mime 输出文件的MIME类型字符串四. 批量确认文件类型4.1 -f 从指定的文件中读取文件路径&#xff0c;显示其文件类型4.2 配合find命令查找确认 一. file命令简介 由于Linux系统并不是像Windows系统那样通过扩展名来定义…...

ARM-UART

时钟选择PLCK,超时3ms自动发送&#xff0c;设置发送8位的缓冲区&#xff0c;且发送中断 设置触发深度&#xff0c;达到8字节将缓冲区数据发憷 中断处理函数...

AFT3 Engine传奇世界AFT3代引擎源码

此AFT3代引擎源码&#xff0c;不是老AFT0330版本&#xff0c;应该是WeiAFT的源码 本源码为新AFT3引擎源码&#xff0c;直接电脑打包出来&#xff0c; 现在市面上使用的AFT3引擎都是用的此款&#xff0c;下载编译即用 链接: https://pan.baidu.com/s/1Zxa64AQ7MUsdV2iIrqiTEg 提…...

[ 3分钟算法 ] | 递归搜索题目 : 翻转链表(递归版)

目录 1. 题目链接&#xff1a; 2. 思路分析&#xff1a; 思路一&#xff1a;从宏观上看 思路二&#xff1a;将链表看成一颗树 3. 代码 1. 题目链接&#xff1a; LCR 024. 反转链表 2. 思路分析&#xff1a; 思路一&#xff1a;从宏观上看 让当前节点后面的链表先逆置&…...

左值与右值,空间与数据

左值是空间&#xff0c;右值是数据 编程总是对“数据”&#xff0c;对"存放数据的空间"操作 a返回一个当前的数据&#xff0c;存放到一个临时空间中&#xff0c;自身的空间中的数据再进行运算 a直接对自身空间中的数据进行运算 其余知识&#xff1a; 1.变量名的意…...

线程池/内存池/mysql连接池

线程池介绍 ①线程池定义&#xff1a; 维持和管理固定数量线程的结构&#xff0c;用于解决资源频繁创建和销毁的问题。 ②线程池组成&#xff1a; 固定数量的线程、队列、任务状态管理。 ④线程池的作用&#xff1a; 避免频繁创建和销毁线程&#xff0c;管理线程状态&…...

图解AUTOSAR_SWS_FlexRayARTransportLayer

FlexRay AUTOSAR 传输层 (FrArTp) 分析 1. AUTOSAR FlexRay 传输层架构 1.1 FlexRay AUTOSAR 传输层在AUTOSAR架构中的位置 AUTOSAR分层架构中,FlexRay AUTOSAR 传输层(FrArTp)位于通信抽象层,其上方是PDU路由器,下方是FlexRay接口。FrArTp的主要功能是实现FlexRay网络上的…...

【百日精通JAVA | SQL篇 | 第四篇】约束

SQL这一块没什么难度&#xff0c;主要是一个熟练度&#xff0c;稍微上点难度的地方&#xff0c;其实在于查&#xff0c;比较复杂&#xff0c;涉及到很多问题。 指定列插入 使用指定列插入的时候&#xff0c;未被指定的列使用默认值进行存储&#xff0c;默认值为空。 默认值设置…...

QEMU源码全解析 —— 块设备虚拟化(16)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(15) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社...

实验:IS-IS认证。

一、IS-IS认证的定义与作用分析 ‌IS-IS认证是什么&#xff1f;‌ IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;协议是用于自治系统内部的路由协议&#xff0c;其认证机制主要用于保障路由信息交换的安全性&#xff0c;包括‌邻居关系建立‌和‌…...

11-产品经理-创建产品

在“产品”-“仪表盘”内&#xff0c;可以查看系统中关于产品及相关需求的统计。 在“产品”-“产品列表”页面&#xff0c;可以按项目集、项目查看其关联产品。还可以添加产品、编辑产品线、或者导出产品列表。 产品看板&#xff0c;通过看板方式查看产品、产品计划和产品下的…...

玄机-应急响应-入侵排查

靶机排查目标&#xff1a; 1.web目录存在木马&#xff0c;请找到木马的密码提交 查看/var/www/html。 使用find命令查找 find ./ -type f -name "*.php | xargs grep "eval("查看到1.php里面存在无条件一句话木马。 2.服务器疑似存在不死马&#xff0c;请找…...

MySQL基础知识(通俗版)

MySQL基础知识&#xff08;通俗版&#xff09; 一、MySQL基础概念 1.1 MySQL简介 想象MySQL就像一个超级大的Excel表格&#xff0c;但它比Excel更强大&#xff1a; 可以同时处理成千上万的数据可以保证数据的安全性和一致性可以支持多人同时操作可以自动备份和恢复数据 1.…...

python逆向:喜马拉雅登录案例

网址&#xff1a;登录 1. 点击到网页主页 先随便输入电话号码和密码 打开开发者工具&#xff0c;点击网络清空&#xff0c;然后点击登录发起网络请求 &#xff08;出现一个请求包&#xff0c;我们发现不是我们所需要的&#xff09; 我们进行验证滑块&#xff0c;就又出来请求…...

windows AndroidStudio上传maven中央仓库

一、插件地址&#xff1a;https://github.com/vanniktech/gradle-maven-publish-plugin?tabreadme-ov-file 二、Maven中心&#xff1a;https://vanniktech.github.io/gradle-maven-publish-plugin/central/ 2.1、中央门户帐户&#xff0c;用github账号登陆&#xff1a;gh122…...

嵌入式学习(35)-STM32F103 TXE 和TC

在USART的发送端有2个寄存器&#xff0c;一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志&#xff0c;一个是TXE发送数据寄存器空&#xff0c;另一个是TC发送结束。 当USART_DR中的数据传送到移位寄存器后&#xff0c;TXE被设…...

linux Gitkraken 破解

ubuntu 安装 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客...

Qwen-Agent框架的文件相关操作:从Assistant到BasicDocQA

在前面的几篇文章如《针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析&#xff1a;Agent基类篇》 、《基于Qwen-Agent框架的Function Call及ReAct方式调用自定义工具》、 《针对Qwen-Agent框架的源码阅读与解析&#xff1a;FnCallAgent与ReActChat篇》中&#xff0c…...

2025年3月15日(5mw)

根据《NREL/TP-500-38060技术报告》&#xff0c;NREL 5-MW参考风力机的各部件质量及总体质量数据如下&#xff1a; 各部件质量数据 叶片&#xff08;Blades&#xff09; 单叶片质量&#xff1a;17,740 kg&#xff08;见表2-2&#xff09;总数&#xff1a;3片总质量&#xff1a;…...

docker mysql 笔记250406

docker mysql 笔记250406 以下是使用 Docker 运行 MySQL 的完整指南&#xff0c;包含常见配置和最佳实践&#xff1a; 1. 快速启动 MySQL 容器 docker run -d \--name mysql_db \-e MYSQL_ROOT_PASSWORDmy-secret-pw \-p 3306:3306 \mysql:8.02. 关键配置说明 2.1 环境变量&…...

ceph集群架构阐述

ceph集群架构阐述 ​ 首先&#xff0c;ceph集群也是分为客户端和服务端的&#xff0c;是一种高效的分布式存储系统&#xff0c;我们将其拆分为这两个部分来进行分析。 ​ 我大致的将服务端分为API类型、逻辑层、OSD层三个层面进行分析&#xff1b;将客户端按三种API类型挂载、…...

《Java八股文の文艺复兴》第十篇:量子永生架构——对象池的混沌边缘

目录 卷首语&#xff1a;蝴蝶振翅引发的量子海啸 第一章&#xff1a;混沌初开——对象池的量子涅槃&#xff08;深度扩展&#xff09; 第二章&#xff1a;混沌计算——对象复活的降维打击&#xff08;技术深化&#xff09; 第三章&#xff1a;量子试炼场——亿万级对象池全…...

(linux操作系统)程序地址空间

程序地址空间是什么&#xff1f; 讲这个问题之前&#xff0c;我们先来看一段熟悉的代码&#xff0c;以前学习C语言或者C语言时&#xff0c;就听说过程序内存分布&#xff0c;堆区&#xff0c;栈区&#xff0c;静态区&#xff0c;常量区&#xff0c;共享区&#xff0c;代码段&am…...

专业抑郁测试工具:让心理健康评估更简单

专业抑郁测试工具&#xff1a;让心理健康评估更简单 在这个快节奏的社会中&#xff0c;心理健康问题越来越受到人们的关注。为了帮助大家更好地了解自己的心理状态&#xff0c;我们开发了一款专业的在线抑郁测试工具。这个工具基于科学的心理量表设计&#xff0c;为用户提供准…...

C语言中单向链表:创建节点与插入新节点

一. 简介 单链表是一种常见且基础的数据结构&#xff0c;由一系列节点组成&#xff0c;每个节点包含数据和一个指向下一个节点的指针。 本文简单学习一下C语言中如何实现单项链表。 二. C语言实现单向链表 单向链表&#xff1a;单向链表是一种线性数据结构&#xff0c;由一…...

jsoncpp的使用

json提供的几个类&#xff1a; Value类&#xff1a;将json支持的数据类型进行包装&#xff0c;最终得到一个Value类型 FastWriter类&#xff1a;将Value对象中的数据序列化为字符串&#xff0c;序列化后可以得到json格式的字符串 Reader类&#xff1a;反序列化&#xff0c;将…...

【最新版】啦啦外卖v64系统独立版源码+全部小程序APP端+安装教程

一.系统介绍 啦啦外卖跑腿平台独立版&#xff0c;使用的都知道该系统功能非常强大&#xff0c;应该说是目前外卖平台功能最全的一套系统。主要是功能非常多&#xff0c;拿来即用&#xff0c;包括客户端小程序、配送端小程序、商户端小程序&#xff0c;还有对应四个端的APP源码…...

13-产品经理-产品多分支平台管理

禅道16.0版本开始&#xff0c;优化和增强了产品的分支/平台功能&#xff0c;主要特点如下&#xff1a; 多分支/平台功能兼容各种大小型项目&#xff0c;项目/迭代可以关联对应产品的某个分支/平台。分支/平台支持灵活管理&#xff0c;可以把分支/平台理解为时间层面的概念&…...

AI在医疗领域的应用

人工智能对医疗领域的革命性影响 一、智能诊断系统的突破 病理识别准确率提升乳腺癌检测准确率达94.6%(2023《Nature Medicine》)皮肤癌诊断灵敏度超过专业医师12%多模态诊断整合融合CT/MRI影像+基因组数据+电子病历急性肾损伤预测提前48小时(DeepMind)二、药物研发范式革…...

LabVIEW 在故障诊断中的算法

在故障诊断领域&#xff0c;LabVIEW 凭借其强大的图形化编程能力、丰富多样的工具包以及卓越的功能性能&#xff0c;成为工程师们进行故障诊断系统开发的得力助手。通过运用各种算法&#xff0c;能够对采集到的信号进行全面、深入的分析处理&#xff0c;从而准确地诊断出系统中…...

(自用)WebSocket创建流程

在Spring Boot项目中新建WebSocket服务&#xff0c;可以按照以下详细步骤进行操作&#xff1a; 1.创建Spring Boot项目 可以通过Spring Initializr&#xff08;<>&#xff09;快速创建一个新的Spring Boot项目&#xff0c;添加Spring Web和Spring Boot DevTools依赖&…...

C++多线程编码二

1.lock和try_lock lock是一个函数模板&#xff0c;可以支持多个锁对象同时锁定同一个&#xff0c;如果其中一个锁对象没有锁住&#xff0c;lock函数会把已经锁定的对象解锁并进入阻塞&#xff0c;直到多个锁锁定一个对象。 try_lock也是一个函数模板&#xff0c;尝试对多个锁…...

【最新版】金媒婚恋系统v10.5最新稳定开源+原生前端小程序 PC端+安装教程

一.系统简介 1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好&#xff0c; 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务&#xff0c;通过红娘的介入&#xff0c;提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管…...

[spring] spring AOP - 面向切面编程の学习

[spring] spring AOP - 面向切面编程の学习 几年前开始还在被 spring 的八股文时&#xff0c;AOP 就是一个比较热也比较大的点&#xff0c;为了面试确实背过不少&#xff0c;不过 AOP 实现本身做的不多&#xff0c;一方面也是因为 AOP 一旦配置好了基本上就不需要改什么&#…...

JavaScript 中的 Reflect 详解

Reflect 是 ES6引入的一个内置对象&#xff0c;它提供了一系列静态方法来操作对象&#xff0c;这些方法与 Proxy 处理器方法一一对应。Reflect 的设计目的是为了更优雅地操作对象&#xff0c;并统一某些操作的行为。 1. Reflect 的基本特点 1. 不是构造函数&#xff1a;不能使…...

【操作系统】linux常用命令

UP作为一个Linux系统练习两年半的个人练习生&#xff0c;今天分门别类地给大家整理一下常用的Linux命令&#xff0c;祝大家在Linux练习之路一帆风顺。 文件和目录操作 文件查看与编辑 文件查找 文件权限与所有权 进程管理 系统信息与监控 网络管理与诊断...

002 vue组件化编程

文章目录 一般方式全局组件局部组件 组件&#xff08;Component&#xff09;是Vue.js最强大的功能之一 组件也是一个Vue实例&#xff0c;也包括&#xff1a;data、methods、生命周期函数等 组件渲染需要html模板&#xff0c;所以增加了template属性&#xff0c;值就是HTML模板 …...

常见的 JavaScript 框架和库

在现代前端开发中&#xff0c;JavaScript框架和库成为了构建高效、可维护应用程序的关键工具。本文将介绍四个常见的JavaScript框架和库&#xff1a;React、Vue.js、Angular 和 Node.js&#xff0c;并探讨它们的特点、使用场景及适用场合。 1. React — 构建用户界面的JavaScri…...

005_循环结构

循环结构 循环结构的作用和应用场景for循环while循环for和while的使用规范do - while 死循环循环嵌套break、continueRandom生成随机数 循环结构的作用和应用场景 减少代码的重复编写、灵活的控制程序的执行 for循环 for (1初始化语句; 2循环条件; 3迭代语句){4循环体语句(重…...