ifconfig 陷阱

primary ip的定义也可以在这个地方看下:
 

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 成功, 不需要添加路由规则
<think>嗯,用户问了四个关于Mac环境变量的问题,需要逐个解答。首先得理清楚每个问题的原因,再组织回答。 第一个问题是为什么环境变量PATH显示为/usr/bin:/bin。这可能是因为在终端启动时加载的配置文件有问题,或者默认的shell配置覆盖了用户设置。Mac默认使用zsh,所以可能需要检查.zshrc、.zprofile或者其他系统级配置文件,比如/etc/zprofile或/etc/paths。有时候用户修改了.zshrc但没生效,可能是因为其他文件在之后被加载,覆盖了PATH设置。另外,系统默认的PATH可能比较简单,特别是如果用户没有正确配置的话。 第二个问题是修改了用户级的.zshrc但不起作用。常见原因可能包括文件修改后没有source,或者语法错误导致文件没有被正确加载。还有可能用户误用了其他shell,比如bash,而没意识到终端使用的是zsh。另外,可能有其他配置文件在之后被加载,覆盖了PATH变量,比如.zprofile或者系统级的配置。需要提示用户检查语法,确认使用的是zsh,并重新加载配置文件。 第三个问题,系统级PATH里有环境变量,但某些命令如ifconfig无法使用。这可能是因为这些命令不在PATH包含的目录中。比如,ifconfig在/sbin目录下,而默认PATH可能没有包含这个目录。或者用户可能使用了错误的路径,或者命令需要root权限。Mac新版本可能移除了某些命令,需要安装额外的工具,比如通过Xcode或者Homebrew。这时候需要检查PATH是否包含正确路径,确认命令是否存在,或者是否需要安装。 第四个问题是在系统级profile设置环境变量是否涉及安全风险。是的,系统级修改会影响所有用户,如果路径包含不安全目录,可能导致恶意软件被执行。特别是将当前目录.加入PATH,或者包含可写目录,可能带来风险。需要建议用户优先使用用户级配置,避免系统级修改,除非必要,并确保路径可靠。 整个回答需要结构清晰,分点解答,可能用户对shell配置不熟悉,需要详细说明每个步骤和检查点。同时要注意使用中文,LaTeX格式正确,行内公式用$,独立公式用$$。还要注意用户可能遇到的问题,比如路径覆盖、命令位置、安全风险等,给出实际例子和解决方案。</think>好的,我将分点逐步解释这4个问题: 1. **PATH默认值为/usr:/bin的原因** - macOS默认的`PATH`由系统级配置文件`/etc/zprofile`和`/etc/paths`定义 - 若用户未主动修改`~/.zshrc`或`~/.zprofile`,终端会继承系统级配置 - `/usr/bin`和`bin`是Unix基础命令的默认路径(如`ls`, `cp`等) 2. **修改zshrc无效的排查步骤** ✅ 验证步骤: - 执行`source ~/.zshrc`立即生效 - 检查文件权限:`ls -l ~/.zshrc`(应显示`-rw-r--r--`) - 确认终端类型:`echo $SHELL`(输出应为`/bin/zsh`) - 排查语法错误:`zsh -n ~/.zshrc` ❗ 常见陷阱: - 使用`export PATH=...`覆盖而非`export PATH=...:$PATH`追加 - 其他配置文件(如`~/.zshenv`)覆盖了PATH 3. **系统PATH存在但命令失效的原因** - **路径未包含**:如`ifconfig`位于`/sbin`,需确认PATH是否包含`/sbin` 可用`echo $PATH | tr ':' '\n' | grep sbin`检查 - **权限问题**:部分命令(如`tcpdump`)需要sudo权限 - **命令废弃**:在macOS 10.15+中`ifconfig`已被`ipconfig`逐步替代 - **路径优先级**:若存在多个同名命令,按PATH顺序执行第一个 4. **系统级profile的安全风险** - **风险场景**: - 修改`/etc/profile`或`/etc/paths`会影响所有用户 - 添加不可信路径(如`export PATH="/unknown_dir:$PATH"`)可能导致恶意命令劫持 - 将`.`(当前目录)加入PATH会允许执行任意目录中的可执行文件 - **防护建议**: - 优先使用用户级配置(`~/.zshrc`) - 系统级修改前备份:`sudo cp /etc/paths /etc/paths.bak` - 遵循最小权限原则:`chmod 644 /etc/paths` **补充示例**: 若要添加`/usr/local/sbin`到PATH,正确的用户级配置应为: ```zsh # ~/.zshrc export PATH="/usr/local/sbin:$PATH" ``` 验证命令: ```zsh which ifconfig # 应返回/sbin/ifconfig echo $PATH | grep sbin # 确认包含/sbin ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值