連接管理器 (ConnMan) 是一個(gè)連接管理守護(hù)程序 (connmand),用于管理運(yùn)行 Linux 操作系統(tǒng)的設(shè)備內(nèi)的互聯(lián)網(wǎng)連接。它提供低內(nèi)存消耗,對(duì)不斷變化的網(wǎng)絡(luò)條件做出快速、一致、同步的反應(yīng)。
ConnMan具有各種插件,是一個(gè)完全模塊化的系統(tǒng),可以擴(kuò)展以支持各種有線或無(wú)線技術(shù)。插件方法允許針對(duì)各種用例輕松進(jìn)行調(diào)整和修改。DHCP 和域名解析等配置方法是使用插件實(shí)現(xiàn)的。
所有應(yīng)用程序都應(yīng)使用 D-Bus 與康曼通信。它與嵌入式Yocto構(gòu)建系統(tǒng)一起使用,是GENIVI車載信息娛樂(lè)規(guī)范的一部分。
康文在 GPL v2.0 許可證下分發(fā)。英特爾是康曼項(xiàng)目的主要貢獻(xiàn)者。
康曼建筑
康曼內(nèi)部基礎(chǔ)設(shè)施
功能和特性
連接管理器中內(nèi)置了以下功能:
- 通用插件基礎(chǔ)架構(gòu)
- 設(shè)備和網(wǎng)絡(luò)抽象(具有基本存儲(chǔ)支持)
- IPv4、IPv4-LL(鏈路本地)和 DHCP - IPv6、DHCPv6 和 6to4 隧道
- 高級(jí)路由和 DNS 配置
- 內(nèi)置 DNS 代理和智能緩存
- 內(nèi)置 WISPr 熱點(diǎn)登錄和門戶檢測(cè)
- 時(shí)間和時(shí)區(qū)配置(手動(dòng)和自動(dòng)使用 NTP)
- 代理處理(手動(dòng)和自動(dòng)使用 WPAD)
- 網(wǎng)絡(luò)共享支持(USB、藍(lán)牙和無(wú)線網(wǎng)絡(luò)接入點(diǎn)模式)
- 詳細(xì)的統(tǒng)計(jì)信息處理(家庭和漫游)
可以為網(wǎng)絡(luò)支持啟用各種插件:
- 以太網(wǎng)插件
- 具有 WEP40/WEP128 和 WPA/WPA2(個(gè)人和企業(yè))的無(wú)線插件
- 藍(lán)牙插件(使用藍(lán)牙Z)
- 2G/3G/4G 插件(使用網(wǎng)絡(luò))
還具有附加功能的普金斯:
- 環(huán)回接口設(shè)置
- PACrunner 代理處理
- 策略工具包授權(quán)支持
康曼 D-總線接口
D 總線接口
- 應(yīng)用程序應(yīng)使用 D-Bus 與康曼通信。
- 主入口點(diǎn)通過(guò)管理器對(duì)象。
- 管理器對(duì)象包含對(duì)服務(wù)對(duì)象的引用(接口)。
- 其他接口包括 VPN、時(shí)鐘、任務(wù)、技術(shù)、會(huì)話、通知、對(duì)等、代理和計(jì)數(shù)器。
管理器 D 總線接口
- 應(yīng)用程序入口點(diǎn)是管理器對(duì)象
- 解釋了所有方法和屬性
管理器屬性
檢索所有全局屬性的簡(jiǎn)單方法如下所示:
- 總線 = 數(shù)字總線。系統(tǒng)總線()
- 管理器 = 總線。Interface(bus.get_object(“net.connman”, “/”), “net.connman.Manager”)
- 屬性 = 管理器。獲取屬性()
更改全局屬性也非常簡(jiǎn)單。例如,啟用所謂的脫機(jī)模式(AKA 飛行模式)就足以設(shè)置該屬性:管理器。SetProperty(“OfflineMode”, dbus.布爾值(1))。
服務(wù)接口
高級(jí)界面使用戶界面可以輕松訪問(wèn)網(wǎng)絡(luò)詳細(xì)信息和用戶選擇的首選項(xiàng)。這是服務(wù)列表和接口。ConnMan 維護(hù)著一個(gè)包含所有可用服務(wù)的平面和排序列表。
服務(wù)訂單
Servicestates
- 每個(gè)服務(wù)的基本狀態(tài)都是“空閑”。這意味著此服務(wù)目前根本沒(méi)有在使用中。它也沒(méi)有嘗試連接或執(zhí)行任何其他操作。
- “關(guān)聯(lián)”狀態(tài)表示此服務(wù)嘗試建立與網(wǎng)絡(luò)的低級(jí)連接 - 例如,與WiFi接入點(diǎn)關(guān)聯(lián)/連接。
- 在“配置”狀態(tài)下,服務(wù)指示它正在嘗試檢索/配置 IP 設(shè)置。
- “就緒”狀態(tài)表示設(shè)備已成功連接。這并不意味著它具有默認(rèn)路由,但基本 IP 操作將成功。
- 在“斷開(kāi)連接”狀態(tài)下,服務(wù)指示它將終止當(dāng)前連接,并將返回到“空閑”狀態(tài)。
- 此外,“失敗”狀態(tài)表示錯(cuò)誤行為。它類似于“空閑”狀態(tài),因?yàn)榉?wù)未連接。
服務(wù) D 總線接口
下面介紹如何獲取服務(wù)對(duì)象:
-properties = manager.GetProperties() -for path in properties["Services"]: service = dbus.Interface(bus.get_object("net.connman", path), "net.connman.Service")
它還包含連接或斷開(kāi)特定服務(wù)的方法。ConnMan 還可以根據(jù)他的策略或通過(guò)外部事件(如插入以太網(wǎng)電纜)自動(dòng)連接服務(wù)。手動(dòng)連接(或斷開(kāi))特定服務(wù)就像告訴它一樣簡(jiǎn)單。
connect: service.Connect() or service.Disconnect()
服務(wù)屬性
技術(shù)接口
基本的設(shè)備配置任務(wù)由技術(shù)接口完成。例如,打開(kāi)和關(guān)閉設(shè)備(例如通過(guò)RFKILL)應(yīng)通過(guò)技術(shù)接口完成。
技術(shù)特性
用戶可以通過(guò)管理器脫機(jī)模式屬性激活脫機(jī)(飛行)模式。在離線模式下,包括以太網(wǎng)在內(nèi)的所有技術(shù)都已關(guān)閉電源。在脫機(jī)模式下,用戶可以通過(guò)使用 rfkill 命令或某些便攜式計(jì)算機(jī)中的 Fn-Fx 組合鍵,通過(guò)“技術(shù)支持”屬性臨時(shí)激活單個(gè)技術(shù)。
康曼內(nèi)部
啟動(dòng)連接
選項(xiàng):
-c, --config=FILE Load the specified configuration file instead of /usr/local/etc/connman/main.conf -d, --debug=DEBUG Specify debug options to enable -i, --device=DEV Specify networking device or interface -I, --nodevice=DEV Specify networking interface to ignore -p, --plugin=NAME,... Specify plugins to load -P, --noplugin=NAME,... Specify plugins not to load -W, --wifi=NAME Specify driver for WiFi/Supplicant -n, --nodaemon Don't fork daemon to background -r, --nodnsproxy Don't enable DNS Proxy --nobacktrace Don't print out backtrace information
用法示例:
# CONNMAN_SUPPLICANT_DEBUG=1 connmand -n -d &> connman.log #connmand -i wlan0 -I eth0 --nodnsproxy --nodaemon >& connman.log
主配置文件
主要.conf
InputRequestTimeout = 120 (default)---------> input request ( ex. passphrase) timeout BrowserLaunchTimeout = 300 ( default) -----> The request for launching a browser for portal pages BackgroundScanning = true --------------------> option for background scanning FallbackTimeservers = --------------------------> List of fallback timeservers ( used by NTP sync) separated by "," FallbackNameservers = -------------------------> List of fallback nameservers DefaultAutoConnectTechnologies = -----------> List of technologies that are marked autoconnectable by default. PreferredTechnologies = ------------------------> List of preferred technologies from - most preferred one to least preferred NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb- ---> List of blacklisted network interfaces AllowHostnameUpdates = true -----------------> Allow connman to change the system hostname ( ex. dhcp hostname option) SingleConnectedTechnology = false -----------> Keep only a single connected technology at any time TetheringTechnologies = wifi,bluetooth,gadget PersistentTetheringMode = false --------------> Restore earlier tethering status when returning from offline mode Enable6to4 = false ------------------------------> Automatically enable Anycast 6to4 if possible (not recommended. see RFC6343 ) EnableOnlineCheck = false --------------------> Enable use of http get as on online status check AlwaysConnectedTechnologies = -------------> List of technologies with AutoConnect = true which are always connected regardless of PreferredTechnologies setting
康曼配置文件
康曼使用配置文件來(lái)配置現(xiàn)有服務(wù)。康曼將在 /var/lib/康曼/ 中尋找其配置文件。配置文件名不得包含字母或數(shù)字以外的其他字符,并且必須具有 .config 后綴。
Ex. #cat /var/lib/connman/example.config [global] Name = Example Description = Example network configuration [service_home_ethernet] Type = ethernet IPv4 = 192.168.1.42/255.255.255.0/192.168.1.1 IPv6 = 2001:db8::42/64/2001:db8::1 MAC = 01:02:03:04:05:06 Nameservers = 10.2.3.4,192.168.1.99 SearchDomains = my.home,isp.net Timeservers = 10.172.2.1,ntp.my.isp.net Domain = my.home [service_home_wifi] Type = wifi Name = my_home_wifi Passphrase = secret IPv4 = 192.168.2.2/255.255.255.0/192.168.2.1 MAC = 06:05:04:03:02:01
設(shè)置
為用戶經(jīng)常連接到的網(wǎng)絡(luò)自動(dòng)創(chuàng)建設(shè)置和配置文件。
# cat /var/lib/connman/settings [global] OfflineMode=false [WiFi] Enable=true Tethering=false [Bluetooth] Enable=false Tethering=false
配置文件設(shè)置按其服務(wù)名稱存儲(chǔ)在 /var/lib/connman/ 下的目錄中。VPN設(shè)置可以在 /var/lib/康曼-vpn/ 中找到。
編寫插件
基本插件包含通過(guò)CONNMAN_PLUGIN_DEFINE的插件描述,以及通過(guò)該描述定義的初始化/退出回調(diào)。
#include static int example_init(void) { return 0; } static void example_exit(void) { } CONNMAN_PLUGIN_DEFINE(example, "Example plugin", CONNMAN_VERSION, example_init, example_exit)
插件使用技術(shù)、網(wǎng)絡(luò)和設(shè)備以及其他基礎(chǔ)結(jié)構(gòu)與 ConnMan 的核心功能進(jìn)行交互。以下是技術(shù)基礎(chǔ)架構(gòu):
ex. bluetooth plugin static struct connman_technology_driver tech_driver = { .name = "bluetooth", .type = CONNMAN_SERVICE_TYPE_BLUETOOTH, .probe = bluetooth_tech_probe, .remove = bluetooth_tech_remove, .set_tethering = bluetooth_tech_set_tethering, };
若要使連接管理器了解新的技術(shù)插件,我們需要通過(guò)調(diào)用connman_technology_driver_register()來(lái)注冊(cè)其驅(qū)動(dòng)程序。
connman_technology_driver_register(&tech_driver);
設(shè)備基礎(chǔ)結(jié)構(gòu)
設(shè)備表示給定技術(shù)的真實(shí)設(shè)備。每種技術(shù)可能有許多設(shè)備。
static struct connman_device_driver device_driver = { .name = "bluetooth", .type = CONNMAN_DEVICE_TYPE_BLUETOOTH, .probe = bluetooth_device_probe, .remove = bluetooth_device_remove, .enable = bluetooth_device_enable, .disable = bluetooth_device_disable, };
要注冊(cè)驅(qū)動(dòng)程序:
connman_device_driver_register(&device_driver);
此外,需要為每個(gè)插件編寫代碼來(lái)處理新設(shè)備的檢測(cè);藍(lán)牙插件通過(guò)為 BlueZ D-Bus 接口注冊(cè)觀察程序來(lái)實(shí)現(xiàn)此目的。一旦出現(xiàn)新的藍(lán)牙設(shè)備,插件需要通過(guò)調(diào)用connman_device_create()來(lái)通知ConnMan核心。對(duì)于藍(lán)牙插件,調(diào)用將是:
struct connman_device *device; device = connman_device_create("bluetooth", CONNMAN_DEVICE_TYPE_BLUETOOTH)
網(wǎng)絡(luò)基礎(chǔ)設(shè)施
連接管理器為插件提供了一種方法來(lái)處理為每種類型的技術(shù)建立/處理連接的細(xì)節(jié)。對(duì)于藍(lán)牙插件,需要注冊(cè)一個(gè)connman_network_driver:
static struct connman_network_driver network_driver = { .name = "bluetooth", .type = CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN, .probe = bluetooth_pan_probe, .remove = bluetooth_pan_remove, .connect = bluetooth_pan_connect, .disconnect = bluetooth_pan_disconnect, };
然后,調(diào)用寄存器函數(shù):
connman_network_driver_register(&network_driver);
康曼源文件/基礎(chǔ)架構(gòu)
初始化函數(shù)將在運(yùn)行主循環(huán)之前在 src/main.c 中被調(diào)用。
src/util.c - /dev/urandom support src/inotify.c - used by the core (config.c) and the session policy plugin src/technology.c – used for technology interface src/notifier.c – basic notifier infrastructure src/agent.c – agent interface src/service.c – used for service interface src/peer_service.c – p2p peer service API src/peer.c – p2p peer object’s core logic src/provider.c – provider infrastructure src/network.c – network infrastructure used by plug-ins src/config.c – framework for configuration files src/device.c – device infrastructure used by plug-ins src/iptables.c – iptables support (netfilter chains and rules) src/firewall-iptables.c, nftables.c (older firewall.c) – firewall infrastructure. src/nat.c – used for NAT src/tethering.c – tethering infrastructure src/manager.c – Manager interface src/stats.c – used for storing service stats ( mmaped into memory) src/ipconfig.c – IP configuration framework src/rtnl.c – netlink support src/session.c – Allows 3rd party applications to request a network session src/resolver.c – resolver framework src/dhcp.c, dhcpv6.c – dhcp framework src/rfkill.c – rfkill interface support src/machine.c - basic systemd-hostnamed ( machine-type- “chassis”) support
康曼克特
康曼有一個(gè)標(biāo)準(zhǔn)的命令行客戶端康曼克特。它可以在2模式下運(yùn)行:
- 在命令模式下,命令作為連接命令的參數(shù)輸入,就像系統(tǒng)命令一樣。
- 交互模式是通過(guò)鍵入不帶參數(shù)的 connmanctl 來(lái)啟動(dòng)的。提示將更改為 connmanctl>以指示它正在等待用戶命令,就像 python 交互模式一樣。
康曼克特示例
示例 1.啟用和禁用無(wú)線網(wǎng)絡(luò)
$ connmanctl technologies - check for the line that says Powered: True/False. $ connmanctl enable wifi - To power the wifi on. $ connmanctl disable wifi – To power off the wifi.
啟用無(wú)線網(wǎng)絡(luò)的其他方法可能包括 - IP鏈接設(shè)置??德鼘⒆詣?dòng)處理有線連接。
示例 2.連接到開(kāi)放接入點(diǎn)
本節(jié)中的命令演示如何在命令模式下運(yùn)行 connmanctl。要掃描網(wǎng)絡(luò),康曼克特爾接受稱為技術(shù)的簡(jiǎn)單名稱。要掃描附近的 WiFi 網(wǎng)絡(luò):
$ connmanctl scan wifi To list the available networks found after a scan run (example output): $ connmanctl services *AO MyNetwork wifi_dc85de828967_68756773616d_managed_psk OtherNET wifi_dc85de828967_38303944616e69656c73_managed_psk AnotherOne wifi_dc85de828967_3257495245363836_managed_wep FourthNetwork wifi_dc85de828967_4d7572706879_managed_wep AnO6penNetwork wifi_dc85de828967_4d6568657272696e_managed_none $ connmanctl connect wifi_dc85de828967_4d6568657272696e_managed_none
您現(xiàn)在應(yīng)該已連接到網(wǎng)絡(luò)。使用 ip 地址或連接狀態(tài)進(jìn)行檢查。
示例 3.連接到受保護(hù)的接入點(diǎn)
對(duì)于受保護(hù)的接入點(diǎn),請(qǐng)向 ConnMan 守護(hù)程序提供一些信息,至少提供密碼或密碼。
$ connmanctl connmanctl> scan wifi ----- To list services: connmanctl> services connmanctl> agent on --- register the agent to handle user requests. connmanctl> connect wifi_dc85de828967_38303944616e69656c73_managed_psk
代理會(huì)要求您提供更多信息,具體取決于您要連接到的網(wǎng)絡(luò)類型。代理還將打印有關(guān)所需信息的其他數(shù)據(jù),如以下示例所示。
Agent RequestInput wifi_dc85de828967_38303944616e69656c73_managed_psk Passphrase = [ Type=psk, Requirement=mandatory ] Passphrase?
提供請(qǐng)求的信息,在此示例中為密碼,然后鍵入:
connmanctl> quit
如果您提供的信息正確無(wú)誤,您現(xiàn)在應(yīng)該已連接到受保護(hù)的接入點(diǎn)。
其他康曼克特用法:
技術(shù)
各種硬件接口被康文稱為技術(shù)。要列出可用技術(shù),請(qǐng)運(yùn)行:
$ connmanctl technologies
可以通過(guò)以下方式打開(kāi)/關(guān)閉技術(shù):
$ connmanctl enable technology_type $ connmanctl disable technology_type
例如,要關(guān)閉無(wú)線網(wǎng)絡(luò):
$ connmanctl disable wifi
康曼測(cè)試腳本
康曼還提供了基本的python腳本(例如測(cè)試康曼,列表服務(wù)等)。通過(guò)這些腳本支持連接,斷開(kāi)連接,自動(dòng)連接,服務(wù),掃描,啟用,禁用,脫機(jī)模式,狀態(tài)等基本操作。
康曼調(diào)試
激活調(diào)試
我們可以使用 -d 命令行選項(xiàng)在 ConnMan 中激活調(diào)試打印。
-d Activate all normal debug prints -d src/service.c This prints debugging info from src/service.c file only -d src/network.c:src/ipconfig.c This activates debug prints in src/network.c and src/ipconfig.c files. -d 'src/n*.c' This would activate debug print from all the C source files starting with letter 'n' in src directory. Note the quotation marks around option, that is to prevent shell expansion. -d '*/n*.c:*/i*.c' Activate debug prints for all C source files starting with letters 'n' or 'i' in any sub-directory.
子組件調(diào)試
ConnMan 的某些組件具有激活的環(huán)境變量調(diào)試打印。如果設(shè)置了環(huán)境變量,則相應(yīng)的組件將打印一些額外的調(diào)試信息。
可以使用以下環(huán)境變量:
- CONNMAN_DHCP_DEBUG:與 DHCPv4 相關(guān)的調(diào)試信息
- CONNMAN_DHCPV6_DEBUG:DHCPv6 相關(guān)的調(diào)試信息
- CONNMAN_IPTABLES_DEBUG:使用表時(shí)的額外信息
- CONNMAN_RESOLV_DEBUG:名稱解析程序調(diào)試打印。當(dāng) ConnMan 解析主機(jī)名供自己使用時(shí),將使用這些調(diào)試打印。請(qǐng)注意,DNS 代理調(diào)試打印不使用此環(huán)境變量。為此,可以使用“-d src/dns代理.c”命令行選項(xiàng)。
- CONNMAN_SUPPLICANT_DEBUG:調(diào)試打印以進(jìn)行連接和wpa_supplicant進(jìn)程之間的通信。
- v CONNMAN_WEB_DEBUG:在 Wispr 和 6to4 組件中執(zhí)行互聯(lián)網(wǎng)連接檢查時(shí),調(diào)試信息。
例:
CONNMAN_SUPPLICANT_DEBUG=1 src/connmand -n
示例:獲取CONNMAN_IPTABLES_DEBUG日志
確保在內(nèi)核中啟用了 iptables 支持:
#zcat /proc/config.gz | grep "CONFIG_IP_NF_IPTABLES"
必須在內(nèi)核中啟用 IPTABLE:
CONFIG_IP_NF_IPTABLES=m or CONFIG_IP_NF_IPTABLES=y
清除所有可測(cè)試的過(guò)濾器:
# iptables –F
設(shè)置以下可測(cè)試規(guī)則以過(guò)濾 ICMP 數(shù)據(jù)包(輸入、輸出和轉(zhuǎn)發(fā)數(shù)據(jù)包):
# iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j LOG --log-prefix="filter INPUT:" # iptables -t filter -A INPUT -p icmp --icmp-type echo-reply -j LOG --log-prefix="filter INPUT:“ # iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request -j LOG --log-prefix="filter OUTPUT:“ # iptables -t filter -A OUTPUT -p icmp --icmp-type echo-reply -j LOG --log-prefix="filter OUTPUT:“ # iptables -t filter -A FORWARD -p icmp --icmp-type echo-request -j LOG --log-prefix="filter FORWARD:“ # iptables -t filter -A FORWARD -p icmp --icmp-type echo-reply -j LOG --log-prefix="filter FORWARD:"
導(dǎo)出以下環(huán)境變量以啟用康曼的 iptables 調(diào)試:
# export CONNMAN_IPTABLES_DEBUG=1
在啟用調(diào)試選項(xiàng)的情況下啟動(dòng) Connmand 連接管理器:
# /usr/sbin/connmand -d -n -I eth0
每當(dāng)涉及 ICMP 數(shù)據(jù)包時(shí),都應(yīng)顯示康文守護(hù)程序消息日志。
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213824 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7152瀏覽量
125593
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論