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总用量 0lrwxrwxrwx 1 root root 0 7月 4 15:01 eth0 -> ../../devices/pci0000:00/0000:00:19.0/net/eth0lrwxrwxrwx 1 root root 0 7月 4 15:00 lo -> ../../devices/virtual/net/lolrwxrwxrwx 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 loauto eth0auto wlan0 |
而如果设备标志为“allow-hotplug”,那么内核在检测到热插拔事件的时候,也会自动启动。例如:
|
1
2
3
|
allow-hotplug loallow-hotplug eth0allow-hotplug wlan0 |
因为回环设备始终应该是存在的,所以/etc/network/interfaces文件的内容至少是:
|
1
2
|
auto loiface 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.1nameserver 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 dhcpiface 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=config1ifup eth0=config2 |
动态设置
如果网络环境经常变动而且是未知的,或者为了使用脚本等自动化工具达到完全驾驭网络的能力,那么静态和准静态设置就捉襟见肘了。
动态设置依赖iproute、isc-dhcp-client、wireless-tools、wpasupplicant等软件包,直接使用命令行,以达到最大的灵活性。
首先,/etc/network/interfaces文件仅保留回环设备lo的配置信息:
|
1
2
|
auto loiface lo inet loopback |
iproute替代了过时的net-tools等工具(ifconfig)。
通过“ip link”命令可以查询到当前所有网络设备的状态和参数,例如:
|
1
2
3
4
5
6
7
|
root@X230:~# ip link1: 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:002: 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:ff3: 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_network0> set_network 0 ssid "ChinaUnicom-Me"OK> set_network 0 key_mgmt WPA-PSKOK> set_network 0 psk "密码"OK> enable_network 0OK |
到上面为止,无论是有线网络还是无线网络,链路层已经连通了。下面就要使用iproute等工具进行网络层的设置。
如果要设置DHCP,很简单。例如:
|
1
2
|
dhclient wlan0 -rdhclient wlan0 |
如果要手工设置地址,那么,例如:
|
1
2
|
ip address add 192.168.1.3/24 dev wlan0ip 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/shecho 清理工作sudo killall wpa_supplicantsudo ip link set eth0 downsudo ip link set wlan0 downsudo ip addr flush eth0sudo ip addr flush wlan0echo 启用wlan0sudo ip link set wlan0 upecho 链路层连接sudo wpa_supplicant -i wlan0 -D nl80211,wext -s -B -P /var/run/wpa_supplicant.wlan0.pid -C /var/run/wpa_supplicantsudo wpa_cli add_network# 注意单引号套双引号sudo wpa_cli set_network 0 ssid '"ChinaUnicom-Me"'sudo wpa_cli set_network 0 key_mgmt WPA-PSKsudo wpa_cli set_network 0 psk '"........"'sudo wpa_cli enable_network 0echo 网络层设置:IP地址和默认路由sudo ip addr add 192.168.1.3/24 dev wlan0sudo ip route add default via 192.168.1.1 dev wlan0echo DNS设置# 此处不能使用>符号,否则权限不够sudo echo nameserver 221.6.4.66 | sudo tee /etc/resolv.conf |
Debian Linux按默认排序 显示最新评论 共有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函数用于获得 ...
随机推荐
- 使用sessionStorage得一个坑
1.首先sessionStorage.setItem("isMybill" false) 2.使用的时候 sessionStorage.getItem('isMybill') / ...
- 【三支火把】---C文件学习
---恢复内容开始--- 又看了一遍文件的知识点了,断断续续已经看了2-3遍,也就这次花了点时间做了一下总结,以后我想都不会再去翻书了,哈哈. 1. 基于缓冲区的文件操作2. 打开关闭文件3. 单个字 ...
- Java - 错误: "java.lang.ArrayIndexOutOfBoundsException: length=1; index=1"
错误: "java.lang.ArrayIndexOutOfBoundsException: length=1; index=1" 本文地址: http://blog.csdn.n ...
- PHP 函数:intval()
intval 变量转成整数类型. 语法: int intval(mixed var, int [base]); 返回值: 整数 函数种类: PHP 系统功能 内容说明:本函数可将变量转成整数类型. ...
- 在Android中访问内置SE和基于SE的卡模拟(一)
2013-10-10 编写 前言 在“十问Android NFC手机上的卡模拟”文中仅仅简单的介绍了一下相关的概念,如果需要了解基于SE的卡模拟的更多细节,也就是,究竟在Android的NFC手机上, ...
- [Angular 2] ROUTING IN ANGULAR 2 REVISITED
Let's say we have a list of contacts, click each contact, we can render a new route to get the detai ...
- android优化(json工具,message新建/传递,avtivity深入学习视频)
1,在线json校验工具:www.bejson.com 2, 在handler中经常使用的 message的传递上,message.what使用静态量 . private static final i ...
- android开发入门经验 ADT Bundle环境搭建
现在有许多做开发的转做移动端开发,做J2EE的转做Android开发,我也把自己的一些入门经验与大家分享一下,希望能给你带来帮助. 工具/原料 JDK,ADT,JAVA 方法/步骤 开发工具的准备 ...
- C#中Enum用法小结
enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储. (1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此 ...
- Iperf使用方法
Iperf使用方法 Iperf 是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包 ...








