我在 Amazon 的 EC2 上运行了一台 Ubuntu 12.04 服务器,该服务器运行网络爬取进程。我们遇到了一个问题,托管我们需要爬取的网站的一些网络服务器阻止了所有 EC2 IP 地址。
我有一个绝妙的想法,那就是通过 VPN 隧道传输传出的 HTTP 请求。我能够设置 VPN,但它会将所有流量都路由到 VPN,这意味着我无法通过 SSH 进入机器,而且它不会响应任何传入的 http 请求。(此服务器还托管我们需要能够访问的 Web 服务)
实际上,我只是想通过 VPN“代理”所有传出的 HTTP 请求,这样我们就可以访问所有 EC2 IP 都被阻止的站点。
我很可能以错误的方式处理这个问题,我欢迎任何可能更简单或更有力的建议。
答案1
你需要的是源策略路由将对传入连接的响应路由到 EC2 网关而不是 VPN。假设您的实例的内部 IP 为 1.0.0.20,默认网关为 1.0.0.1,VPN IP 为 10.8.0.20:
创建命名路由表(只需做一次)
echo 10 ec2 >> /etc/iproute2/rt_tables echo 11 vpn >> /etc/iproute2/rt_tables
使用各自网关上的默认路由配置新的路由表
ip route add 1.0.0.0/24 dev eth0 table ec2 ip route add default via 1.0.0.1 table ec2 ip route add 10.8.0.0/24 dev tun0 table vpn ip route add default via 1.0.0.1 table vpn
添加路由规则,根据源地址选择正确的路由表
ip rule add from 1.0.0.20 lookup ec2 ip rule add from 10.8.0.20 lookup vpn
这应该允许您将默认网关设置为 VPN,并且仍能使传入连接正常工作。
但是,您可以做的是,在创建传出连接时将应用程序配置为明确绑定到 VPN IP (10.8.0.20),这将导致来自该应用程序的所有连接都通过 VPN,但所有其他传出连接都直接传出。如果您无法将应用程序配置为绑定到 VPN IP,则可以添加 HTTP 代理服务器来执行此部分。