如果一个主机绑定有多个IP地址,那么在被动响应和主动发起连接两种方式中,源IP地址的选择机制肯定是有所差异的。主机在接收外部数据包,并发送响应数据包时,响应源地址显然就是客户端请求的地址,这是非常容易理解的,如客户端向主机的1.1.2.3:80发起请求,那么主机响应数据包的源IP地址一定是1.1.2.3。

那么当主机对外主动发起请求时,数据包的源IP地址如何选择?这个问题我们可能一般很少深入了解, 为了弄清楚这个问题,我发了不少时间,广泛查阅各种资料,目前得出的结论如下:

Linux 2.2 选择源IP的三种机制

  • 1. 应用程序可以通过bind(2)系统调用,应用至sendmsg(2)调用上,并通过辅助数据对象IP_PKTINFO,从而显式指定源IP地址。在这种情况下,操作系统内核仅仅检查其源IP地址是否正确,否则产生相应的错误。
  • 2. 如果应用程序没有指定源IP地址,包含源IP的路由表将决定数据包源IP地址,通过设置ip route命令的src参数,从而指定源IP地址。如果路由表没有包含src属性,则使用主要IP地址。
  • 3. 其它情况下内核搜寻绑定定数据包路由接口上的IP地址,IPv6选择第一个可用的IP地址。IPv4情况下,尽量选择与目标IP处于同一子网的源IP,如果目标IP与自己的所有ip没有处于同一子网,则使用第二种算法。

相同/不同子网情况

默认情况下,如果Linux的网卡有多个IP且位于不同的子网之中,如果数据包目标地址为某个子网中的IP, 那么对应的与目标同子网的IP将会被使用。如果eth0有两个IP 192.168.1.12/24,  10.1.1.1/8,那么到10.0.0.0子网的数据包的源地址将使用10.1.1.1。 当然可以使用ip route的src属性指定源址。

如果绑定的几个IP处于同一个子网内,那么主要IP地址将被使用(如eth0接口上的IP), 也可以使用iptables修改数据包的源地址实现之,如:

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

多IP指定出口ip实例

原理分析及处理办法我们已经分析完毕,接下来使用实际的例子展示

目标:当此主机对外发起新连接时,源IP地址使用192.168.0.22, 不使用默认的192.168.0.250。

环境:Linux 主机绑定有以下几个IP(网关为192.168.0.1)
eth0 192.168.0.250/24,  eth0: 1  192.168.0.22/24,   eth0:2 192.168.0.23/24

另外,绑定多个IP可使用ip addr add命令,不产生子接口。

在上述案例中192.168.0.250将成为默认主要IP。

方法一:修改路由表的源IP属性
一.  查看系统的 ip 地址及路由表详细信息 ( 加粗字体是输入的内容 )

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# ip addr
 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
 
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 
inet 127.0.0.1/8 scope host lo
 
inet 192.168.100.250/32 scope global lo
 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
 
link/ether f4:6d:04:76:ca:98 brd ff:ff:ff:ff:ff:ff
 
inet 192.168.0.250/24 brd 192.168.0.255 scope global eth0
 
inet 172.16.25.1/24 scope global eth0
 
inet 192.168.0.22/24 scope global secondary eth0
 
inet 192.168.0.23/24 scope global secondary eth0
 
请注意 192.168.0.250是global状态,而其它地址是secondary状态。
 
1
2
3
4
5
6
7
8
9
[root@localhost ~]# ip route
 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.250
 
172.16.25.0/24 dev eth0  proto kernel  scope link  src 172.16.25.1
 
169.254.0.0/16 dev eth0  scope link
 
default via 192.168.0.1 dev eth0

注意以上输出,会发现到同一子网的路由的源IP地址会使用主要IP地址。而到默认网关的路由没有指定源IP(实际上会用与网关同一子网的主要IP)。
修改路由表,让系统使用指定IP(192.168.0.22)作为源址:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# ip route change default dev eth0 src 192.168.0.22
 
[root@localhost ~]# ip route change to 192.168.0.0/24 dev eth0 src 192.168.0.22
 
[root@localhost ~]# ip route
 
192.168.0.0/24 dev eth0  scope link  src 192.168.0.22
 
172.16.25.0/24 dev eth0  proto kernel  scope link  src 172.16.25.1
 
169.254.0.0/16 dev eth0  scope link
 
default dev eth0  scope link  src 192.168.0.22

方法二,使用iptables修改源IP地址:

 
1
iptables -t nat -I POSTROUTING -o eth0 -d 0.0.0.0/0 -s 192.168.0.250 -j SNAT --to-source 192.168.0.22

方法二比较简单,大家可以写好脚本来切换出口IP地址

多IP指定出口IP地址 如何指定云服务器源IP?的更多相关文章

  1. 云盾正常扫描云服务器的IP是什么

    问题:云盾正常扫描云服务器的IP是什么?   解答:云盾扫描云服务器的的IP段固定为    42.120.145.0/24 110.75.105.0/24 110.75.185.0/24 110.75 ...

  2. Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】

    接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...

  3. windows/linux VPS云服务器限制IP访问,限制别人的IP访问网站方法

    服务器VPS云服务器如何限制IP访问,限制别人的IP访问网站的方法 windows主机IIS限制IP访问方法:首先打开IIS点击“网站”,右键属性,(如果仅给单个网站设置,请选择下边的站点,点右键“属 ...

  4. TCP/IP学习笔记13--IP地址的构成,广播地址,IP多播,子网掩码

    现在,我是蔚蓝的 :在此岸或彼岸,我都是蔚蓝的.  ---李瑾 IP对应的是OSI模型中的网络层,TCP对应的是传输层.每一个参与通信的主机都会有一个IP地址. IP地址(IPv4地址)含4个字节,每 ...

  5. 在阿里云服务器中用IP连接SQLserver2014提示40,53错误

    在有些时候我们需要他人来连接我们的数据库,这个时候我们需要用我们本地的IP地址来连接,在连接的过程中可能会出现找不到网络路径提示40,53的错误 解决方案: 1.打开配置管理器 2.点开网络配置,点击 ...

  6. 阿里云服务器公网Ip外网无法访问

    拥有了自己的服务器后,发现需要各种配置,之前应用公司的服务器的时候,一般通过内网访问,或者外网访问时,很多配置其他人员都已经配置好了,但是现在在自己的服务器上发布自己的网站的时候,才发现事情并没有自己 ...

  7. 防止DDOS攻击有效方法:隐藏服务器真实IP

    如今,网站服务器的安全受到越来越多的重视,但是难免会遇到黑客使用DDoS攻击网站,为了网站的安全通常都会做好防御,其中防止DDoS攻击有效方法:隐藏服务器真实IP ,该技术能够有效地保护网站的安全. ...

  8. Windwos Server 2008: 当网卡有多个IP地址时,如何指定缺省地址?

    这实际是一个当应用向外发起连接时,协议栈对源IP地址的选择问题.如果你的应用没有显式绑定一个本地地址,协议栈会选择一个"最佳"的本地地址来使用. 从 Vista 之后这个选择策略发 ...

  9. iptables只允许指定ip地址访问指定端口

    首先,清除所有预设置 iptables -F#清除预设表filter中的所有规则链的规则 iptables -X#清除预设表filter中使用者自定链中的规则 其次,设置只允许指定ip地址访问指定端口 ...

随机推荐

  1. [转载]AngularJS入门教程04:双向绑定

    在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f ...

  2. AngularJS 应用

    AngularJS模块(Module)定义了AngularJS的应用. AngularJS控制器(Controller)用于控制AngularJS应用. ng-app指令定义了应用,ng-contro ...

  3. C#继承机制 C#中的继承符合下列规则

    1.继承是可传递的.如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员.Object 类作为所有类的基类. 2.派生类应当是对基类的扩展.派生类可以添加新的成员, ...

  4. eclipse部署web项目至本地的tomcat但在webapps中找不到问题

    一.发现问题 在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并 ...

  5. 《转载》ASP动态iframe

    原文:[ASP.NET]关于iframe的两个技巧 最近在给朋友写个网站,虽然不大,但是也碰到了一些问题.这篇就为解决ASP.NET中关于IFRAME的两个很现实的问题提供解决方法.PS:呵呵,又做了 ...

  6. MySQL - DELETE 多表联合条件删除

    DELETE t0 FROM t_demo t0, t_user u WHERE t0.id = 6 AND t0.id = u.id

  7. 七、Shell printf 命令

    Shell printf 命令 上一章节我们学习了 Shell 的 echo 命令,本章节我们来学习 Shell 的另一个输出命令 printf. printf 命令模仿 C 程序库(library) ...

  8. 文档对象模型 DOM

    1 DOM概述 1.1 什么是DOM 文档对象模型 Document Object Model 文档对象模型 是表示和操作 HTML和XML文档内容的基础API 文档对象模型,是W3C组织推荐的处理可 ...

  9. jupyter notebook(三)——IOPub_data_rate_limit报错

    一.问题 运行jupyter notebook,然后运行python代码,读取文件处理时,会报错.发现时IO读取时错误.应该是IO速率问题. 下面是问题报错: IOPub data rate exce ...

  10. JZOJ 2499. 东风谷早苗

    2499. 东风谷早苗 (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits   Goto Pro ...