首先感谢大家之前的所有回答?没有他们我就无法到达那里。从 Stackexchange 社区学到了很多东西(包括 iptables 等)。
尽管如此。我处理的设置包括:
- 运行 Kubernetes 的笔记本电脑(使用 Calico CNI)(不幸的是在非公共 IP 后面)(笔记本电脑)
- 在 Digital Ocean 中运行的 VM,充当集群 (VM) 的 TCP 代理
为了解决缺乏公共 IP 的问题,我尝试使用 OpenVPN 以及自定义路由/iptables 设置来路由:
- 仅在端口 443、6443 和 80 上通过 OpenVPN 到 LAPTOP(通过 tun0)从互联网到 VM(通过 enp8s0)的流量
- 仅在端口 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 的表。
第二点对我来说是有问题的。无论我尝试什么(更多内容见下文),我都无法让它工作。
方法:
- 使用 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
我读到这可能是有点幼稚的方法(因为如果没有第一部分的工作,某些系统可能会错过双向通信),但如果它适用于我的特定场景,那么我对此表示同意。
- 使用连接标记扩展脚本(因此,如果通信发生逆转,则不会通过不同的接口):
#!/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 并在调查过程中(对于第一点)我在第一点中断了通信。