客观的
我正在寻找做这样的事情:
“迷你路由器”帮助控制和保护由于复杂原因无法更新且位于“野外”某处的旧系统。我们希望使用廉价、低功耗(例如 0.5V 和 < 100 mA)来改造系统。到处都有数千个这样的 SCADA 系统。我们需要进行白帽改造,但大约 15%-30% 的环境我们无法为“迷你路由器”获取 IP 地址(没有 DHCP),需要共享计算机/SCADA 系统 IP。我认为我们可以建立一个透明桥(下面的 br0 用作桥):
root% ip link add name br0 type bridge
root% ip link set dev br0 up
root% ip link set dev eth0 master br0
root% ip link set dev eth1 master br0
root% ip address add 10.253.252.2 dev br0
root% sysctl -w net.ipv4.conf.all.forwarding=1
然后使用 ebtables / iptables / iproute2 路由从 Server1 发往 Computer 的流量,以便我们可以 SSL 加密 / 解密它们之间的流量和/或“消耗”Server2 和 Computer 之间的流量,因为它旨在配置和控制“迷你路由器”。
因为我希望它是一个完全透明的桥梁,所以我从 eth0 和 eth1 中删除了地址:
root% ip address flush dev eth0
root% ip address flush dev eth1
root% ip address add 0.0.0.0 dev eth0
root% ip address add 0.0.0.0 dev eth1
root% ip link set dev eth0 up
root% ip link set dev eth1 up
root% ip link set dev eth0 promisc on
root% ip link set dev eth1 promisc on
root% ip link set dev br0 promisc on # Not sure if needed
不幸的是,我无法将流量转移到处理控制消息的服务/从处理控制消息的服务转移。
注意:实际上我可以为 br0 分配一个不可路由的地址(例如 169.254.1.2),并且如果 Server1 位于本地 LAN 段上(例如,在同一台交换机上),则可以使用下面描述的方法(尝试版本 1) 可以工作;但是,TCP/IP 数据包的源地址或目标地址为 169.254.1.2,无法路由,也无法跨越路由器或 LAN 边界,但 Server1 和“微型路由器”似乎并不关心。如上所述,我无法在 br0 上获取 DHCP(也可以),因为可能有一千多个“微型路由器”无法获取 DHCP 地址。
问题:
我该如何做呢?以下是我尝试过的方法。
尝试:
我寻找了很多解决方案,但都没有什么收获。例如,“iptables——目标将数据包路由到特定接口?”,建议标记数据包并使用不同的路由表可能会有效;但是,这些示例不是通过桥接的。我花了相当多的时间筛选Netfilter 文档直观上看我应该能够网络过滤在 br0 和 eth1 之间,但是我还是不明白该怎么做。LAN 到 LAN IPsec或者直接 VPN 解决方案需要在端点之间建立持久连接,而我们不会拥有这种连接。计算机只需要定期打电话回家或接收推送信息,但不需要持久的安全连接。由于计算机/SCADA 系统还需要与其他系统通信,因此迷你路由器不应干扰计算机和 LAN/路由器之间的任何现有流量。
尝试版本 1
首先我清理了规则:
root% ip rule flush
root% ip rule add lookup default priority 32767
root% ip rule add lookup main priority 32766
将 Server1 和 Computer 之间的以太网帧“DROP”到网络层。
root% ebtables -t broute -A BROUTING -p IPv4 \
--ip-source 5.6.7.1 --ip-destination 10.0.0.1 \
-j redirect --redirect-target DROP
root% ebtables -t broute -A BROUTING -p IPv4 \
--ip-source 10.0.0.1 --ip-destination 5.6.7.1 \
-j redirect --redirect-target DROP
将 Server1<-->Computer 流量重定向到 br0 地址
root% iptables -t nat -A PREROUTING -p tcp \
-s 5.6.7.1 -d 10.0.0.1 \
-j DNAT --to-destination 10.253.252.2
root% iptables -t nat -A POSTROUTING -p tcp \
-d 10.253.252.2 \
-j SNAT --to-source 10.0.0.1
root% iptables -t nat -A POSTROUTING -j MASQUERADE
通过 br0 添加到 Server1 的路由
root% ip route add 5.6.7.2 via 10.253.252.2 dev br0
祈祷一切顺利,但还是不行。尝试了很多不同的排列组合。
尝试版本 2
最近,我尝试了一个更接近上面提到的版本,使用 -j MARK 进行数据包路由,但没有成功:
root% ip rule add fwmark 2 priority 1000 table 3
root% ip route add default via 10.0.0.1 table 3
root% ip route flush cache
root% ip route flush table 3
root% iptables -t mangle -A OUTPUT -p tcp -s 5.6.7.1 -j MARK --set-mark 2
root% iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
root% ip route add 0.0.0.0/1 via 10.253.252.2 dev br0 table 3