
客觀的
我想做這樣的事情:
「迷你路由器」可協助控制和保護遺留系統,該系統由於複雜的原因而無法更新,並且駐留在「野外」的某個地方。我們希望以廉價、低功耗(例如,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 發送到電腦的流量,以便我們可以對它們之間的流量進行SSL 加密/解密和/或「消耗」Server2 和電腦之間的流量,因為它的目的是配置和控制“迷你路由器” ”。
因為我希望它是一個完全透明的網橋,所以我刪除了 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 封包的 src 或 dst 為 169.254.1.2,它們不可路由,不能跨越路由器或 LAN 邊界,但 Server1 和「迷你路由器」似乎並不關心。如上所述,我無法只在 br0 上取得 DHCP(這也可以),因為可能有一千多個「迷你路由器」無法取得 DHCP 位址。
問題:
我怎樣才能做到這一點?以下是我嘗試過的事情。
嘗試:
我尋找了許多解決方案,但運氣不佳。例如,“iptables - 將資料包路由到特定介面的目標?”,表示標記資料包並使用不同的路由表可能有效;然而,這些例子並不是在橋上。我花了相當多的時間來篩選網路過濾器文檔直覺上我應該可以把網路過濾器NAT在 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 和電腦之間的乙太網路訊框「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<-->電腦流量重新導向到 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