求问关于 iptables 端口映射的问题,求对网络比较熟的人帮忙 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lsylsy2

求问关于 iptables 端口映射的问题,求对网络比较熟的人帮忙

  •  
  •   lsylsy2 Aug 22, 2014 3775 views
    This topic created in 4268 days ago, the information mentioned may be changed or developed.
    目标:想要在公网做端口映射,用iptables实现,功能有些类似“haproxy的TCP转发”。
    网络环境:(IP替换过)
    服务器A:Azure,公网IP 8.8.8.1,内网IP 10.8.8.1;
    服务器B:某VPS,网卡直接绑定公网IP 8.8.8.2;
    在AB之间利用openvpn建立了隧道,Azure端IP 10.0.0.1,VPS端IP 10.0.0.2,测试通过这对IP ping wget均正常。
    目标:访问http://8.8.8.1/,请求能够被发送到服务器B

    目前iptables用的是这两条规则:
    -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2
    -A POSTROUTING -o eth0 -j MASQUERADE

    从我的个人电脑(IP 8.8.8.3)进行了telnet 8.8.8.1 80
    并且tcpdump抓包测试,结果如下:
    1、服务器A上,8.8.8.3->10.8.8.1 SYN包,这是正常的外网连接Azure;
    2、服务器A上,8.8.8.3->10.0.0.2 SYN包,这是第一个包经过iptables转换,目标地址变成了服务器B;
    3、服务器B上,8.8.8.3->10.0.0.2 SYN包,这个SYN包被成功的发送了过来;
    4、服务器B上,10.0.0.2->8.8.8.3 SYN-ACK包,进行TCP三步握手;

    然后包4就丢失了……至少看起来是丢失了,#服务器A并没有收到这个ACK#,后面有几个重发的SYN与SYN-ACK包,但是都是1234中的某一个。求问这是哪里设置的问题么?
    Supplement 1    Aug 22, 2014
    我现在有一点疑惑:
    在ifconfig里面,公网的那个IP和VPN的IP各占一个网卡,他们的地位应该是完全相同的;
    如果这种情况下无法建立链接的话,那么那些有着多个网卡、多个IP地址的服务器,难道一个用户就只能访问一个IP,其它IP都链接不通么?难道不应该是默认哪里来哪里去么?
    Supplement 2    Aug 24, 2014
    成功了!测试了可以通过服务器A的2222端口连接服务器B的SSH(通过2222转发到22),然后服务器B上netstat能获取我客户端的IP。
    最后服务器B修改iptables无效,而是用iprouter2解决的,具体的我明天睡醒了再整理写博客,大家可以期待一下ww
    11 repies    2014-08-24 02:36:46 +08:00
    tmqhliu
        1
    tmqhliu  
       Aug 22, 2014
    建议你直接用 nginx 之类的反向代理就行,应用层的需求可以用应用层的方式来解决,不要什么都想着用 iptables

    如果你用 DNAT 把包交给 Server B ,Server B 在返回时也要有相应的路由。不能只有去的路,没有回来的路。
    lsylsy2
        2
    lsylsy2  
    OP
       Aug 22, 2014
    @tmqhliu 现在的问题就是应用层直接读取的TCP对方IP,闭源软件无法修改……
    回来和去走一条路不行么?假如我的电脑插了两根网线,分别是电信联通,难道有一边无法使用么?
    tmqhliu
        3
    tmqhliu  
       Aug 22, 2014
    如果软件读 8.8.8.1 ,你在8.8.8.1 上配置一个 http透明代理,把请求转交给实际的服务器B不行么?


    你没理解我的话。走一条路当然可以,但这事需要配置,并不是你一厢情愿就可以的
    lsylsy2
        4
    lsylsy2  
    OP
       Aug 22, 2014
    @tmqhliu 走的并不是HTTP协议,是一个裸的TCP协议,内部内容我无法修改,直接TCP转发会导致无法获取用户IP从而影响功能
    我的问题是,像“站群VPS”那样,一台Linux上绑着很多个IP,那么一个用户只能访问一个IP上的网站么?
    tmqhliu
        5
    tmqhliu  
       Aug 22, 2014
    哦 原来是原生 TCP 那就没法搞代理了

    站群那样配了很多个 IP,但可能只有一个网关,返回的数据包下一跳就是这个网关地址。而你的服务器B,是在两个接口上配了两个不同的ip,如果数据包是从 tun 接口进来的,返回的包却从 eth 公网接口出去,很可能是目的地址不可达(没有相应的路由)所以就收不到返回的数据包了,自然 TCP 连接也无从谈起。

    建议你在 服务器 B 上 traceroute 一下客户端的 IP (比如主贴中你的pc地址)看一下是否是畅通的。
    tmqhliu
        6
    tmqhliu  
       Aug 22, 2014
    “难道不应该是默认哪里来哪里去么?” 这个还真不是,你看看 2006 年就有人提这个问题了:
    《多线路服务器如何让访问数据包从哪条线路进就从哪条出》
    http://www.linuxsir.org/bbs/thread277992.html

    你的问题是,数据包是在服务器 A 上由 iptables 经 DNAT 之后通过 VPN 隧道发给服务器 B,服务器 B 在收到连接请求后,发送 SYN+ACK,但是从公网接口发送出去的。公网上的路由器在收到一个源地址为 10 开头的包,很可能就会扔掉了,因为这种私有地址的包不应该出现在公网上。
    tmqhliu
        7
    tmqhliu  
       Aug 22, 2014   1
    解决方案: 在服务器B上添加策略路由,指定源地址为 10.0.0.2 的包从接口 tun 发出去。
    lsylsy2
        8
    lsylsy2  
    OP
       Aug 22, 2014
    @tmqhliu 十分感谢!
    jerry74
        9
    jerry74  
       Aug 22, 2014
    试试看吧
    iptables -t nat -I PREROUTING -d 8.8.8.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 8.8.8.2
    lsylsy2
        10
    lsylsy2  
    OP
       Aug 23, 2014
    -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2
    @jerry74 我现在用的是这个,没有问题的;
    你想说公网是么,那个不好使……
    lsylsy2
        11
    lsylsy2  
    OP
       Aug 24, 2014
    @jerry74
    @tmqhliu
    成功了!测试了可以通过服务器A的2222端口连接服务器B的SSH(通过2222转发到22),然后服务器B上netstat能获取我客户端的IP。
    最后服务器B修改iptables无效,而是用iprouter2解决的,具体的我明天睡醒了再整理写博客好了
    About     Help     Advertise     Blog     API     FAQ     Solana     3824 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 05:17 PVG 13:17 LAX 22:17 JFK 01:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86