通过特定接口路由特定端口上的传出流量

通过特定接口路由特定端口上的传出流量

首先感谢大家之前的所有回答?没有他们我就无法到达那里。从 Stackexchange 社区学到了很多东西(包括 iptables 等)。

尽管如此。我处理的设置包括:

  1. 运行 Kubernetes 的笔记本电脑(使用 Calico CNI)(不幸的是在非公共 IP 后面)(笔记本电脑)
  2. 在 Digital Ocean 中运行的 VM,充当集群 (VM) 的 TCP 代理

为了解决缺乏公共 IP 的问题,我尝试使用 OpenVPN 以及自定义路由/iptables 设置来路由:

  1. 仅在端口 443、6443 和 80 上通过 OpenVPN 到 LAPTOP(通过 tun0)从互联网到 VM(通过 enp8s0)的流量
  2. 仅在端口 443 和 80 上通过虚拟机从笔记本电脑传至互联网的流量。

第一部分与在服务器新贵上运行的以下脚本完美配合:

#!/bin/bash
set -e

sysctl -w net.ipv4.conf.tun0.rp_filter=2;

ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3

ip route flush cache

iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2

来自10.8.0.1超过 6443,443,80 的所有流量都会被标记为2并进入3默认规则经过 10.8.0.2 的表。

第二点对我来说是有问题的。无论我尝试什么(更多内容见下文),我都无法让它工作。

方法:

  1. 使用 PREROUTING 配置扩展脚本,通过接口弹射流量:
#!/bin/bash
set -e
sleep 20

sysctl -w net.ipv4.conf.tun0.rp_filter=2;

ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3

ip rule add fwmark 4 table 5   # adding rule/route association
ip route add default via 10.8.0.1 table 5 # adding default via for table

ip route flush cache

iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2


iptables -A PREROUTING -i enp8s0 -t mangle -p tcp -m multiport --dports 443,80 -j MARK --set-mark 4 # mark ports during PREROUTING

我读到这可能是有点幼稚的方法(因为如果没有第一部分的工作,某些系统可能会错过双向通信),但如果它适用于我的特定场景,那么我对此表示同意。

  1. 使用连接标记扩展脚本(因此,如果通信发生逆转,则不会通过不同的接口):
#!/bin/bash
set -e
sleep 20

sysctl -w net.ipv4.conf.tun0.rp_filter=2;

ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3

ip rule add fwmark 4 table 5   # adding rule/route association
ip route add default via 10.8.0.1 table 5 # adding default via for table

ip route flush cache

iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2

# adding whole connection marking below
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 443,80 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -m connmark --mark 4 -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark --mark 4 -j CONNMARK --save-mark

问题是,每次我尝试在此处添加预期的第二种机制时,我仍然会从curl https://ifconfig.me(与 enp8s0 关联的 IP)返回错误的公共 IP。

您可以给我一些建议来解决这个问题吗?我在那里缺少什么?

另一件要记住的事情是,CALICO 也在与 iptables 一起做 mambo-jambo。我不想干扰端口 80 和 443 上进行的内部集群内通信。例如,cert-manager用于检查其 CRD 的准入控制器侦听端口 443 并在调查过程中(对于第一点)我在第一点中断了通信。

相关内容