M:
1. 某张网卡上第一次配置的ip叫做其primary ip 。 这个定义有点不准确, 更准确的说法是: 某张网卡上第一次配置的某个子网的ip 是这张网卡的primary ip(后面在这张网卡上再配置相同子网的另外的ip, 就都是secondary ip了). 这也意味着一张网卡可以有多个primary ip。
2. down掉所属某个子网的primary ip的时候, 所有相关的secondary ip也会down掉。 这个可以通过设置一个内核参数, 当primary ip宕掉时可以将secondary ip提升为primary ip。
echo "1" > /proc/sys/net/ipv4/conf/ethX/promote_secondaries
Q:
1、primary 与 secondary定义范围。这两个词语专门是指同一机器上同一网络接口上同一网段IP之间关系叫做primary 和 secondary。
2、一个接口上面统一网段多个IP,第一个起来的IP一般设置为primary ip;同一网络接口可以存在多个primary ip。
3、同一接口配置多个IP处理binary这里提到的可能遇到的问题之外;还有可能出现机器在主动对外访问时候,请求的源IP就是primary IP,这里在内网上同一接口多IP这样可能对监控上面会造成影响。
4、关于iproute 和 net-tools工具。
4.1、大部分场合对我们运维操作是没有区别的,iproute本来就是net-tools的下一代;
4.2、iproute使用的netlink接口,net-tools使用的ioctl系统调用;
4.3、primary 和 secondary 可以直接使用ip addr list看到,ifconfig是不能的;(另外Linux的策略路由是只有iproute工具才支持的)
5、一般我们不建议是用 ifconfig X down命令,其实使用ifconfig X 0大部分可以保证我们的需求
M:
既然提到了, 再发一个这方面的问题: 假如本机为客户端, 本机的eth0上有一个primary ip 和 secondary ip, 一般情况下, 请求的src ip使用的是primary ip, 但是如果请求数过多(超过了/proc/sys/net/ipv4/ip_local_port_range的范围), 这个src ip会使用secondary ip么? 或者是报错: 本地端口不足?
另外, 对于
3、同一接口配置多个IP处理binary这里提到的可能遇到的问题之外;还有可能出现机器在主动对外访问时候,请求的源IP就是primary IP,这里在内网上同一接口多IP这样可能对监控上面会造成影响。
可以使用 ip命令的src选项, 来强制内核使用某个secondary ip来作为src ip。 如
ip route add default via 209.100.100.254 src 209.100.100.3 dev eth0, 其中209.100.100.254为网关, src 209.100.100.3为secondary ip。
5、一般我们不建议是用 ifconfig X down命令,其实使用ifconfig X 0大部分可以保证我们的需求。
Ifconfig X down / ifconfig X 0的区别, 从字面上其实就可以看出, 第一个是把这个X网卡down掉, 亦即用ethtool看到的这个网卡的连接状态为no, 但是实际上在内核中配置在该网卡上的ip信息还是存在, 所以用这个命令之后在本机ping 这个网卡配置的ip地址, 还是能ping通。 Ifconfig X 0, 是把这个网卡配置的ip信息“清零”, 但是这个网卡的连接状态还是为yes, 既然ip已经清零, 当然ping不通。 至于到底用哪个, 各取所需吧,关键还是要牢记primary ip宕掉(包括ifconfig ethx down/ifconfig ethx 0)之后, 其对应的secondary ip也会宕掉。
Q:
既然提到了, 再发一个这方面的问题: 假如本机为客户端, 本机的eth0上有一个primary ip 和 secondary ip, 一般情况下, 请求的src ip使用的是primary ip, 但是如果请求数过多(超过了/proc/sys/net/ipv4/ip_local_port_range的范围), 这个src ip会使用secondary ip么? 或者是报错: 本地端口不足?
关于这个问题我是这么分析。端口分配是应用层请求建立socket过程中需要使用的,src ip是在ip选路过程中决定的;两者关联不大,应该报错本地端口不足。(建议可以测试一下)
ip route add default via 209.100.100.254 src 209.100.100.3 dev eth0, 其中209.100.100.254为网关, src 209.100.100.3为secondary ip。
这个命令就是一个策略路由。(策略路由与一般路由的区别的就是路由计算的时候加入了源IP的信息。)
ifconfig 陷阱
1. 理解primary ip
某张网卡上第一次配置的ip叫做其primary ip。 如果primary ip被清空, 该网卡上面配置的其他ip也会被自动清空。
这里有几个关键点: a) 配置在ethX上的不一定是primary ip, 所以ifconfig ethX down 会把这个物理网卡的连接断掉, 但是其上的ip地址还是保留在内核上的。
b) 配置在ethX:n上的可以是primary ip, 如果是这种情况, ifconfig ethX:n down不但会把ethX:n 清空掉, ethX上的IP也会被清空掉, 但是ethX状态是连接的, ifconfig也会看到其是RUNNING和UP的。
c) 本机主动发起请求的数据包, 使用的源地址, 就是primary ip, 使用ip route get 58.63.236.28可以看到走出去的包是通过哪个网卡和使用的源地址(其中58.63.236.28是要访问的目的地址)
d) 如何知道网卡上的primary ip是哪个? 使用ip addr show! 因为eth0上的不一定是primary ip, 或者多哥ethX:n中, n最小的那个也不一定是primary ip。
牢记, 在上一次该网卡上的IP地址清空之后, 第一次配置在该网卡上的IP叫做该网卡的primary ip。 primary ip可以配置在ethX上, 也可以配置在ethX:n上, 跟ethX:n的数值顺序无关。
2. 清空某个网卡行绑定的IP
a) 如果primary ip是配置在ethX上, ethX:n有配置的其他IP地址, 这个时候使用ifconfig ethX down会把网卡同机器的连接断掉(ethtool ethX会看到连接状态为no),但是在内核中, ip的配置信息还是会存在(使用ipconfig -a看), 但是路由规则已经清空。 如果用ifconfig ethX up的话, 需要手动增加丢失的路由规则(比如说默认路由, 如果有的话)
b) 如果primary ip是配置在ethX上, ethX:n有配置的其他IP地址, 这个时候使用ifconfig ethX 0, 会把ethX/ethX:n的IP都清掉, 而且在内核中也不会保留相关的IP配置信息, 路由规则已经清空。 不过ethX同机器的连接状态还是yes, ifconfig看到ethX的状态还是UP和RUNNING的。
c) 如果primary ip是配置在ethX上, ethX:n有配置的其他IP地址, 这个时候使用ifconfig ethX 0 down, 会把ethX/ethX:n的IP都清掉, 而且在内核中也不会保留相关的IP配置信息, 路由规则已经清空。 ethX同机器的连接状态是no, ifconfig看到ethX的状态没有UP和RUNNING了。
b) 如果primary ip配置在ethX:n上, ethX上也有配置其他的IP, 使用ifconfig ethX:n down, 会把ethX/ethX:n上的其他IP也清掉(同时内核也不会保存之前配置好的IP信息了), 但是ethX还是RUNNING和UP的, ethX网卡跟机器的连接状态是yes
c) 如果primary ip配置在ethX:n上, ethX上也有配置其他的IP, 使用ifconfig ethX:n 0/ifconfig ethX:n 0 down会报错, 但是目的也会达到 -- 会把ethX/ethX:n上的其他IP也清掉(同时内核也不会保存之前配置好的IP信息了), 但是ethX还是RUNNING和UP的, ethX网卡跟机器的连接状态是yes
3. 关于路由
a) 如果primary ip清空掉了, 相关网卡的路由也会在内核中被清空
b) IP配置好之后, 系统会自动添加一条相关IP所在子网的路由规则, 如果有其他需要, 要手工配置。 所以有时候ifconfig ethX up 了, 发现还是不能通信, 可能是路由规则的问题
4. 网卡是否up, 跟ethX:n无关, 只跟ethX有关。 如果网卡不是up的, 使用ifconfig ethX:n xxx.xxx.xxx.xxx up, 也不能把这个网卡up. 所以不打算在ethX上配置IP而在ethX:n上配置IP时, 要保证ethX是up的。 不然配上去了也没有用
5. 为什么说要用ip命令替代掉传统的ifconfig工具
实验:
场景1(eth0是在eth0:n之后被配置的):
/etc/init.d/network restart ; ifconfig eth0 119.147.14.133 netmask 255.255.255.128 ;
ifconfig eth0:0 down ;
表象: eth0上的IP被清空, 但是状态是up和running, 连接状态为yes; 路由表中关于eth0的被清空; eth0:0/eth0:1都被清掉了
ifconfig eth0:0 0 down;
表象: eth0上的IP被清空, 但是状态是up和running, 连接状态为yes; 路由表中关于eth0的被清空; eth0:0/eth0:1都被清掉了
ifconfig eth0:0 0
表象: eth0上的IP被清空, 但是状态是up和running, 连接状态为yes; 路由表中关于eth0的被清空; eth0:0/eth0:1都被清掉了
场景2(eth0是在eth0:n之后被配置的):
/etc/init.d/network restart ; ifconfig eth0 119.147.14.133 netmask 255.255.255.128 ;
ifconfig eth0:1 down ;
表象: eth0和eth0:0完好, 路由表正常。 eth0:1清掉了。
ifconfig eth0:1 0 down ;
表象: eth0和eth0:0完好, 路由表正常。 eth0:1清掉了。
ifconfig eth0:1 0 ;
表象: eth0和eth0:0完好, 路由表正常。 eth0:1清掉了。
场景3(eth0是在eth0:n之前被配置的):
/etc/init.d/network restart ; ifconfig eth0:0 down; ifconfig eth0 119.147.14.133 netmask 255.255.255.128 ; ifconfig eth0:0 119.147.14.164 netmask 255.255.255.128 ; ifconfig eth0:1 119.147.14.193 netmask 255.255.255.128; route add default gw 119.147.14.129;
ifconfig eth0:0 down ;
表象: eth0和eth0:1都完好, 关于eth0口的路由表也都正常; eth0:0清掉了;
场景4(eth0是在eth0:n之前被配置的):
/etc/init.d/network restart ; ifconfig eth0:0 down; ifconfig eth0 119.147.14.133 netmask 255.255.255.128 ; ifconfig eth0:0 119.147.14.164 netmask 255.255.255.128 ; ifconfig eth0:1 119.147.14.193 netmask 255.255.255.128; route add default gw 119.147.14.129;
ifconfig eth0:1 down ;
表象: eth0和eth0:0都完好, 关于eth0口的路由表也都正常; eth0:1清掉了;
场景5(eth0是在eth0:n之后被配置的):
/etc/init.d/network restart ; ifconfig eth0:0 down; ifconfig eth0:0 119.147.14.164 netmask 255.255.255.128 ; ifconfig eth0:1 119.147.14.193 netmask 255.255.255.128; route add default gw 119.147.14.129; ifconfig eth0 119.147.14.133 netmask 255.255.255.128
ifconfig eth0:0 down;
表象: eth0上的IP被清空, 但是状态是up和running, 连接状态为yes; 路由表中关于eth0的被清空; eth0:0/eth0:1都被清掉了
场景6(eth0是在eth0:n之后被配置的):
/etc/init.d/network restart ; ifconfig eth0:0 down; ifconfig eth0:0 119.147.14.164 netmask 255.255.255.128 ; ifconfig eth0:1 119.147.14.193 netmask 255.255.255.128; route add default gw 119.147.14.129; ifconfig eth0 119.147.14.133 netmask 255.255.255.128
ifconfig eth0:1 down;
表象: eth0和eth0:0都完好, 关于eth0口的路由表也都正常; eth0:1清掉了;
ifconfig在做别名的时候发现
ifconfig
eth0 无IP eth0:0/eth0:1有ip ifconfig eth0 down, 内核会保留eth0:0/eth0:1的ip, 下次ifconfig eth0 up, 这两个子网卡还存在, ip依旧
eth0 有IP eth0:0/eth0:1有ip ifconfig eth0 down, 内核会保留eth0/eth0:0/eth0:1的ip, 下次ifconfig eth0 up, 这两个子网卡还存在, ip依旧
eth0 有IP eth0:0/eth0:1有ip ifconfig eth0 0 down, 内核不会保留eth0/eth0:0/eth0:1的ip
eth0 有IP eth0:0/eth0:1有ip ifconfig eth0:0 down, 也会把eth0:1的ip干掉, 内核不会保留eth0:0/eth0:1的ip
ifconfig eth0 down
1. 网卡已经当掉(ethtool eth0看到连接状态为off)
2. ifconfig -a 可以看到ip配置信息(包括eth0:n上的)还是在的, 但是没有UP和RUNNING的标志。
3. 路由规则: 此时针对该网卡(eth0)的路由规则也已经冲掉了,
4. 再次ifconfig eth0 up的时候, 虽然ip信息已经添加到该网卡, 而且该网卡也是UP和RUNNING状态, 但是不能与外界通信, 因为没有对应的路由规则(会有一条针对该网段的路由规则自动添加)
5. 添加好路由规则, 能够通信了
ifconfig eth0 0 down
1. 这样会先把 eth0 及其子网卡上的ip都冲掉, 然后再当掉网卡(此时ethtool eth0看到的连接状态是off),
2. ifconfig -a 可以看到eth0的状态已经没有UP和RUNNING了, ip信息也不见了, eth0:n也不见了
3. 路由规则: 此时针对该网卡(eth0)的路由规则也已经冲掉了
4. 再次ifconfig eth0 up, eth0状态为UP, 但是木有RUNNING, 因为ip配置信息没有了。 eth0:n无, 对应的路由规则也无
5. ifconfig eth0 xxxx 配置上IP, 状态为RUNNING, 自动添加一条对应的该网段的路由规则。 手动添加默认路由规则
ifconfig eth0 0
1. eth0的ip信息没了, 但是状态连接状态为on(ethtool eth0), ifconfig可以看到其为RUNNING和UP。 子网卡信息全无
2. ifconfig -a 看到的信息同ifconfig
3. 路由规则: 此时针对该网卡(eth0)的路由规则也已经冲掉了
4. 再次ifconfig eth0 up, 各项信息不变
5. ifconfig eth0 xxxx 配置上IP, 状态为RUNNING, 自动添加一条对应的该网段的路由规则。 手动添加默认路由规则
ifconfig eth0:1 down
1. eth0的ip信息在, eth0:1的不在了, 路由规则正常, eth0的连接状态为on
2. ifconfig -a 看到的信息同上
3. 路由规则: 不变
4. ifconfig eth0:1 up 返回错误“SIOCSIFFLAGS: Cannot assign requested address”
5. ifconfig eth0:1 119.147.14.193 netmask 255.255.255.128 成功, 不需要添加路由规则
ifconfig eth0:1 0 down
返回“SIOCSIFFLAGS: Cannot assign requested address
SIOCSIFFLAGS: Cannot assign requested address” 错误
1. eth0的ip信息在, eth0:1的不在了, 路由规则正常, eth0的连接状态为on
2. ifconfig -a 看到的信息同上
3. 路由规则: 不变
4. ifconfig eth0:1 up 返回错误“SIOCSIFFLAGS: Cannot assign requested address”
5. ifconfig eth0:1 119.147.14.193 netmask 255.255.255.128 成功, 不需要添加路由规则
ifconfig eth0:1 0
返回“SIOCSIFFLAGS: Cannot assign requested address”
1. eth0的ip信息在, eth0:1的不在了, 路由规则正常, eth0的连接状态为on
2. ifconfig -a 看到的信息同上
3. 路由规则: 不变
4. ifconfig eth0:1 up 返回错误“SIOCSIFFLAGS: Cannot assign requested address”
5. ifconfig eth0:1 119.147.14.193 netmask 255.255.255.128 成功, 不需要添加路由规则