
목적
나는 다음과 같은 일을하려고합니다 :
"미니 라우터"는 복잡한 이유로 업데이트할 수 없고 "야생" 어딘가에 상주하는 레거시 시스템을 제어하고 보호하는 데 도움이 됩니다. 우리는 저렴하고 저전력(예: 0.5V 및 < 100mA)으로 시스템을 개조할 수 있기를 바라고 있습니다. 수천 개의 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과 "미니 라우터"는 신경 쓰지 않는 것 같습니다. 위와 같이, 잠재적으로 수천 개가 넘는 "미니 라우터"가 DHCP 주소를 얻을 수 없기 때문에 br0에서 DHCP를 얻을 수는 없습니다(이 역시 작동함).
질문:
어떻게 하면 이런 일을 할 수 있을까요? 아래는 내가 시도한 것입니다.
시도:
나는 운이 좋지 않은 여러 가지 해결책을 찾았습니다. 예를 들어,"iptables - 패킷을 특정 인터페이스로 라우팅할 대상입니까?", 패킷을 표시하고 다른 라우팅 테이블을 사용하는 것이 작동할 수 있음을 제안합니다. 그러나 그 예는 다리 위에 있지 않습니다. 꽤 많은 시간을 들여서 정리했습니다넷필터 문서그리고 직관적으로 내가 넣을 수 있어야 할 것 같습니다넷필터 NATbr0과 eth1 사이에 있지만 어떻게 해야 할지 모르겠습니다.LAN-to-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