출력 주소 포트를 기반으로 다른 vLAN으로 패킷을 보냅니다.

출력 주소 포트를 기반으로 다른 vLAN으로 패킷을 보냅니다.

두 종류의 UDP 패킷을 보내는 보드가 있습니다. 동일한 보드에서 여러 vLAN을 구성했습니다.

sudo modprobe 8021q 
sudo ip link add link enP2p1s0 name enP2p1s0.5 type vlan id 5 
sudo ip link set enP2p1s0.5 up
sudo ip link add link enP2p1s0 name enP2p1s0.8 type vlan id 8 
sudo ip link set enP2p1s0.8 up

IP로 패킷을 보내면 다음과 같이 시스템을 설정하고 싶습니다.포트 1port1 값이 X이고 IP에서 패킷을 보내는 경우 패킷은 ID 5의 VLAN에서 전송됩니다.포트 2여기서 IP는 동일한 IP이지만 port2 값은 Y입니다. 패킷은 ID 8의 VLAN에서 전송됩니다.

가능합니까?

답변1

예, iptables를 사용하여 이 작업을 수행할 수 있습니다. 라우팅이 대상 포트의 IP를 기반으로 인터페이스를 결정하도록 패킷의 소스 주소(SNAT)를 변경할 수 있습니다. 또는 대상 포트를 기반으로 태그를 설정하고, 여러 라우팅 테이블을 갖고, IP ​​규칙을 설정하여 특정 라우팅 테이블을 할당할 수 있습니다.

답변2

내 생각엔 이것이 효과가 있을 것 같다:

sudo ip link add link enP2p1s0 name enP2p1s0.5 type vlan id 5  
sudo ip link set enP2p1s0.5 up  
sudo ip link add link enP2p1s0 name enP2p1s0.8 type vlan id 8  
sudo ip link set enP2p1s0.8 up  
sudo iptables-legacy -A OUTPUT -p udp --dport 15004 -j MARK --set-mark 1  
sudo iptables-legacy -A OUTPUT -p udp --dport 14002 -j MARK --set-mark 2  
sudo ip rule add fwmark 1 table 11  
sudo ip rule add fwmark 2 table 22  
sudo ip route add 192.168.0.0/24 dev enP2p1s0.5 table 11  
sudo ip route add 192.168.0.0/24 dev enP2p1s0.8 table 22

@EOhm 한번 보실래요?

답변3

귀하의 모든 의견에 다시 한번 감사드립니다. 게시된(그리고 사라진 후?) 또 다른 답변은 다음과 같습니다.

네트워크(라우팅) 계층을 완전히 무시하고 tc와 해당 VLAN 작업을 사용하는 매우 독특한 방법도 있습니다.

일반적인 준비: 추가 송신 필터를 허용하기 위해 여기에서만 사용되는 가장 간단한 클래스 qdisc(prio)를 추가하고 수신 qdisc를 추가합니다.

sudo tc qdisc add dev enP2p1s0 root handle 1: prio
sudo tc qdisc add dev enP2p1s0 ingress

두 가지 방법으로 필터링 규칙을 추가합니다. 출구를 표시하고 입구를 표시 해제합니다. U8은 레이어 9 네트워크 eq 17의 UDP를 나타내고, u16은 레이어 2 전송의 대상 포트를 나타냅니다.

sudo tc filter add dev enP2p1s0 parent 1: protocol ip basic match 'cmp(u8 at 9 layer network eq 17) and cmp(u16 at 2 layer transport eq 15004)' action vlan push id 151
sudo tc filter add dev enP2p1s0 parent 1: protocol ip basic match 'cmp(u8 at 9 layer network eq 17) and cmp(u16 at 2 layer transport eq 14002)' action vlan push id 150
sudo tc filter add dev enP2p1s0 ingress basic match 'meta(vlan eq 150) or meta(vlan eq 151)' action vlan pop

네트워크 스택의 나머지 부분은 VLAN이 매우 일찍(수신의 경우) 발생하고 매우 늦게(송신의 경우) 발생하므로 VLAN을 전혀 인식하지 못합니다.

이 접근 방식은 내 목적에 비해 더 간단하고 더 강력한 것으로 나타났습니다. prio, vlan action, cmp 및 ingress 기능(sch_prio, sch_ingress, cls_basic, act_vlan, em_cmp)을 지원하려면 Linux 커널을 다시 빌드해야 하지만 지금까지는 솔루션이 유망해 보입니다.

참고: NIC는 VLAN 태그를 제거하는 경향이 있습니다. 이것은 테스트하기에 정말 실망스러운 일이며 완전히 다른 게시물/포럼의 주제입니다.

관련 정보