Linux网络设置高级指南
from:http://www.oschina.net/question/23734_117144
Linux网络设置高级指南
本文面向的是被Linux复杂的有线无线网络架构弄得头昏脑胀;或者被网上半吊子的教程弄得晕头转向;或者厌倦了Network Manager之类图形界面无穷尽的BUG(很多抄袭的是Windows,画虎不成反类猫,在一些概念上就存在错误);或者想要了解一些技术细节的,像一样我渴望获得完全驾驭的能力而不是隔靴搔痒的人。
本文需要一定的计算机网络和Linux基础,其中的大部分内容很新,基于2.6内核之后的新架构。
Linux不同发行版的软件包名称、配置文件的命名和位置都不尽相同,本文基于的是Debian/Ubuntu系统,很多内容参考了Debian Reference的第5章。
当然,本文依旧有很多不足之处,例如没有深入到Linux内核机制中去,这就需要以后进一步完善了。
静态设置
静态设置的意思是所有配置都写在配置文件中,由操作系统自动进行设置。
静态设置依赖udev、ifupdown、isc-dhcp-client、resolvconf、wireless-tools、wpasupplicant等软件包。
首先,网络的正常运行依赖于硬件设备。在系统引导或者热插拔的时候,内核通过udev将网络设备映射到用户空间的sysfs虚拟文件系统。例如:
1
2
3
4
5
|
root@X230: /sys/class/net # ls -l 总用量 0 lrwxrwxrwx 1 root root 0 7月 4 15:01 eth0 -> ../.. /devices/pci0000 :00 /0000 :00:19.0 /net/eth0 lrwxrwxrwx 1 root root 0 7月 4 15:00 lo -> ../.. /devices/virtual/net/lo lrwxrwxrwx 1 root root 0 7月 4 15:01 wlan0 -> ../.. /devices/pci0000 :00 /0000 :00:1c.1 /0000 :03:00.0 /net/wlan0 |
可以看到,系统当前存在三个网络设备:lo为回环设备;eth0为有线网卡;wlan0为无线网卡。遵循Unix“一切皆文件”的思想,其它工具都是直接或者间接地修改这些虚拟文件来达到设置目的的。
/etc/network/interfaces文件记录了所有的静态配置信息。内核在引导的时候,会自动启动标志为“auto”的设备,例如:
1
2
3
|
auto lo auto eth0 auto wlan0 |
而如果设备标志为“allow-hotplug”,那么内核在检测到热插拔事件的时候,也会自动启动。例如:
1
2
3
|
allow-hotplug lo allow-hotplug eth0 allow-hotplug wlan0 |
因为回环设备始终应该是存在的,所以/etc/network/interfaces文件的内容至少是:
1
2
|
auto lo iface lo inet loopback |
内核启动网络设备调用的是ifupdown工具,而ifupdown工具也是依赖于/etc/network/interfaces配置文件的。
对于有线(Wired)设备,物理层和数据链路层无须操作系统干预,网卡根据CSMA/CD协议就能够自行设置,所以/etc/network/interfaces文件只需包含网络层以上的配置信息,例如IP地址、子网掩码、默认网关等。例如:
1
2
3
4
|
iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 gateway 192.168.11.1 |
“默认网关”其实是路由的概念,在这里作为设备的一个属性,和IP地址子网掩码放在一起我觉得很不妥,很容易误导初学者,尤其是存在多网卡多IP地址的情况。
对于DNS,首先需要注意的是它属于应用层协议,和网络设备以及网络层并无直接联系。传统上Linux的DNS配置文件为/etc/resolv.conf,一行一个服务器IP地址。例如:
1
2
|
nameserver 218.2.135.1 nameserver 61.147.37.1 |
如果安装了resolvconf工具,那么DNS的配置会被接管,此时/etc/resolv.conf就变成了一个符号链接,链接到了resolvconf运行时候动态维护的一个文件。在这种情况下,DNS的配置也可以写到/etc/network/interfaces文件中了,例如:
1
2
3
4
5
|
iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 gateway 192.168.11.1 dns-nameservers 218.2.135.1 61.147.37.1 |
ifupdown工具会自动调用resolvconf完成DNS设置。
此处我也甚觉不妥,因为上面讲过,DNS是应用层的概念,这样写的话让初学者觉得好像DNS是网络设备的属性一样(传统Linux还真是有很多不足之处)。
如果安装了isc-dhcp-client工具,那么/etc/network/interfaces文件中就可以直接配置DHCP,例如:
1
|
iface eth0 inet dhcp |
isc-dhcp-client有自己的配置文件,可以控制从DHCP服务器上获取哪些信息(例如DNS服务器地址)。
ifupdown工具会自动调用isc-dhcp-client完成DHCP设置。
此处需要注意的是:不论resolvconf是否存在,dhclient均会直接修改/etc/resolv.conf文件(不管它是不是一个链接),不过一般情况下也没有什么问题。
对于无线(Wireless)设备,工作方式和有线设备有很大的不同(不是插上网线就能直接用的)。数据链路层的连接必须由操作系统协同完成,例如连接哪个SSID、使用哪条信道、采用什么认证方式(WEP、WPA...)。这些链路层配置信息也可以写到/etc/network/interfaces文件中以供ifupdown工具使用。
1
2
3
|
iface ath0 inet dhcp wpa-ssid homezone wpa-psk 密码 |
ifupdown工具会自动调用wpasupplicant完成WPA设置。
例如WEP的配置:
1
2
3
4
5
6
7
|
iface eth0 inet dhcp wireless-essid Home wireless-key1 0123-4567-89ab-cdef wireless-key2 12345678 wireless-key3 s:password wireless-defaultkey 2 wireless-keymode open |
ifupdown工具会自动调用wireless-tools完成WEP设置。
准静态设置
静态设置适合于网络环境固定的情况,例如服务器、办公室电脑等。如果网络环境经常有变动,但是变动都是已知的,那么可以在/etc/network/interfaces文件中写入不固定的网络配置,这些配置不对应到具体的硬件设备名,例如:
1
2
3
4
5
6
7
8
|
iface config1 inet dhcp iface config2 inet static address 192.168.11.100 netmask 255.255.255.0 gateway 192.168.11.1 dns-domain example.com dns-nameservers 192.168.11.1 |
可以手工运行ifupdown工具切换配置,例如将eth0切换到config1:
1
|
ifup eth0=config1 |
将eth0切换到config2:
1
2
|
ifdown eth0=config1 ifup eth0=config2 |
动态设置
如果网络环境经常变动而且是未知的,或者为了使用脚本等自动化工具达到完全驾驭网络的能力,那么静态和准静态设置就捉襟见肘了。
动态设置依赖iproute、isc-dhcp-client、wireless-tools、wpasupplicant等软件包,直接使用命令行,以达到最大的灵活性。
首先,/etc/network/interfaces文件仅保留回环设备lo的配置信息:
1
2
|
auto lo iface lo inet loopback |
iproute替代了过时的net-tools等工具(ifconfig)。
通过“ip link”命令可以查询到当前所有网络设备的状态和参数,例如:
1
2
3
4
5
6
7
|
root@X230:~ # ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link /loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link /ether 3c:97:0e:6d:e9:7c brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link /ether 84:3a:4b:5b:7b:c8 brd ff:ff:ff:ff:ff:ff |
可以看到当前eth0和wlan0设备都是处于关闭状态(这是显然的,因为/etc/network/interfaces文件中已经没有它们的配置信息了)。
使用“ip link set 设备名 up”命令可以启动设备,使用“ip link set 设备名 down”命令可以关闭设备。
对于有线(Wired)设备,上面讲过,无须做额外设置,链路层就可以正常工作了。
对于无线(Wireless)设备,需要使用wireless-tools、wpasupplicant完成链路层的连接。
例如扫描当前可用都无线连接,可以使用wavemon工具,或者使用“iwlist scan”命令。
例如连接Ad-Hoc。双方的essid、channel、cell(也就是iwconfig中的ap)均必须一致。双方创建连接谁先谁后都没有关系。例如:
1
|
iwconfig wlan0 mode ad-hoc essid test channel 7 ap 0E:0E:0A:3A:10:3B key off |
以上命令即刻生效。
例如连接WEP认证的无线网络:
1
|
iwconfig wlan0 essid "myhome" key 0123-4567-89 |
如果要连接WPA认证的无线网络,wireless-tools就无可奈何了,必须使用wpasupplicant。
wpasupplicant并不是像wireless-tools一样简单地用命令行配一配就可以了,它必须先启动一个服务进程,然后使用另外一个命令行工具对服务进程进行设置,而且在WIFI连接期间该服务进程必须始终运行着。
为什么不和wireless-tools做在一起呢?真怪异,真恶心!
服务进程可以以后台方式启动,也可以以前台方式启动。
后台方式:
1
|
wpa_supplicant -i wlan0 -D nl80211,wext -s -B -P /var/run/wpa_supplicant .wlan0.pid -C /var/run/wpa_supplicant |
其中:-i指定设备名;-D指定认证协议;-s -B指定在后台运行,并且调试输出到syslog中;-C参数指定“ctrl_interface”的位置,注意,wpa_supplicant是可以有配置文件的,而且配置文件中可以记录WIFI的静态配置,类似于/etc/network/interfaces的功能,但是我们这里用不到,在没有配置文件的情况下,“ctrl_interface”是必不可少的,wpa_cli通过它与之交互。
前台方式:
1
|
wpa_supplicant -i wlan0 -D nl80211,wext - dd -P /var/run/wpa_supplicant .wlan0.pid -C /var/run/wpa_supplicant |
其中,-dd表示输出更详细的调试信息。
然后使用wpa_cli进行设置。wpa_cli可以工作在交互模式,也可以命令行模式。例如在交互模式下执行如下命令加入并启用网络:
1
2
3
4
5
6
7
8
9
10
|
> add_network 0 > set_network 0 ssid "ChinaUnicom-Me" OK > set_network 0 key_mgmt WPA-PSK OK > set_network 0 psk "密码" OK > enable_network 0 OK |
到上面为止,无论是有线网络还是无线网络,链路层已经连通了。下面就要使用iproute等工具进行网络层的设置。
如果要设置DHCP,很简单。例如:
1
2
|
dhclient wlan0 -r dhclient wlan0 |
如果要手工设置地址,那么,例如:
1
2
|
ip address add 192.168.1.3 /24 dev wlan0 ip route add default via 192.168.1.1 dev wlan0 |
第一行增加IP地址,第二行设置默认路由。
最后,使用文本编辑器或者脚本修改/etc/resolv.conf的DNS设置,例如:
1
|
echo nameserver 221.6.4.66 > /etc/resolv .conf |
搞定,可以使用iwconfig和ifconfig查看当前设置。例如:
1
|
iwconfig wlan0 && ifconfig wlan0 |
现在,写脚本就游刃有余了,例如下面就是我的笔记本电脑在家里的设置脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#!/bin/sh echo 清理工作 sudo killall wpa_supplicant sudo ip link set eth0 down sudo ip link set wlan0 down sudo ip addr flush eth0 sudo ip addr flush wlan0 echo 启用wlan0 sudo ip link set wlan0 up echo 链路层连接 sudo wpa_supplicant -i wlan0 -D nl80211,wext -s -B -P /var/run/wpa_supplicant .wlan0.pid -C /var/run/wpa_supplicant sudo wpa_cli add_network # 注意单引号套双引号 sudo wpa_cli set_network 0 ssid '"ChinaUnicom-Me"' sudo wpa_cli set_network 0 key_mgmt WPA-PSK sudo wpa_cli set_network 0 psk '"........"' sudo wpa_cli enable_network 0 echo 网络层设置:IP地址和默认路由 sudo ip addr add 192.168.1.3 /24 dev wlan0 sudo ip route add default via 192.168.1.1 dev wlan0 echo DNS设置 # 此处不能使用>符号,否则权限不够 sudo echo nameserver 221.6.4.66 | sudo tee /etc/resolv .conf |

按默认排序 显示最新评论 共有9个评论 (最后回答: 2年前)
-
好文没人顶?
-
引用来自“chape”的答案
好文没人顶?估计大部分人都看不懂或者不感兴趣,哈哈
-
看不懂啊
-
我靠,这都算高级啦?
-
收藏先
-
现在还用不着 收藏以后用
-
up
很实用,行文很流畅,看起来舒服!
-
非常不错。
-
能保存到本地就好了,先收藏了
Linux网络设置高级指南的更多相关文章
- Python编写的Linux网络设置脚本,Debian Wheezy上测试通过
hon编写的Linux网络设置脚本,Debian Wheezy上测试通过 阿里百川梦想创业大赛,500万创投寻找最赞的APP 技术细节参见Linux网络设置高级指南 注意事项参见程序注释 ...
- Linux网络设置(第二版) --Linux网络设置
Linux网络设置 --网络配置文件与命令 个 附- 服务程序可以不使用固定端口,但是一般对外公开的WebServer不会改变端口,但是像SSH一般推荐更改,可以回避扫描 nmap [IP地址] #扫 ...
- Linux网络设置(第二版) --互联网寻址过程
Linux网络设置 --互联网寻址过程 1.TCP/IP与OSI参考模型比较 TCP/IP OSI 物理层 网卡 数据链路层 * MAC地址 网络层 IP,ICMP,ARP协议 传输层 TCP,UDP ...
- linux网络设置和虚拟机克隆转移之后网卡找不到
linux网络设置和虚拟机克隆转移之后Error:No suitable device found:no device found for connection 'System eth0'问题解决 ...
- VM中Linux网络设置(固定ip、连接外网开发环境)
在开发过程中,我们经常需要在linux中进行操作.毕竟服务器的系统大多数都是Linux,所以在dev环境需要配置好一台Linux系统配合开发. 在VMWare Workstation Pro中 ...
- Linux网络设置
==========================网络设置========================== 1.IP地址 临时:ifconfig 192.168.124.129 永久: vi / ...
- linux网络设置和虚拟机克隆转移之后Error:No suitable device found:no device found for connection 'System eth0'问题解决
以root用户登录 #vi /etc/sysconfig/network-scripts/ifcfg-eth0 #编辑配置文件,添加修改以下内容 BOOTPROTO=static #启用 ...
- Linux网络设置1——Linux网络环境配置
方法一: ① 利用root登陆,输入setup命令 ② 选择Network configuration,进入Configure TCP/IP界面 ③ 第一个[],若光标在此,按空格出现*号,则自动分配 ...
- Linux 网络编程 高级套接字
一.套接字选项: 有以下3中方式可以对套接字选项进行设置: getsockopt 和 setsockopt 函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数用于获得 ...
随机推荐
- 用Jsoup实现html中img标签地址替换
做app的时候经常要用webview解析Html,如果是自己写的服务器那么富文本编辑框有可能选择像KindEditor这样的编辑器,在kindEditor添加图片虽然可以实现绝对路径插入,如果说: & ...
- 如何在eclipse中安装Jess
如何在eclipse中安装Jess 浏览:49 | 更新:2014-05-12 16:39 这个文章帮了不少忙,感谢! 但经我实践,还要把插件那些文件向/dropins/sdk下也放一份,才能成功. ...
- GridControl 选择列、复选框全选(上)
说明: GirdControl 中添加一列,这一列不是写在数据库中的,而是代码中添加的. 图示: 底层类代码: #region GridControl 全选 /// <summary> / ...
- iOS从生成证书到打包上架-01(详细2016-10最新)
今天项目上架成功,在此小结一下这个过程,希望对这个流程有疑惑的小伙伴少走弯路(大神请忽略此文) 关于证书是什么,请自行百度,Google,这里直接上流程. 1.首先打开苹果开发者网站,Apple De ...
- Count属性(行数 @)
在PS2.0中,如果返回值为空,则count也会返回空(vm.txt内容为空),如下: (gc d:\vm.txt).count 如果加上@的话,会返回0 @(gc d:\vm.txt).count ...
- Spring mvc Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- 阿里云ONS而微软Azure Service Bus体系结构和功能比较
阿里云ONS而微软Azure Service bus体系结构和功能比较 版权所有所有,转载请注明出处http://blog.csdn.net/yangzhenping.谢谢! 阿里云的开放消息服务: ...
- 为Windows 7的winsxs目录瘦身,谨慎。
刚使用Win7 系统不久,前段时间在清理系统垃圾时发现,win7系统的windows文件夹下的winsxs 文件夹占用空间很大,想清理之,却提示无权限无法清理.随即在网上查了个到底,原来winsxs是 ...
- native为本地方法
在java中,native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法. native方法的执行依赖于JVM的设 ...
- MyJFrame(文本)界面的建立
import java.awt.Color;import java.awt.Component;import java.awt.Container;import java.awt.FlowLayout ...