在一台服务器上用 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
1
elfive 2019-07-15 18:02:50 +08:00 via iPhone
好像 ospf 等路由协议也只是负责 ip 寻址,不负责根据端口寻址。
我的想法是三个网卡出来三根网线接同一个路由,在路由上实现根据端口来走不同的网卡的 nat 功能。 在本机上我感觉是行不通的,或者是我知道的太少了…… |
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 |
3
liukangxu 2019-07-15 18:20:16 +08:00
实际上并不需要三块网卡,一块网卡上配置多个 IP 即可
|
4
Yourshell 2019-07-15 18:45:18 +08:00 via iPhone
docker 的网络不是可以绑定网卡吗
|
5
vanillaxxx OP 老哥感谢我回去试试看
|
6
vanillaxxx OP @Yourshell 我给 docker 创建了三个虚拟网卡……貌似是我姿势错了……
|
7
Flasky 2019-07-15 19:18:18 +08:00 via Android
应该是可以监听网卡 IP 的吧?
|
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 |
9
jaskle 2019-07-15 20:22:41 +08:00 via Android
绑定到 ip 就行了,所有的服务都能单独绑定某个 ip
|
10
realpg 2019-07-16 03:07:58 +08:00
同段三个公网 IP 还是不同段的……
同网关的无所谓 不同段的要 iproute2 处理 |
12
vanillaxxx OP |
13
jaskle 2019-07-17 13:15:57 +08:00 via Android
@parorisim 这种方法只适合入站请求或者他的应答,主动出站是会根据主机路由表进行选择,因为出口只有一条路,谁在前走谁
|
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 |
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 |