多IP指定出口IP地址 如何指定云服务器源IP?

如果一个主机绑定有多个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地址

时间: 2024-10-05 04:24:52

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

php 通过ip获取所在城市地址信息 获取计算机外网ip

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

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

问题:云盾正常扫描云服务器的IP是什么? 解答:云盾扫描云服务器的的IP段固定为 42.120.145.0/24 110.75.105.0/24 110.75.185.0/24 110.75.186.0/24 112.125.32.0/24 112.124.36.187/32 121.0.19.0/24 121.0.30.0/24 121.42.0.0/24 42.120.142.0/24 42.156.250.0/24 http://help.aliyun.com/knowledge_deta

云服务器通过IP如何访问项目

图片发送有问题,大家移步到知乎搜索「胡同七月」 趁着云服务器打折,买了个三年的ESC云服务器,没错就是229三年,在这里还得感谢我老弟,是他的新用户才让我体验到了服务器的优惠, 229三年的云服务器 拿到服务器后,一看里面真的很干净,系统内存只有1G被使用,那剩下的这么多内存还是可以给我安装一些需要的东西的,里面的目录看来和自己接触到的服务器是一样子的,唯一不同的就是连java环境都没有,那只能下载需要的Java,apche tomcat,MySQL这几个简单的软件.这起码可以简单的部署一个简单

ROS单内网服务器源IP限速

最近项目有个需求,局域网有个文件服务器提供外网用户访问,但由于带宽较小,所以想限制总带宽比如10M,然后单个建立的链接也就是上传不能超过比如3M,一旦超过总带宽就均分 标记访问该内网服务器的IP /ip firewall mangle add chain=forward dst-address=192.168.10.10 action=mark-connection new-connection-mark=users-con /ip firewall mangle add connection-

linux下通过iptables只允许指定ip地址访问指定端口的设置方法

这篇文章主要介绍了linux下通过iptables只允许指定ip地址访问指定端口的设置方法,需要的朋友可以参考下. 首先,清除所有预设置 iptables -F#清除预设表filter中的所有规则链的规则 iptables -X#清除预设表filter中使用者自定链中的规则 其次,设置只允许指定ip地址访问指定端口 其次,设置只允许指定ip地址访问指定端口 iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT iptab

java网络访问指定出口ip

java网络访问指定出口ip Table of Contents 1. socket 2. apache httpclient 1 socket 可以在Socket构造函数中指定使用的本地ip,如: Socket socket = new Socket("127.0.0.1", 12345, InetAddress.getByAddress(new byte[] { new Integer(10).byteValue(), new Integer(211).byteValue(), n

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

首先,清除所有预设置 iptables -F#清除预设表filter中的所有规则链的规则 iptables -X#清除预设表filter中使用者自定链中的规则 其次,设置只允许指定ip地址访问指定端口 iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -d xxx.xxx.xxx.xxx -p tcp --sport 22 -j ACCEPT iptables -A INPUT

Linux防火墙限制指定port仅仅能由指定IP訪问

须要对redis的端口做限制,仅仅能让公司内指定IP的机器訪问 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT -A INPUT -m state --s

从ip addr add和ifconfig的区别看linux网卡ip地址的结构

今天一个老外在邮件列表上问了一个问题,就是ip addr add和ifconfig的区别,我给他进行了解答,可能因为英语不好吧,解答的很简单,因此我还是要在这里详细说明一下.其实它们之间没有什么区别,只 是表述方式不同罢了.如果你非常理解网络协议的原理以及网络的分层架构那么我想你就不会有这个问题,实际上,每一个网卡设备都有一个mac地址,但是却可 以有多个网络层地址,比如IP地址,然而这个事实无法很好地像用户提供操作接口,所以就引出了ip别名(IP aliases)和辅助ip(secondary