分享
 
 
 

Unix编程/应用问答中文版---10.网卡相关问题

王朝system·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

本文出自:http://www.nsfocus.com 维护:小四 (2002-10-30 06:02:01)

10. 网卡相关问题

10.1 如何在程序中获取本机MAC地址

10.2 如何在Sun工作站上安装3块网卡

10.3 如何在Solaris x86上安装网卡驱动

10.4 Solaris 单网卡多IP(以太网卡别名)

10.5 如何修改主机名(hostname)

10.6 SPARC/Solaris 2.5/2.6/7/8下如何设置网卡100Mb全双工

10.7 Unix/Linux/BSD如何对抗ARP欺骗攻击

10.8

10.9

10.10

10.11 x86/Solaris如何强制设定网卡速率

10.12 Solaris/FreeBSD/Linux如何确定网卡Capability/Speed

10.13

10.14 traceroute是怎么实现的

--------------------------------------------------------------------------

10. 网卡相关问题

10.1 如何在程序中获取本机MAC地址

Q: 如何在C代码中获取本机MAC地址,我用strace跟踪ifconfig

ioctl(4, SIOCGIFHWADDR, 0xbffffb80) = 0

ioctl(4, SIOCGIFADDR, 0xbffffb80) = 0

ioctl(4, SIOCGIFBRDADDR, 0xbffffb80) = 0

ioctl(4, SIOCGIFNETMASK, 0xbffffb80) = 0

D: Unix Programmer

用gethostname()/gethostbyname()依赖于本机的域名解析系统,比如/etc/hosts文

件、/etc/nsswitch.conf文件、/etc/resolv.conf文件。这样获取本机IP是不可靠的。

如果/etc/hosts文件中没有指定本机IP,则依赖DNS是否配置了PTR资源记录。可靠的

办法应该是strace ifconfig、truss ifconfig,实际就是照ifconfig的实现去获取

本机IP。

A: David Peter

strace是Linux下的工具,由于HP-UX 10.20的ioctl不支持SIOCGIFHWADDR,可能需要

DLPI接口或者针对/dev/lan0的NETSTAT ioctl,为了使用NETSTAT ioctl还需要重启

动,而且HP不赞成继续使用NETSTAT ioctl,HP-UX 11.00不再支持。

根据手头一个古老的工具,Digital Unix下ioctl支持SIOCRPHYSADDR。至于SGI上的

IRIX,我想可能需要一个原始套接字,比如:

s = socket( PF_RAW, SOCK_RAW, RAWPROTO_SNOOP )

D: scz 2001-11-20 11:46

SPARC/Solaris下只有root用户才可以ifconfig -a看到本机MAC地址,普通用户并不

能这样做,但可以尝试在dmesg输出中查找,由于dmesg使用的数据有可能被破坏,这

个办法并不可靠。

"arp <本机IP地址>"可以看到本机MAC地址,使用的技术实际上就是前面编程演示的

ioctl( s, SIOCGARP, &arpreq )

此外还可以用如下命令获取本机MAC地址

ndd /dev/arp arp_cache_report | grep MYADDR

10.2 如何在Sun工作站上安装3块网卡

Q: 我想在Sun工作站上安装3块网卡,怎么办

A: Santosh

请遵循如下步骤

1) 在Sun工作站上增加网卡

2) 用boot -r启动系统

3) 观察启动信息,确认每块网卡都被识别出来,比如这种信息

PCI-device: network@1,1, hme #0

SUNW,hme0 is /pci@1f,4000/network@1,1

实际中如果每块网卡都被识别出来,有hme0、hme1 和 hme2,当然1和2可能不是

这个名字。

4) 到/etc目录下创建hostname.hme0、hostname.hme1 和 hostname.hme2。在每个文

件中分别指定IP地址,编辑/etc/hosts文件增加相应入口。

5) 重启机器

10.3 如何在Solaris x86上安装网卡驱动

A: James Adkins

不需要修改"pcn.conf"文件。开始我只是"touch /reconfigure",Solaris x86检测

到了网卡,但是"ifconfig -a"的时候只有loopback接口,于是我尝试如下步骤:

# drvconfig

# devlinks

# touch /reconfigure

重启动后一切ok

10.4 Solaris 单网卡多IP(以太网卡别名)

Q: 对于Solaris 2.5.1来说,可以在一块物理网卡上配置多个IP地址

A: Sun Microsystems 1998-03-31

下面以lance ethernet (le0) 设备为例说明

1) 编辑/etc/hosts文件

128.195.10.31 myhost

128.195.10.46 myhost2

128.195.10.78 myhost3

2) 创建/etc/hostname.le0:n文件,注意hostname.le0:0就是hostname.le0

/etc/hostname.le0 (Contains name myhost)

/etc/hostname.le0:1 (Contains name myhost2)

/etc/hostname.le0:2 (Contains name myhost3)

注意这种文件就一行内容,主机名。

3) 如果想立即生效

% ifconfig le0:1 up

% ifconfig le0:1 129.153.76.72

% ifconfig le0:1 down

Q: Solaris 8下如何给一块以太网卡赋予多个IP地址?

A: Vadim V. Kouevda

ifconfig le0 plumb

ifconfig le0 ether 0:1:2:3:4:5

ifconfig le0:1 plumb

ifconfig le0:1 ... up

ifconfig le0:2 plumb

ifconfig le0:2 ... up

到/etc/init.d目录下修改IP地址、子网掩码等设置。

D: scz

有三个文件需要注意,/etc/rcS.d/S30rootusr.sh(/etc/init.d/rootusr)、

/etc/rc2.d/S69inet(/etc/init.d/inetinit)和/etc/rc2.d/S72inetsvc

(/etc/init.d/inetsvc)。

Q: 如何在一块物理网卡上绑定多个IP地址

A: Sun Microsystems 1997-10-27

所谓虚拟网络接口指一个物理接口多个不同IP地址,Solaris允许一个物理网络接口

对应多个逻辑接口,换句话说,即使只有一块网卡,也可以配置多个IP地址。参看

ifconfig(1M)手册页。对于Solaris 2.x,可以在一块网卡上绑定256个不同IP地址。

Sun OS 4.x(Solaris 1.x)不支持。

/usr/sbin/ndd -get /dev/ip ip_addrs_per_if

对于Solaris 2.6,通过ndd可以配置超过256(0-255)个IP地址。

/usr/sbin/ndd -set /dev/ip ip_addrs_per_if 1-8192

将这条命令增加到/etc/rc2.d/S69inet启动脚本中去。

1) 编辑/etc/hosts文件(或者nis host map),为每个虚拟接口增加条目。别忘记修

改NIS、NIS+、DNS数据库。

2) 为每个接口创建/etc/hostname.文件,比如/etc/hostname.le0:1、

hostname.le0:2、hostname.le0:3 ... le0:255。文件内容为单行IP地址或者主

机名。比如创建如下文件

/etc/hostname.le0:1 (不要使用le0:0,那就是le0)

/etc/hostname.le0:2

Solaris 2.5.1下最多1024个虚拟接口。每个文件内容是自己对应的虚拟接口IP地

址或者主机名。

3) 如果使用了子网,应该在/etc/netmasks中增加

network_address netmask

157.145.0.0 255.255.255.0

4) 重启系统

5) ifconfig -a验证之

某些第三方应用程序此时可能会出问题。出于安全考虑,可以

ndd -set /dev/ip ip_forwarding 0

ndd -set /dev/ip ip_strict_dst_multihoming 1

参看RFC1112 - <>。

如果因为配置虚拟接口出现不期望的路由,考虑手动"route delete"。可以增加一个

启动脚本/etc/rc2.d/S99vif,用于完成这些任务。

对于Solaris 2.6,可能还需要

ndd -set /dev/ip ip_enable_group_ifs 0 (2.6下缺省是1,7下缺省是0)

将这条命令增加到/etc/rc2.d/S69inet启动脚本中去。

10.5 如何修改主机名(hostname)

Q: Solaris 2.6下如何修改主机名(hostname)

A: Herve Poussin

需要修改如下文件

/etc/hosts

/etc/hostname.

/etc/nodename

/etc/net/*/hosts (3 files, man -s 7D ticotsord)

如果你运行在VxVM下,则应该

# vxdctl hostid

# vxdctl init

10.6 SPARC/Solaris 2.5/2.6/7/8下如何设置网卡100Mb全双工

Q: 我从SPARC连接3Com交换机时,总是使用半双工,如何配置网卡强行使用100Mb全

双工

A: Martin Scerri

下列回答来自"Sun管理员FAQ 12.3",并且只适合于Solaris 2.5及其以后版本,

Sun OS 4.x及其更早版本不支持hme接口。

一般网卡可以和交换机自动协商使用100Mb全双工,如果协商失败,可能看到诸如

"late collision"一类的消息,出现丢包甚至完全不能工作的现象。为了强行指定使

用某一确定的工作模式,比如100Mb FD,可以用ndd做如下操作:

# 指定操作hme0接口

ndd -set /dev/hme instance 0

# 关闭自动协商

ndd -set /dev/hme adv_autoneg_cap 0

# 打开100Mb FD支持

ndd -set /dev/hme adv_100fdx_cap 1

# 关闭100Mb HD支持

ndd -set /dev/hme adv_100hdx_cap 0

# 关闭10Mb FD支持

ndd -set /dev/hme adv_10fdx_cap 0

# 关闭10Mb HD支持

ndd -set /dev/hme adv_10hdx_cap 0

同样需要在对端(比如交换机)强行指定使用100Mb FD模式。

注意:Fast ethernet hubs 总是使用100Mb HD模式

ethernet hubs 总是使用10Mb HD模式

如果你想强行指定系统中所有hme网卡在启动时进入同一确定模式,可以在

/etc/system文件中设置,下例表示进入100Mbit FD模式:

set hme:hme_adv_autoneg_cap=0

set hme:hme_adv_100fdx_cap=1

set hme:hme_adv_100hdx_cap=0

set hme:hme_adv_10hdx_cap=0

set hme:hme_adv_10fdx_cap=0

A: Andreas.Gouder

你可以用如下命令获取当前设置

# ndd -get /dev/hme link_mode

0 半双工

1 全双工

# ndd -get /dev/hme link_status

0 Link Down

1 Link up

# ndd -get /dev/hme link_speed

0 10Mbps

1 100Mbps

10.7 Unix/Linux/BSD如何对抗ARP欺骗攻击

Q: Solaris的静态ARP表项(arp -s)还是会被动态刷新,我只确认Linux/FreeBSD的静

态ARP表项不会被动态刷新,到底有没有稍微通用点的对抗ARP欺骗攻击的方法。

A: scz

下面以Solaris系统为例说明,其他系统大同小异。

1) 建立静态ARP表

/usr/bin/touch /etc/static_arp_entry

/usr/bin/chown root:root /etc/static_arp_entry

/usr/bin/chmod 600 /etc/static_arp_entry

编辑/etc/static_arp_entry文件,输入类似内容

192.168.8.90 00:00:00:11:11:11

/usr/sbin/arp -s -f /etc/static_arp_entry

可以在/etc/rc2.d/S69inet启动脚本中增加这条命令。参看arp(1M)、arp(7P)手册页

了解更多细节。这种技术对系统影响不大,对网络影响较大,破坏了动态ARP解析过

程。Solaris系统中,静态ARP表不会过期,必须用"arp -d"手动删除。但是,

Solaris系统的静态ARP表项可以被动态刷新,仅仅依靠静态ARP表项并不能对抗ARP欺

骗攻击,相反纵容了ARP欺骗攻击,因为虚假的静态ARP表项不会自动超时消失。当然,

可以考虑利用cron机制补救之。(增加一个crontab)

为了对抗ARP欺骗攻击,对于Solaris系统来说,应该结合"禁止相应网络接口做ARP解

析"和"使用静态ARP表"的设置

2) 禁止某个网络接口做ARP解析(对抗ARP欺骗攻击)

"/sbin/ifconfig hme0 -arp"命令将禁止hme0接口做ARP解析,hme0接口不会发送/接

收ARP报文。必须配合使用静态ARP表,否则无法完成正常网络通信。参看

ifconfig(1M)了解更多细节。假设/etc/rc2.d/S69inet启动脚本中存在如下内容

/sbin/ifconfig hme0 -arp

/usr/sbin/arp -s -f /etc/static_arp_entry

假设/etc/static_arp_entry文件内容如下

192.168.8.90 00:00:00:11:11:11

这里192.168.8.90是一台PWin98,也做静态ARP设置(因为对方不会响应ARP请求报文)

arp -s 192.168.10.6 08-00-20-a8-2e-ac

此时192.168.8.90与192.168.10.6可以正常通信,并且192.168.10.6不受ARP欺骗攻

击的影响。事实上,绝大多数Unix/Linux/BSD操作系统,都可以结合"禁止相应网络

接口做ARP解析"和"使用静态ARP表"的设置来对抗ARP欺骗攻击。对于Linux/FreeBSD

系统,因为其静态ARP表项(arp -s)不会被动态刷新,所以不需要"禁止相应网络接口

做ARP解析"即可对抗ARP欺骗攻击。

10.11 x86/Solaris如何强制设定网卡速率

Q: x86/Solaris,我如何强行指定网卡的工作状态为100Mbps full-duplex,ndd(1M)

不工作

A: CERNET 水木清华 Unix版 inc 2001-10-11 20:29

x86/Solaris下的网卡驱动不支持ndd(1M)设置网卡工作状态,要达到目的,唯一的办

法是通过driver.conf(4)指定。x86/Solaris 8的iprb(7D)手册页建议使用

ForceSpeedDuplex选项。对于其它驱动,参看如下例子

vi /kernel/drv/iprb.conf <-- 用ifconfig -a确认一下

# To force full duplex operation, uncomment the following line:

# full-duplex=1;

#

# To force half duplex operation, uncomment the following line:

# full-duplex=0;

#

# To force 10Mbps operation, uncomment the following line:

# speed=10;

#

# To force 100Mbps operation, uncomment the following line:

# speed=100;

奇怪的是iprb.conf原来没有上面的内容,elxl.conf却有。注意,不同网卡是有区别

的,我试了RealTek RTL8139/8129、3Com 3C905B TX、Intel,只有Intel的可以这样

修改,RealTek RTL8029的我不确定。

D: CERNET 水木清华 Unix版 2001-10-12 10:36

由于x86下网卡驱动不支持ndd(1M)获取网卡状态,被迫使用netstat -k

ifconfig -a 找出网络接口名

netstat -k | grep ifspeed

某些x86网卡驱动支持,某些不支持,这个办法同样适合于SPARC网卡驱动,虽然后者

可以直接使用ndd(1M)。

10.12 Solaris/FreeBSD/Linux如何确定网卡Capability/Speed

A: 小四 2001-12-07 17:06

Solaris

# netstat -k hme0 | grep ifspeed

# ndd -get /dev/hme link_mode

0 半双工

1 全双工

# ndd -get /dev/hme link_status

0 Link Down

1 Link up

# ndd -get /dev/hme link_speed

0 10Mbps

1 100Mbps

FreeBSD用ifconfig就可以看到

status: active <-- 网线接到一个HUB上了

status: no carrier <-- 未接网线

Linux和Windows系列我到现在也不确认。

A: starw@smth.org

在高版本的Linux系统中net-tools包中有一个mii-tool命令,可以用于检查这些数据,

而不是溶合在ifconfig的输出中。

10.14 traceroute是怎么实现的

Q: traceroute是怎么实现的

A: 小四

traceroute(对于Windows系列是tracert)通过逐步增加TTL值的方法,发送常规IP分

组来实现。第一次发送分组时TTL为1,第一个路由器接收到该分组之后将TTL值减1,

结果为0,于是就丢弃该分组,并发回一个"TTL超时"的ICMP报文,该报文的源地址是

这第一个路由器。紧接着发送一个TTL为2的分组。注意,traceroute发送常规的UDP

报文到一个不用的UDP端口。当初考虑将路由跟踪的功能加入IP协议本身,定义一个

"路由跟踪"选项,路由器处理带有该选项的IP包时立即发回一个跟踪报文到源站点。

然而这种做法还停留在实验室阶段,因为这需要改变所有已经存在的路由器,而且在

某种程度上与端到端原则相违背。

1) 传统的Unix实现是UDP+ICMP

2) 其实从原理上TCP+ICMP也是可以的,某些Unix系统采用了这种实现

3) Windows另有一种实现,Icmp Echo Request+ICMP

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有