绑定本地出口IP

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因 最近公司有一批数据要备份到对象存储中。机房为3线机房,为了充分利用机房的出口带宽,我只能轮流绑定源IP(本机有3个IP,分别是联通、移动、电信) 源码如下: # -*- coding: utf-8 -*- import socket import requests class BindAddress(object): def __init__(self, ip): self.ipbind = ip self.real_socket = socket.socket def __enter__(self): def bound_socket(*a, **k): sock = self.real_socket(*a, **k) sock.bind((self.ipbind, 0)) return sock socket.socket = bound_socket def __exit__(self, type, value, trace): socket.socket = self.real_socket ip= 'xxx.xxx.xxx.xxx' with BindAddress(ip): r = requests.get('http://ip.vearne.cc:8080/') print r.content 我在峰云大神的基础上做了进一步封装,使得bind操作变得更简单 另外代码中用到了我在 快速获取本机出口IP 一文中搭建的服务,以判断bind是否生效。 额外的说明1 其实我们在爬虫的时候,也有用这种方法,在增加客户端IP,以减少被封杀的概率。只需要在一块网卡上绑定多个公网IP即可。 额外的说明2 由于以上的做法修改的是模块的函数,因此对于多线程的场景,它不是线程安全的。 ...

January 19, 2018 · 1 min

wget bind ip 失败

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 我们的程序需要从文件服务器拉去文件(跨机房), 程序运行的机器有电信、联通、移动3线,3个IP 假定为 01_DX_IP, 01_LT_IP, 01_YD_IP 文件服务器也是电信、联通、移动3线,3个IP 02_DX_IP, 02_LT_IP, 02_YD_IP 其域名为myfile.com 使用wget拉去文件,为了保证出口带宽用的尽量上,绑定出口IP wget --bind-address=01_YD_IP -t 3 -T 120 --limit-rate=3M -S -O 1407856770354_858932.mp4 http://myfile.com/data10/sony/303/2014-08/12/1407856770354_858932.mp4 按照预先的想法,绑定了移动IP,正常DNS服务器会返回一个文件服务器的移动IP,速度应该不会太慢,事情情况下,下载速度不到100k 1. 排查: 1.1 观察文件下载连接 观察wget打印的日志,显示实际建立连接访问的是联通的IP Resolving myfile.com... 02_LT_IP, ... Connecting to myfile.com|02_LT_IP|:80... connected. HTTP request sent, awaiting response... ^C 使用lsof观察进程的连接情况 [xxx@c3n~]$ sudo lsof -p 133396 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME wget 133396 root cwd DIR 8,2 4096 59640871425 /datapool/log/inject/xxx.log wget 133396 root 6w REG 0,17 164815000 59756490241 /datapool/injectBase/1408203875738_777462.mp4 wget 133396 root 7u IPv4 1479434406 0t0 TCP 01_YD_IP:29657->02_LT_IP:http (ESTABLISHED) 注意这一行 TCP 01_YD_IP:29657->02_LT_IP:http (ESTABLISHED) 本地的bind address确实已经生效,已经绑定了移动IP, 但是文件服务器的IP地址却是联通IP, 那只能是DNS解析有问题了 ...

January 1, 2018 · 2 min