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

2019-07-15 17:56:26 +08:00
 vanillaxxx

在一台服务器上用 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
5737 次点击
所在节点    云计算
16 条回复
elfive
2019-07-15 18:02:50 +08:00
好像 ospf 等路由协议也只是负责 ip 寻址,不负责根据端口寻址。

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

在本机上我感觉是行不通的,或者是我知道的太少了……
liukangxu
2019-07-15 18:18:34 +08:00
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
2019-07-15 18:20:16 +08:00
实际上并不需要三块网卡,一块网卡上配置多个 IP 即可
Yourshell
2019-07-15 18:45:18 +08:00
docker 的网络不是可以绑定网卡吗
vanillaxxx
2019-07-15 18:56:44 +08:00
老哥感谢我回去试试看
vanillaxxx
2019-07-15 18:57:57 +08:00
@Yourshell 我给 docker 创建了三个虚拟网卡……貌似是我姿势错了……
Flasky
2019-07-15 19:18:18 +08:00
应该是可以监听网卡 IP 的吧?
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
2019-07-15 20:22:41 +08:00
绑定到 ip 就行了,所有的服务都能单独绑定某个 ip
realpg
2019-07-16 03:07:58 +08:00
同段三个公网 IP 还是不同段的……
同网关的无所谓
不同段的要 iproute2 处理
goodboyMa
2019-07-16 15:38:07 +08:00
@jaskle 最优解
vanillaxxx
2019-07-17 12:16:07 +08:00
@jaskle 是不是就像是 @liukangxu 的方法呀?我尝试之后发现从 docker 里面出去的流量还是在走 eth0,应该是要走之前绑定的那个 ip 的网卡呀……
jaskle
2019-07-17 13:15:57 +08:00
@parorisim 这种方法只适合入站请求或者他的应答,主动出站是会根据主机路由表进行选择,因为出口只有一条路,谁在前走谁
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
2019-07-17 15:26:19 +08:00
@parorisim 流量默认都是从主网卡( eth0 )出去的,除非配置路由策略
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/583173

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX