V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
vanillaxxx
V2EX  ›  云计算

一台服务器有三块网卡,上面运行三个服务,如何让每个服务只用一张网卡?

  •  
  •   vanillaxxx · 2019-07-15 17:56:26 +08:00 · 5704 次点击
    这是一个创建于 1956 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在一台服务器上用 docker 跑了三个服务,A 服务端口 500、B 服务端口 600、C 服务端口 700 ; 这台服务器有三张网卡,都有固定的公网 IP ; 现在需求是使用同一个端口去访问这三个公网 IP,实现 IP1 访问到 A:500,IP2 访问到 B:600,IP3 访问到 C:700 ; 我写了下面的 iptables 规则还是没法访问,各位老哥问题出在哪儿?

    iptables -t nat -I PREROUTING -i eth1 -p udp --dport 80 -j DNAT --to-destination 127.0.0.1:500
    iptables -t nat -I PREROUTING -i eth2 -p udp --dport 80 -j DNAT --to-destination 127.0.0.1:600
    iptables -t nat -I PREROUTING -i eth3 -p udp --dport 80 -j DNAT --to-destination 127.0.0.1:700
    
    iptables -t nat -A POSTROUTING -p udp -d 127.0.0.1 --dport 500 -j SNAT --to-source 1.1.1.1
    iptables -t nat -A POSTROUTING -p udp -d 127.0.0.1 --dport 600 -j SNAT --to-source 2.2.2.2
    iptables -t nat -A POSTROUTING -p udp -d 127.0.0.1 --dport 700 -j SNAT --to-source 3.3.3.3
    
    16 条回复    2019-07-24 19:16:30 +08:00
    elfive
        1
    elfive  
       2019-07-15 18:02:50 +08:00 via iPhone
    好像 ospf 等路由协议也只是负责 ip 寻址,不负责根据端口寻址。

    我的想法是三个网卡出来三根网线接同一个路由,在路由上实现根据端口来走不同的网卡的 nat 功能。

    在本机上我感觉是行不通的,或者是我知道的太少了……
    liukangxu
        2
    liukangxu  
       2019-07-15 18:18:34 +08:00   ❤️ 1
    IP1: 1.1.1.1
    IP2: 2.2.2.2
    IP3: 3.3.3.3

    A 服务:docker run -d -p 1.1.1.1:80:500 image_A
    B 服务:docker run -d -p 2.2.2.2:80:600 image_B
    C 服务:docker run -d -p 3.3.3.3:80:700 image_C
    liukangxu
        3
    liukangxu  
       2019-07-15 18:20:16 +08:00
    实际上并不需要三块网卡,一块网卡上配置多个 IP 即可
    Yourshell
        4
    Yourshell  
       2019-07-15 18:45:18 +08:00 via iPhone
    docker 的网络不是可以绑定网卡吗
    vanillaxxx
        5
    vanillaxxx  
    OP
       2019-07-15 18:56:44 +08:00 via iPhone
    老哥感谢我回去试试看
    vanillaxxx
        6
    vanillaxxx  
    OP
       2019-07-15 18:57:57 +08:00 via iPhone
    @Yourshell 我给 docker 创建了三个虚拟网卡……貌似是我姿势错了……
    Flasky
        7
    Flasky  
       2019-07-15 19:18:18 +08:00 via Android
    应该是可以监听网卡 IP 的吧?
    sunznx
        8
    sunznx  
       2019-07-15 19:37:18 +08:00
    写反了 POSTROUTING 的时候要反过来

    iptables -t nat -I PREROUTING -p tcp --destination 192.168.30.70 --dport 80 -j DNAT --to-destination 127.0.0.1:500
    iptables -t nat -I PREROUTING -p tcp --destination 192.168.40.70 --dport 80 -j DNAT --to-destination 127.0.0.1:600

    iptables -t nat -I POSTROUTING -p tcp --source 127.0.0.1 --sport 500 -j SNAT --to-source 192.168.30.70:80
    iptables -t nat -I POSTROUTING -p tcp --source 127.0.0.1 --sport 600 -j SNAT --to-source 192.168.40.70:80
    jaskle
        9
    jaskle  
       2019-07-15 20:22:41 +08:00 via Android
    绑定到 ip 就行了,所有的服务都能单独绑定某个 ip
    realpg
        10
    realpg  
       2019-07-16 03:07:58 +08:00
    同段三个公网 IP 还是不同段的……
    同网关的无所谓
    不同段的要 iproute2 处理
    goodboyMa
        11
    goodboyMa  
       2019-07-16 15:38:07 +08:00
    @jaskle 最优解
    vanillaxxx
        12
    vanillaxxx  
    OP
       2019-07-17 12:16:07 +08:00 via iPhone
    @jaskle 是不是就像是 @liukangxu 的方法呀?我尝试之后发现从 docker 里面出去的流量还是在走 eth0,应该是要走之前绑定的那个 ip 的网卡呀……
    jaskle
        13
    jaskle  
       2019-07-17 13:15:57 +08:00 via Android
    @parorisim 这种方法只适合入站请求或者他的应答,主动出站是会根据主机路由表进行选择,因为出口只有一条路,谁在前走谁
    liukangxu
        14
    liukangxu  
       2019-07-17 15:25:04 +08:00
    @parorisim 以下摘自腾讯云官方文档( https://cloud.tencent.com/document/product/576/18535

    最常见的业务场景的配置参考:用策略路由让报文从哪个网卡进,则从该网卡返回。

    创建两张路由表
    echo "10 t1" >> /etc/iproute2/rt_tables
    echo "20 t2" >> /etc/iproute2/rt_tables

    给两个路由表添加默认路由
    ip route add default dev eth0 table 10
    ip route add default dev eth1 table 20

    配置策略路由
    ip rule add from 192.168.1.5/32 table 10
    ip rule add from 192.168.1.62/32 table 20
    liukangxu
        15
    liukangxu  
       2019-07-17 15:26:19 +08:00
    @parorisim 流量默认都是从主网卡( eth0 )出去的,除非配置路由策略
    onion83
        16
    onion83  
       2019-07-24 19:16:30 +08:00
    linux 下 ip 命令有个叫 netns 可以单独命名空间,在命名空间里面跑独立的应用,还有可以由自己独立的路由,ip 地址等,以下是一个完整的实例。

    #配置 valn
    vconfig add eth0 900
    ip link set up eth0.900

    #配置 netns
    ip netns add iot
    ip link set dev eth0.900 netns iot
    ip netns exec iot ip link set lo up
    ip netns exec iot ip link set eth0.900 up
    ip netns exec iot ip addr add 192.168.111.254/24 broadcast 192.168.111.255 dev eth0.900
    ip netns exec iot ip r add default via 192.168.111.1
    ip netns exec iot curl myip.ipip.net


    #配置 veth 实现和真实主机互通
    ip link add veth0 type veth peer name veth1
    ip link set dev veth1 netns iot

    ## 主机虚拟网卡
    ip addr add 172.16.1.1/24 dev veth0
    ip link set veth0 up

    ## ns 虚拟网卡
    ip netns exec iot ip addr add 172.16.1.2/24 dev veth1
    ip netns exec iot ip link set veth1 up
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3470 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:35 · PVG 12:35 · LAX 20:35 · JFK 23:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.