Unix编程/应用问答中文版 ---10.网卡相关问题
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 <dave.peter@eu.citrix.com>
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 <scz@nsfocus.com> 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 <jadkins@peregrine.com>
不需要修改"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 <VKouevda@pcinetgw.is.bear.com>
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 <scz@nsfocus.com>
有三个文件需要注意,/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.<interface:#>文件,比如/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 - <<Host Extensions for IP Multicasting>>。
如果因为配置虚拟接口出现不期望的路由,考虑手动"route delete"。可以增加一个
启动脚本/etc/rc2.d/S99vif,用于完成这些任务。
对于Solaris 2.6,可能还需要
ndd -set /dev/ip ip_enable_group_ifs 0 (2.6下缺省是1,7下缺省是0)
将这条命令增加到/etc/rc
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 <dave.peter@eu.citrix.com>
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 <scz@nsfocus.com> 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 <jadkins@peregrine.com>
不需要修改"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 <VKouevda@pcinetgw.is.bear.com>
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 <scz@nsfocus.com>
有三个文件需要注意,/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.<interface:#>文件,比如/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 - <<Host Extensions for IP Multicasting>>。
如果因为配置虚拟接口出现不期望的路由,考虑手动"route delete"。可以增加一个
启动脚本/etc/rc2.d/S99vif,用于完成这些任务。
对于Solaris 2.6,可能还需要
ndd -set /dev/ip ip_enable_group_ifs 0 (2.6下缺省是1,7下缺省是0)
将这条命令增加到/etc/rc
Tags:Unix,编程,应用,问答,中文版,网卡,相关,问题

