ip route:用于管理静态路由表。
linux 系统中,可以自定义从 1-252个路由表。其中,linux系统维护了4个路由表:
* 0#表: 系统保留表
* 253#表: defulte table 没特别指定的默认路由都放在改表
* 254#表: main table 没指明路由表的所有路由放在该表
* 255#表: local table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改
路由表的查看可以通过`ip route list table table_number [table_name]`命令。路由表序号和表名的对应关系在 `/etc/iproute2/rt_tables` 文件中,可手动编辑,路由表添加完毕即时生效。
[TOC]
# <span style="font-size:15px">**ip route 命令格式说明**</span>
```
Usage: ip route { list | flush } SELECTOR
ip route save SELECTOR
ip route restore
ip route showdump
ip route get ADDRESS [ from ADDRESS iif STRING ]
[ oif STRING ] [ tos TOS ]
[ mark NUMBER ]
ip route { add | del | change | append | replace } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
[ table TABLE_ID ] [ proto RTPROTO ]
[ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
[ table TABLE_ID ] [ proto RTPROTO ]
[ scope SCOPE ] [ metric METRIC ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]
[ rtt TIME ] [ rttvar TIME ] [reordering NUMBER ]
[ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
[ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
[ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
[ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
[ expires TIME ]
TYPE := { unicast | local | broadcast | multicast | throw |
unreachable | prohibit | blackhole | nat }
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
TIME := NUMBER[s|ms]
BOOL := [1|0]
FEATURES := ecn
```
# <span style="font-size:15px">**ip route add/change/replace**</span>
>**option:**
>* to TYPE PREFIX (default):路由的目标前缀。如果省略TYPE,则ip采用unicast类型。上面列出了其他类型的值。前缀是一个IP或IPv6地址,后跟斜杠和前缀长度。如果前缀的长度丢失,ip将采用全长主机路由。还有一个特殊的前缀默认值-相当于IP 0/0或IPv6::/0。
>* tos TOS:服务类型(TOS)密钥。这个密钥没有相关的掩码,最长的匹配被理解为:首先,比较路由和包的TOS。如果它们不相等,则分组仍然可以匹配具有零TOS的路由。TOS是8位十六进制数或`/etc/iproute2/rt_dsfield`中的标识符。
> * metric :跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由
>* table TABLEID:要将此路由添加到的表。TABLEID可以是文件`/etc/iproute2/rt_tables`中的数字或字符串。如果省略此参数,ip将采用主表,但本地、广播和nat路由除外,默认情况下,这些路由将放入本地表中
>* dev NAME:输出设备名称
>* via ADDRESS:下一跳路由器的地址。 实际上,此字段的含义取决于路由类型。 对于普通的单播路由,它要么是真正的下一跳路由器,要么是以BSD兼容模式安装的直接路由,它可以是接口的本地地址。 对于NAT路由,它是已转换IP目标块的第一个地址
>* src ADDRESS:发送到路由前缀所覆盖的目的地时首选的源地址
>* realm REALMID:此路由被分配到的领域。REALMID可以是`/etc/iproute2/rt_realms`文件中的数字或字符串。
>* mtu MTU/mtu lock MTU:到达目的地的路径上的MTU。 如果未使用修饰符锁定,则由于路径MTU发现,内核可能会更新MTU。 如果使用了修饰符锁定,则将不尝试任何路径MTU发现,在IPv4情况下,所有数据包将在没有DF位的情况下发送,或者将其分片到IPv6的MTU
>* window NUMBER:TCP播发到这些目的地的最大窗口,以字节为单位。它限制了允许TCP对等方发送给我们的最大数据突发
>* rtt TIME:初始RTT(“往返时间”)估算值。 如果未指定后缀,则这些单位是直接传递到路由代码的原始值,以保持与先前版本的兼容性。 否则,如果使用后缀s,sec或secs来指定秒数,而使用ms,msec或msecs的后缀来指定毫秒。
>* rttvar TIME (2.3.15+ only):初始RTT方差估算值。 与上面的rtt一样指定值
>* rto_min TIME (2.6.23+ only):与此目标通信时要使用的最小TCP重新传输超时。值的指定与上面的rtt相同
>* ssthresh NUMBER (2.3.15+ only):初始慢启动阈值的估计值
>* cwnd NUMBER (2.3.15+ only):锁定标志,如果不使用锁定标志,则忽略该选项
>* initcwnd NUMBER (2.5.70+ only):到此目标的连接的初始拥塞窗口大小。 实际窗口大小是该值乘以相同连接的MSS(``最大段大小'')。 默认值为零,表示使用RFC2414中指定的值。
>* initrwnd NUMBER (2.6.33+ only):到此目标的连接的初始接收窗口大小。 实际窗口大小是此值乘以连接的MSS。 默认值为零,表示使用慢启动值。
>* features FEATURES (3.18+only):启用或禁用每路由功能。此时唯一可用的特性是ecn,它可以在启动到给定目标网络的连接时启用显式拥塞通知。当响应来自给定网络的连接请求时,即使net.ipv4.tcp\_ecn sysctl设置为0
>* congctl NAME/congctl lock NAME (3.20+ only):仅针对给定的目的地设置特定的TCP拥塞控制算法。 如果未指定,Linux将保留当前的全局默认TCP拥塞控制算法或应用程序中的一种。 如果未使用修饰符锁定,则应用程序仍可能会覆盖该目的地的建议拥塞控制算法。 如果使用了修饰符锁,则不允许应用程序覆盖该目的地的指定拥塞控制算法,因此将强制/保证使用建议的算法
>* advmss NUMBER (2.3.15+ only):在建立TCP连接时向这些目标播发的MSS(“最大段大小”)。如果没有给定,Linux将使用从第一跳设备MTU计算的默认值
>* reordering NUMBER (2.3.15+ only):到此目的地的路径上的最大重新排序。 如果未给出,则Linux使用通过sysctl变量`net/ipv4/tcp_reordering`选择的值
>* nexthop NEXTHOP:多路径路由的下一跳。 NEXTHOP是一个复杂值,其语法类似于顶级参数列表:
> * via ADDRESS:下一跳路由
> * dev NAME:输出设备名称
> * weight NUMBER:是多路径路由的此元素的权重,反映其相对带宽或质量
>* scope SCOPE_VAL:路由前缀所覆盖的目的地范围。 SCOPE\_VAL可以是数字`/etc/iproute2/rt_scopes`中的字符串。 如果省略此参数,则ip假定所有网关单播路由的作用域是全局范围,直接单播和广播路由的作用域链接以及本地路由的作用域主机
>* protocol RTPROTO:该路由的路由协议标识符。 RTPROTO可以是文件/ etc / iproute2 / rt\_protos中的数字或字符串。如果未提供路由协议ID,则ip会采用协议引导方式(即假定路由是由不了解自己在做什么的人添加的)。 几个协议值具有固定的解释。
> * redirect: 路由是由于ICMP重定向而安装的
> * kernel:路由是在自动配置期间由内核安装的
> * boot:路由是在启动过程中安装的。如果路由守护进程启动,它将清除所有这些守护进程
> * static:该路由由管理员安装,以覆盖动态路由。 路由守护程序将尊重它们,甚至可能将它们通告给其对等端。
> * ra:路由是通过路由器发现协议安装的
| 命令 | 解释 |
| --- | ---- |
|ip route add default via 192.168.1.1| 设置系统默认路由 |
|ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0|设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口|
|ip route add default via 192.168.0.254 dev eth0| 设置默认网关为192.168.0.254|
|ip route add default via 192.168.1.1 table 1|在一号表中添加默认路由为192.168.1.1|
|ip route add 192.168.0.0/24 via 192.168.1.2 table 1 |在一号表中添加一条到192.168.0.0网段的路由为192.168.1.2|
|ip route add prohibit 209.10.26.51|设置请求的目的地不可达的路由|
|ip route add prohibit 209.10.26.51 from 192.168.99.35|假设您不想阻止所有用户访问此特定主机,则可以使用该`from`选项,阻止了源IP 192.168.99.35到达209.10.26.51|
|ip route change default via 192.168.99.113 dev eth0| 更改默认路由。此操作等同于先删除,后新增|
# <span style="font-size:15px">**ip route show**</span>
该命令显示路由表的内容或按某些条件选择的路由
> **option:**
>* to SELECTOR (default):仅从给定的目的地范围内选择路线。 SELECTOR由一个可选的修饰符(root 、match、exact)和一个前缀组成。 root PREFIX选择前缀不小于PREFIX的路由。 F.e. 根0/0选择整个路由表。 match PREFIX选择前缀不超过PREFIX的路由。 比如: 匹配10.0/16选择10.0/16、10/8和0/0,但不选择10.1/16和10.0.0/24。 精确的PREFIX(或仅PREFIX)选择具有此精确前缀的路由。 如果这两个选项都不存在,则ip假定根目录为0/0,即列出整个表。
>* tos TOS:仅选择具有给定TOS的路线
>* table TABLEID:显示此表中的路由。默认设置是显示主表。TABLEID可以是实表的ID,也可以是特殊值之一:
> * all:列出所有表
> * cache:转储路由缓存
> * cloned:缓存列表克隆的路由,即由于某些路由属性(例如MTU)已更新而从其他路由动态分叉的路由。 实际上,它等效于表缓存。
> * from SELECTOR:与to的语法相同,但它绑定的是源地址范围而不是目的地。请注意,from选项仅适用于克隆路由
> * protocol RTPROTO:只列出该协议的路由
> * scope SCOPE_VAL:仅列出具有此范围的路由
> * type TYPE:仅列出该类型的路由
> * dev NAME:仅列出通过此设备的路由
> * via PREFIX:仅列出通过前缀选择的nexthop路由器的路由
> * src PREFIX:仅列出具有按前缀选择的首选源地址的路由
> * realms FROMREALM/TOREALM/REALMID:仅列出具有这些领域的路由。
| 查看命令 | 解释 |
| --- | ---- |
|ip route <br>或:ip r<br>或:ip route show<br>或:ip route list| 显示系统路由|
|ip route show [exact] 169.254.0.0/16|精准查看具体某一条路由|
|ip route show match 172.18|模糊匹配某一条路由|
|ip route show src 172.18.16.0/20|仅列出源地址前缀为172.18.16.0/20的路由 |
|ip route show via 172.18.31.253|仅列出通过前缀选择的为该ip的路由|
|ip -s route show cache 192.168.100.17|显示来自路由缓存的统计信息|
|ip route show table local<br>或:ip route list table local|查看本地路由表|
# <span style="font-size:15px">**ip route get**</span>
此命令获取到目标的单个路由,并按照内核所看到的方式打印其内容。
此操作不等同于ip route show。 ip routeshow会显示现有路线,而get解析它们并在必要时创建新克隆。基本上,get相当于沿着此路径发送数据包。如果没有给出iif参数,内核将创建一个路由,以将数据包输出到请求的目的地。这相当于用后续的ip路由ls缓存ping目标,但是实际上没有发送任何数据包。使用iif参数,内核假装一个数据包从这个接口到达,并搜索一条路径来转发数据包
> **option:**
> * to ADDRESS (default):目的地址
> * from ADDRESS:源地址
> * tos TOS:服务类型
> * iif NAME:此数据包预期从中到达的设备
> * oif NAME:强制将此数据包路由到的输出设备
> * connected:如果未给出源地址(选项from),则重新查找源设置为从第一次查找收到的首选地址的路由。 如果使用策略路由,则可能是其他路由
| 查看命令 | 解释 |
| --- | ---- |
|ip route get 169.254.0.0/16|获取到目标的单个路由,并按照内核所看到的方式打印其内容|
# <span style="font-size:15px">**ip route delete**</span>
| 命令 | 解释 |
| --- | ---- |
|ip route del 192.168.4.0/24|删除192.168.4.0网段的网关|
|ip route del default |删除默认路由|
|ip route delete 192.168.1.0/24 dev eth0|删除路由|
# <span style="font-size:15px">**ip route save**</span>
将路由表信息保存到标准输出。该命令的行为类似于ip route show,除了输出是适合传递给ip route restore的原始数据外。
# <span style="font-size:15px">**ip route restore**</span>
从stdin恢复路由表信息 该命令希望读取从ip route save返回的数据流。 它将尝试完全还原保存时的路由表信息,因此必须先完成流中信息的任何转换(例如设备索引)。 任何现有路线均保持不变。 表中已经存在的数据流中指定的任何路由都将被忽略。
ip route restore
# <span style="font-size:15px">**ip route flush**</span>
该`flush`选项与**ip route**一起使用时,将清空路由表或删除特定目标的路由
| 命令 | 解释 |
| --- | ---- |
|ip route flush 10.38.0.0/16|删除特定路由|
|ip route flush table main|清空路由表|
<br>
**Route type 解释:**
* unicast:由路由前缀覆盖的目的地址的真实路径
* unreachable:目的路由无法到达。丢弃数据包并生成ICMP消息主机不可访问。本地发件人收到一个EHOSTUNREACH错误。
* blackhole:目的路由无法到达。数据包被悄悄丢弃。本地发件人收到EINVAL错误。
* prohibit:目的路由无法到达。数据包将被丢弃,并生成管理上禁止的ICMP消息通信。 本地发件人收到EACCES错误。
* local:目的地已分配给此主机。数据包被环回并在本地传递
* broadcast:目的路由是广播地址。数据包作为链接广播发送
* throw:与策略规则一起使用的特殊控制路径。 如果选择了这样的路由,则会在未找到路由的情况下终止此表中的查找。 如果没有策略路由,则等同于路由表中没有路由。 数据包被丢弃,并生成ICMP消息net unreachable。 本地发件人收到ENETUNREACH错误
* nat:一条特殊的NAT路由。 前缀所覆盖的目的地被认为是虚拟(或外部)地址,在转发之前需要将其转换为真实(或内部)地址。 使用属性via选择要转换为的地址
* anycast:未分配给此主机的路由地址,它们主要等效于本地,只是有一个区别:这些地址用作任何数据包的源地址时都是无效的。
* multicast:一种用于多播路由的特殊类型。 它在常规路由表中不存在。
**运行实例:**
```
// 查看本地路由表
// 此输出中的第一个字段告诉我们该路由是针对该计算机本地托管的广播地址还是IP地址或范围。
//随后的字段会通知我们目标可通过哪个设备到达,并且特别是(在此表中)内核已添加了这些路由,作为建立IP层接口的一部分
[root@izwz91quxhnlkan8kjak5hz net]# ip route show table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
// 添加请求目的不可达的路由
[root@masq-gw]# ip route add prohibit 209.10.26.51
[root@tristan]# ssh 209.10.26.51
ssh: connect to address 209.10.26.51 port 22: No route to host
[root@masq-gw]# tcpdump -nnq -i eth2
tcpdump: listening on eth2
22:13:13.740406 192.168.99.35.51973 > 209.10.26.51.22: tcp 0 (DF)
22:13:13.740714 192.168.99.254 > 192.168.99.35: icmp: host 209.10.26.51 unreachable - admin prohibited filter [tos 0xc0]
```
- PHP
- PHP基础
- PHP介绍
- 如何理解PHP是弱类型语言
- 超全局变量
- $_SERVER详解
- 字符串处理函数
- 常用数组函数
- 文件处理函数
- 常用时间函数
- 日历函数
- 常用url处理函数
- 易混淆函数区别(面试题常见)
- 时间戳
- PHP进阶
- PSR规范
- RESTFUL规范
- 面向对象
- 三大基本特征和五大基本原则
- 访问权限
- static关键字
- static关键字
- 静态变量与普通变量
- 静态方法与普通方法
- const关键字
- final关键字
- abstract关键字
- self、$this、parent::关键字
- 接口(interface)
- trait关键字
- instanceof关键字
- 魔术方法
- 构造函数和析构函数
- 私有属性的设置获取
- __toString()方法
- __clone()方法
- __call()方法
- 类的自动加载
- 设计模式详解
- 关于设计模式的一些建议
- 工厂模式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 区别和适用范围
- 策略模式
- 单例模式
- HTTP
- 定义
- 特点
- 工作过程
- request
- response
- HTTP状态码
- URL
- GET和POST的区别
- HTTPS
- session与cookie
- 排序算法
- 冒泡排序算法
- 二分查找算法
- 直接插入排序算法
- 希尔排序算法
- 选择排序算法
- 快速排序算法
- 循环算法
- 递归与尾递归
- 迭代
- 日期相关的类
- DateTimeInterface接口
- DateTime类
- DateTimeImmutable类
- DateInterval类
- DateTimeZone类
- DatePeriod类
- format参数格式
- DateInterval的format格式化参数
- 预定义接口
- ArrayAccess(数组式访问)接口
- Serializable (序列化)接口
- Traversable(遍历)接口
- Closure类
- Iterator(迭代器)接口
- IteratorAggregate(聚合迭代器) 接口
- Generator (生成器)接口
- composer
- composer安装与使用
- python
- python3执行tarfile解压文件报错:tarfile.ReadError:file could not be opened successfully
- golang
- 单元测试
- 单元测试框架
- Golang内置testing包
- GoConvey库
- testify库
- 打桩与mock
- GoMock框架
- Gomonkey框架
- HTTP Mock
- httpMock
- mux库/httptest
- 数据库
- MYSQL
- SQL语言的分类
- 事务(重点)
- 索引
- 存储过程
- 触发器
- 视图
- 导入导出数据库
- 优化mysql数据库的方法
- MyISAM与InnoDB区别
- 外连接、内连接的区别
- 物理文件结构
- PostgreSQL
- 编译安装
- pgsql常用命令
- pgsql应用目录(bin目录)文件结构解析
- pg_ctl
- initdb
- psql
- clusterdb
- cluster命令
- createdb
- dropdb
- createuser
- dropuser
- pg_config
- pg_controldata
- pg_checksums
- pgbench
- pg_basebackup
- pg_dump
- pg_dumpall
- pg_isready
- pg_receivewal
- pg_recvlogical
- pg_resetwal
- pg_restore
- pg_rewind
- pg_test_fsync
- pg_test_timing
- pg_upgrade
- pg_verifybackup
- pg_archivecleanup
- pg_waldump
- postgres
- reindexdb
- vacuumdb
- ecpg
- pgsql数据目录文件结构解析
- pgsql数据目录文件结构解析
- postgresql.conf解析
- pgsql系统配置参数说明
- pgsql索引类型
- 四种索引类型解析
- 索引之ctid解析
- 索引相关操作
- pgsql函数解析
- pgsql系统函数解析
- pgsql窗口函数解析
- pgsql聚合函数解析
- pgsql系统表解析
- pg_stat_all_indexes
- pg_stat_all_tables
- pg_statio_all_indexes
- pg_statio_all_tables
- pg_stat_database
- pg_stat_statements
- pg_extension
- pg_available_extensions
- pg_available_extension_versions
- pgsql基本原理
- 进程和内存结构
- 存储结构
- 数据文件的内部结构
- 垃圾回收机制VACUUM
- 事务日志WAL
- 并发控制
- 介绍
- 事务ID-txid
- 元组结构-Tuple Structure
- 事务状态记录-Commit Log (clog)
- 事务快照-Transaction Snapshot
- 事务快照实例
- 事务隔离
- 事务隔离级别
- 读已提交-Read committed
- 可重复读-Repeatable read
- 可序列化-Serializable
- 读未提交-Read uncommitted
- 锁机制
- 扩展机制解析
- 扩展的定义
- 扩展的安装方式
- 自定义创建扩展
- 扩展的管理
- 扩展使用实例
- 在pgsql中使用last、first聚合函数
- pgsql模糊查询不走索引的解决方案
- pgsql的pg_trgm扩展解析与验证
- 高可用
- LNMP
- LNMP环境搭建
- 一键安装包
- 搭建方法
- 配置文件目录
- 服务器管理系统
- 宝塔(Linux)
- 安装与使用
- 开放API
- 自定义apache日志
- 一键安装包LNMP1.5
- LNMP1.5:添加、删除站点
- LNMP1.5:php多版本切换
- LNMP1.5 部署 thinkphp项目
- Operation not permitted解决方法
- Nginx
- Nginx的产生
- 正向代理和反向代理
- 负载均衡
- Linux常用命令
- 目录与文件相关命令
- 目录操作命令
- 文件编辑命令
- 文件查看命令
- 文件查找命令
- 文件权限命令
- 文件上传下载命令
- 用户和群组相关命令
- 用户与用户组的关系
- 用户相关的系统配置文件
- 用户相关命令
- 用户组相关命令
- 压缩与解压相关命令
- .zip格式
- .tar.gz格式
- .gz格式
- .bz2格式
- 查看系统版本
- cpuinfo详解
- meminfo详解
- getconf获取系统信息
- 磁盘空间相关命令
- 查看系统负载情况
- 系统环境变量
- 网络相关命令
- ip命令详解
- ip命令格式详解
- ip address命令详解
- ip link命令详解
- ip rule命令详解
- ip route命令详解
- nslookup命令详解
- traceroute命令详解
- netstat命令详解
- route命令详解
- tcpdump命令详解
- 系统进程相关命令
- ps命令详解
- pstree命令详解
- kill命令详解
- 守护进程-supervisord
- 性能监控相关命令
- top命令详解
- iostat命令详解
- pidstat命令详解
- iotop命令详解
- mpstat命令详解
- vmstat命令详解
- ifstat命令详解
- sar命令详解
- iftop命令详解
- 定时任务相关命令
- ssh登录远程主机
- ssh口令登录
- ssh公钥登录
- ssh带密码登录
- ssh端口映射
- ssh配置文件
- ssh安全设置
- 历史纪录
- history命令详解
- linux开启操作日志记录
- 拓展
- git
- git初始化本地仓库-https
- git初始化仓库-ssh
- git-查看和设置config配置
- docker
- 概念
- docker原理
- docker镜像原理
- docker Overlay2 文件系统原理
- docker日志原理
- docker日志驱动
- docker容器日志管理
- 原理论证
- 验证容器的启动是作为Docker Daemon的子进程
- 验证syslog类型日志驱动
- 验证journald类型日志驱动
- 验证local类型日志驱动
- 修改容器的hostname
- 修改容器的hosts
- 验证联合挂载技术
- 验证启动多个容器对于磁盘的占用情况
- 验证写时复制原理
- 验证docker内容寻址原理
- docker存储目录
- /var/lib/docker目录
- image目录
- overlay2目录
- 数据卷
- 具名挂载和匿名挂载
- 数据卷容器
- Dockerfile详解
- dockerfile指令详解
- 实例:构造centos
- 实例:CMD和ENTRYPOINT的区别
- docker网络详解
- docker-compose
- 缓存
- redis
- redis的数据类型和应用场景
- redis持久化
- RDB持久化
- AOF持久化
- redis缓存穿透、缓存击穿、缓存雪崩
- 常见网络攻击类型
- CSRF攻击
- XSS攻击
- SQL注入
- Cookie攻击
- 历史项目经验
- 图片上传项目实例
- 原生php上传方法实例
- base64图片流
- tp5的上传方法封装实例
- 多级关系的递归查询
- 数组转树结构
- thinkphp5.1+ajax实现导出Excel
- JS 删除数组的某一项
- 判断是否为索引数组
- ip操作