패킷 중 일부를 로컬 애플리케이션으로 리디렉션하여 패킷을 수정하는 L3 스위치를 만들고 있습니다. 내 목표는 이전과 동일한 MAC에 추가로 보내는 것입니다.
간략한 "이유": 모든 이더넷에 연결되고 휴대 가능하며 프록시 역할을 하는 제로 구성 장치입니다.
스위치는 eth0과 eth1 사이의 이더넷 브리지(br-lan)로 구성됩니다. 기본적으로 br-lan 클라이언트의 게이트웨이는 eth0에 있는 것으로 가정됩니다.
질문: 패킷이 eth1에서 와서 eth0으로 이동하고 로컬 애플리케이션으로 리디렉션된다고 가정해 보겠습니다. 애플리케이션이 출력된 후 원래 패킷의 대상 IP가 변경되었습니다. L3는 패킷을 새로운 대상으로 라우팅하려고 시도하지만 기본 게이트웨이가 없습니다(그리고 스위치이기 때문에 없어야 합니다!). 기본 게이트웨이의 MAC 주소를 알고 있다고 가정할 때 어떻게 패킷이 eth0을 통해 특정 MAC 주소로 전송되도록 할 수 있습니까?
엄밀히 말하면 저는 온라인에서 "불법"적인 일을 하려는 것이 아닙니다. eth0에서 패킷을 내보내고 싶고 "잃어버린" 것은 대상 MAC뿐이지만 원본 패킷에서 검색할 수 있습니다. 대상 IP가 로컬이 아니라고 확신하므로 어쨌든 MAC 주소를 사용하여 기본 게이트웨이로 전송됩니다. 그래서 실행의 문제입니다.
다음을 수행하여 bridge -t NAT OUTPUT에서 대상 MAC을 수정하려고 합니다.
ebtables -t nat -A 출력 -p ipv4 --ip-proto tcp --ip-src 192.168.1.251 -j dnat --to-dst 04:61:e7:d2:e2:09
그러나 이것은 도움이 되지 않습니다. (이 이론을 테스트하기 위해 04:61:e7:d2:e2:09가 기본 게이트웨이 MAC이고 192.168.1.251이 클라이언트 중 하나라고 가정)
실제 구현은 OpenWRT에 있으므로 사용 가능한 패키지가 제한될 수 있습니다.
이 문제가 발생한 방법은 다음과 같습니다.
로컬 애플리케이션에 대한 추가 정보: 여기에 0.0.0.0:port에 바인딩된 ss-redir이 있습니다.https://github.com/shadowsocks/shadowsocks-libev
[기기]에 사용 사례가 추가되었습니다.
예상: 일반 스위치에 3개의 PC 클라이언트가 연결되어 있습니다. [장치]를 가져와 일반 스위치에 연결한 후 PC 클라이언트를 [장치]에 다시 연결하면 PC 클라이언트는 장치를 구성하지 않고도 [결과]를 얻습니다.
[결과]:
1) "외부"(3개의 네트워크 노드 및 기타 모든 노드를 제외한 다른 네트워크 노드)에서 모든 사용자는 자신의 IP/MAC 쌍을 유지해야 관리자가 만족할 수 있습니다. DHCP는 사무실에서 정적으로 구성되므로 IP/MAC 쌍은 변경되지 않을 수 있지만 관리자는 이를 변경할 수 있습니다. 그리고 장치는 수동 재구성 없이 모든 변경 사항을 처리해야 합니다. (관리자가 등록하지 않은 경우) 새 IP/MAC가 네트워크에 나타나서는 안 됩니다.
2) "외부" 관점에서 볼 때, 모든 PC 클라이언트는 그것이 무엇이든(RDP, 이름 확인을 위한 NetBIOS, 파일 공유 또는 로컬 관리자가 결정한 모든 것) 네트워크의 모든 프로토콜에 액세스할 수 있어야 합니다.
3) 특정 대상에 대한 SS ipset 프록시 TCP를 통한 경우를 제외하고는 항상 기본 게이트웨이를 통해 인터넷에 액세스해야 합니다(항상 동일한 게이트웨이를 통해).
이러한 사용 사례에서는 장치가 처음부터 기존 네트워크에 대한 IP/MAC 지식이 없어야 한다고 가정하고(사무실 사용자는 스스로 아무것도 구성하지 않기 때문에) 스위치처럼 작동하는 "프록시 브리지"를 만들려고 합니다. , 패킷을 가로채서 실행 로컬 애플리케이션이 리디렉션되어 eth0(WAN)으로 전송됩니다. 문제는 리디렉션된 패킷을 원하는 방향으로 보내야 한다는 것입니다. MAC-snat/dnat를 사용하여 "동적 자동 재구성 아이디어"를 조사하고 있는데 이 문제에 부딪혔습니다. ebtables에서 기본 게이트웨이 MAC-addr을 지정할 수 있지만 패킷이 생성된 후 eth0으로 이동하지 않습니다. 현지에서 목적지로.
답변1
허락해줘추측하다일부 "오리지널 미션 X". 이는 원래 작업 X와 일치하지 않을 수 있지만 어떤 유형의 정보가 필요한지에 대한 아이디어를 제공할 수 있습니다.
eth0
1) 이 장치는 외부 스위치 뒤에 4개의 LAN 포트가 있고 뒷면에 1개의 WAN 포트가 있는 일반 기성 홈 라우터입니다 eth1
. WAN 포트는 로컬 네트워크 게이트웨이에 연결됩니다. 투명 프록시를 사용해야 하는 모든 호스트는 추가 스위치를 사용하여 LAN 포트에 연결됩니다. LAN에 연결된 다른 호스트나 포트는 없습니다. 다른 양말 끝점은 WAN 측에 있습니다.
이 경우 레벨 2를 잊어버리고 iptables
다음에 설명된 규칙을 사용하십시오.남자 ss-radier, NAT에만 적용 가능합니다 eth0
. 라우터는 프록시된 SOCKS 요청을 전달합니다 eth1
. NAT는 eth0
올바른 IP를 가진 장치로 응답을 다시 보내는 역할을 담당합니다 . ARP는 IP의 MAC이 사용되는지 확인합니다.
2) 위의 변형: LAN 포트에 연결된 일부 호스트는 프록시를 사용해야 하고 일부는 그렇지 않아야 합니다. 이 경우 하드웨어를 자세히 살펴보면 구성할 수 있는 스위치 칩이 있을 수 있습니다 sw-conf
. 두 개의 LAN 포트가 에 연결되고 eth0
나머지 두 개는 에 연결 되도록 재구성하십시오 eth2
. 그런 다음 위와 같이 진행하십시오. 필요에 따라 호스트 컴퓨터를 올바른 LAN 포트에 연결하십시오.
3) 장치는 프록시를 사용해야 하는 호스트와 동일한 내부 LAN 세그먼트에 다른 SOCKS 엔드포인트가 있는 보다 복잡한 네트워크 구성에서 단순 브리지로 사용됩니다. 이 경우 네트워크에 대한 설명이 필요합니다.
잠깐만요, 페이지.
편집하다
사용 사례를 올바르게 읽었다면 주요 문제는 DHCP 서버가 WAN 포트 뒤에 있고 이를 통해 IP의 정적 할당을 올바르게 관리해야 하기 때문에 WAN 포트(eth0)를 LAN 포트(eth1)에 브리지해야 한다는 것입니다. DHCP.
이 경우 브리지를 다음과 같이 구성합니다."브롤트": LAN(eth1)에 도착하는 패킷을 제외하고 모든 것이 브리지됩니다(TCP 및 원하는 대상 IP 범위 내에서). 이러한 패킷은 br-lan
브리지의 내부 포트에서 전송됩니다. 레이어 3 처리에서는 위에서 설명한 대로 이를 처리할 수 있습니다. 특히 연결 추적기는 IP 및 포트별로 이를 추적할 수 있으며 양말 프록시의 응답을 올바른 장치로 다시 보낼 수 있습니다.
MAC NAT가 필요하지 않으며 L5를 통한 MAC 기반 연결 추적도 없습니다.
전체 레시피를 공개할 수 있도록 일부 네트워크 네임스페이스를 사용하여 시도해 보고 싶었지만 안타깝게도 오늘이나 앞으로 며칠 내에 그렇게 할 시간이 없습니다.
답변2
더러운 해결책을 찾았습니다.
X 컨텍스트를 잊어버리고 Y 문제를 더 깊이 파고들면 다음을 찾을 수 있습니다.
아이디어는 패킷을 기록한 다음 이를 로컬 애플리케이션으로 리디렉션하기 전에 구문 분석할 수 있다는 것입니다. eth1에서 eth0까지 기본 게이트웨이에 데이터 패킷이 도착하는 과정은 다음과 같습니다.
(CLIENT1_SRC_IP, CLIENT1_SRC_MAC, DEST_IP_ADDR_TO_PROXY, DF_GW_MAC)
그러나 로컬 애플리케이션을 통과한 후 다음 상태에 갇히게 됩니다.
((!)CLIENT1_SRC_IP, (!)CLIENT1_SRC_MAC, SS_SERVER) 및 DF_GW_MAC가 ARP 확인을 진행하려고 합니다(SS_SERVER 인접 항목과 기본 게이트웨이 자체가 없어서 패킷이 갈 곳이 없기 때문에 실패합니다).
그래서 저는 SS_SERVER가 const IP 주소라는 사실을 활용하기로 결정했습니다. 로그의 DF_GW_MAC를 구문 분석한 다음 SS_SERVER IP에 대한 정적 arp 경로를 추가하는 데 사용할 수 있습니다.
OpenWRT 사용자를 위한 세부 정보:
IP 이웃이 제대로 작동하도록 하려면:
opkg 업데이트
opkg 설치 IP-전체
그런 다음:
IP 이웃 추가 123.123.123.123 dev eth0 lladdr 11:22:33:44:55:66
IP 경로에 기본 dev eth0 추가
그러면 여기서 문제 Y가 해결됩니다. 그만큼 지금은 다른 옵션이 표시되지 않습니다.