1
tmqhliu 2014-08-22 19:37:13 +08:00
建议你直接用 nginx 之类的反向代理就行,应用层的需求可以用应用层的方式来解决,不要什么都想着用 iptables
如果你用 DNAT 把包交给 Server B ,Server B 在返回时也要有相应的路由。不能只有去的路,没有回来的路。 |
2
lsylsy2 OP @tmqhliu 现在的问题就是应用层直接读取的TCP对方IP,闭源软件无法修改……
回来和去走一条路不行么?假如我的电脑插了两根网线,分别是电信联通,难道有一边无法使用么? |
3
tmqhliu 2014-08-22 20:12:18 +08:00
如果软件读 8.8.8.1 ,你在8.8.8.1 上配置一个 http透明代理,把请求转交给实际的服务器B不行么?
你没理解我的话。走一条路当然可以,但这事需要配置,并不是你一厢情愿就可以的 |
4
lsylsy2 OP @tmqhliu 走的并不是HTTP协议,是一个裸的TCP协议,内部内容我无法修改,直接TCP转发会导致无法获取用户IP从而影响功能
我的问题是,像“站群VPS”那样,一台Linux上绑着很多个IP,那么一个用户只能访问一个IP上的网站么? |
5
tmqhliu 2014-08-22 20:27:31 +08:00
哦 原来是原生 TCP 那就没法搞代理了
站群那样配了很多个 IP,但可能只有一个网关,返回的数据包下一跳就是这个网关地址。而你的服务器B,是在两个接口上配了两个不同的ip,如果数据包是从 tun 接口进来的,返回的包却从 eth 公网接口出去,很可能是目的地址不可达(没有相应的路由)所以就收不到返回的数据包了,自然 TCP 连接也无从谈起。 建议你在 服务器 B 上 traceroute 一下客户端的 IP (比如主贴中你的pc地址)看一下是否是畅通的。 |
6
tmqhliu 2014-08-22 21:11:04 +08:00
“难道不应该是默认哪里来哪里去么?” 这个还真不是,你看看 2006 年就有人提这个问题了:
《多线路服务器如何让访问数据包从哪条线路进就从哪条出》 http://www.linuxsir.org/bbs/thread277992.html 你的问题是,数据包是在服务器 A 上由 iptables 经 DNAT 之后通过 VPN 隧道发给服务器 B,服务器 B 在收到连接请求后,发送 SYN+ACK,但是从公网接口发送出去的。公网上的路由器在收到一个源地址为 10 开头的包,很可能就会扔掉了,因为这种私有地址的包不应该出现在公网上。 |
7
tmqhliu 2014-08-22 21:13:06 +08:00 1
解决方案: 在服务器B上添加策略路由,指定源地址为 10.0.0.2 的包从接口 tun 发出去。
|
9
jerry74 2014-08-22 22:38:14 +08:00
试试看吧
iptables -t nat -I PREROUTING -d 8.8.8.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 8.8.8.2 |