总结一下上下文,它是一个始终作为 OpenVpn 客户端连接的 lxd 容器。
{万}<->{192.168.xx <-> iptables <-> lxd 桥接主机 10.0.3.1}<->{lxd 容器 10.0.3.3 | openvpn <-> iptables}
容器中有
- eth0(ip 10.0.3.3)是 lxd 桥上的客户端接口
- tun0 作为客户端连接到 OpenVpn 服务器
主机 lxd(10.0.3.1)将 10.0.3.3 流量转发到外部网络,iptables 始终接受传出连接。
主机和 lxd 客户端都有 iptables。
我已经在 10.0.3.3 上完成了路由,但针对的是传入端口(例如,传入 http 端口到 10.0.3.3 并且响应在 eth0 上,而不是 tun0)。
所以我有一个带有 fwmark 号码的“novpn”路由表。
我现在的问题是,我正在尝试做相反的事情。任何远程服务器上发往端口 21 的传出请求都必须经过 eth0(“novpn”表)。
我按照 stackoverflow 上的几篇文章做了一下修改,并将其集成到 10.0.3.3 客户端的 iptables 中。我感觉它只是:
ip rule add fwmark 66 novpn table
ip route add default via 10.0.3.1 dev eth0 novpn table
iptables -t mangle -A PREROUTING -p tcp --dport 21 -j MARK --set-mark 66
iptables -t mangle -A OUTPUT -p tcp --dport 21 -j MARK --set-mark 66
在 10.0.3.1 的 iptables 上,我有一条规则,接受来自已建立和已知连接的转发。因此网桥应该遵循,我认为不需要任何其他规则?
但它不起作用,当我查看主机 (10.0.3.1) 上的 tcpdump 时,我看到数据包是用 openvpn IP 发送的,而不是 10.0.3.3。发送数据包的校验和似乎也有问题 -> cksum 0x1983(不正确 -> 0xe8ec)。
奇怪的是,当我在 lxd 客户端(10.0.3.3)的控制台上执行 tcpdump 时,tcpdump 不显示任何内容,而且我不再理解任何内容。
我想知道 lxd 是否优先于 iptables(和 tcpdump??),(可能像代理设备等),但这对我来说似乎很奇怪。
如果有用的话,我有一条规则“ip 规则添加到 xxx.xxx.xxx.xxx 表 novpn”。因此,与此 ip 的任何连接都会通过 eth0,而且确实如此,tcpdump 中的请求是正确的。
有谁能够帮助我。