여기에는 고급 프로그래머가 있지만 모든 프로그래밍 언어에 비해 작업을 어렵게 만드는 Linux 네트워크 제한이 싫습니다.
사실 난 해야 해정책 기반 라우팅특정 LAN IP 주소가 특정 발신 인터페이스(예: eth5)를 선택하도록 허용합니다. 내 경우에는 ipset조차도 충분히 강력하지 않았습니다. 첫 번째 옥텟이 "10"이고 마지막 옥텟이 "9"로 끝나는 모든 LAN IP를 허용하고 싶습니다. 이것은 10.*.*.??9
또는 자바스크립트 일 것입니다.if(ip.match("\10\..*\.(\d+9|9)\g")) ...USE eth5
이것을 달성하기 위한 몇 가지 트릭을 아는 사람이 있습니까? CIDR을 고수해야 한다면 아마도 수천 개의 IP CIDR이 있을 것입니다. 이는 말도 안되는 일입니다.
감사해요
답변1
OP도 구현 한계에 도달했기 때문에 답변을 알고리즘의 작은 부분으로 제한하지 않겠습니다. 대답은 그들과 협력해야합니다.
라우팅 스택은 Linux 네트워크 스택의 일부이며 처리로 제한됩니다.CIDR 넷마스크 33개/32(/255.255.255.255)에서 /0(/0.0.0.0)까지와 동일합니다.
특정 방화벽 시설과 같은 네트워크 스택의 다른 부분에는 이러한 제한이 적용되지 않습니다. 255.0.0.255와 같은 넷마스크를 사용하면 IPv4 주소의 중간 숫자 2개를 무시할 수 있습니다. 불행하게도 네트워크 마스크는 2의 거듭제곱 또는 나눗셈의 나머지 부분을 2의 거듭제곱으로 쉽게 처리할 수 있지만 모듈로 10(10으로 나누기의 나머지 부분)에는 도움이 되지 않으며 패킷 처리에서는 10으로 나누기를 사용할 수 없습니다. 따라서 9~249 사이에는 아직 확인할 값이 25개 남아 있으며, 이 값들의 목록이 필요하다. 아, 다시 말해봐IP 세트CIDR 넷마스크에 의해 제한됨, 그리고iptables' 사용IP 세트제한되지 않은 넷마스크는 허용되지 않습니다.IP 세트전혀 사용할 수 없습니다.
~25를 사용하세요.iptables규칙(그렇게 많지는 않음)을 사용하거나 더 유연한 규칙을 사용하세요.nftables와놓다.
그리고iptables
넷마스크 255.0.0.0 을 사용하여 IPv4 주소의 첫 번째 부분만 확인 10.
하고 마지막 부분에서 25가지 가능성을 확인합니다. 해결하려는 특정 문제에 따라 고려해야 할 수신 인터페이스에 대한 추가 제한 사항을 추가할 수 있습니다.
iptables -t mangle -N specialrouting
iptables -t mangle -A PREROUTING -s 10.0.0.0/255.0.0.0 -j specialrouting
specialrouting
예를 들어, 25개의 가능성으로 사용자 체인을 채우려면 다음을 사용하십시오.세게 때리다스크립트:
#!/bin/bash
iptables -t mangle -F specialrouting # for idempotence
for i in {9..255..10}; do
iptables -t mangle -A specialrouting -s 10.0.0.$i/255.0.0.255 -j MARK --set-mark 0xcafe
done
결국 2^16(무시된 두 개의 중간 바이트에 대해) x 25 = 1638400 가능성이 표시됩니다.
모듈로가 16(2의 거듭제곱)인 경우 모듈로 10의 25개 값 대신 9, 25, 41, 57 ... 249의 16개 값이 필터링되므로 위의 모든 항목을 단일 규칙으로 대체할 수 있습니다. 넷마스크는 2의 거듭제곱인 모든 모듈러스를 처리할 수 있습니다. 이 넷마스크 255.0.0.15(0xff00000f)는 다음 단일 규칙으로 작동합니다.
iptables -t mangle -A PREROUTING -s 10.0.0.9/255.0.0.15 -j MARK -set-mark 0xcafe
또는 사용nftables
위의 스크립트와 유사한 미리 계산된 세트의 요소 목록을 사용하면 모듈로 10 사례에 대한 규칙 세트가 로드됩니다 nft -f specialrouting.nft
.
specialrouting.nft
:
table ip specialrouting # for idempotence
delete table ip specialrouting # for idempotence
table ip specialrouting {
set modulo10 {
type ipv4_addr
flags constant
elements = { 10.0.0.9, 10.0.0.19,
10.0.0.29, 10.0.0.39,
10.0.0.49, 10.0.0.59,
10.0.0.69, 10.0.0.79,
10.0.0.89, 10.0.0.99,
10.0.0.109, 10.0.0.119,
10.0.0.129, 10.0.0.139,
10.0.0.149, 10.0.0.159,
10.0.0.169, 10.0.0.179,
10.0.0.189, 10.0.0.199,
10.0.0.209, 10.0.0.219,
10.0.0.229, 10.0.0.239,
10.0.0.249 }
}
chain prerouting {
type filter hook prerouting priority -150; policy accept;
ip saddr & 255.0.0.255 == @modulo10 meta mark set 0xcafe
}
}
모듈로 16 싱글용nftables상용구가 없는 규칙은 다음과 유사합니다.iptables위의 규칙:
ip saddr & 255.0.0.15 == 10.0.0.9 meta mark set 0xcafe
라우팅에 마커 사용
패킷에 설정된 플래그(Linux 네트워크 스택에서 패킷의 내부 수명 동안에만)는 라우팅 스택에 대한 메시지로 사용될 수 있으며 라우팅 규칙과 일치하여 대체 라우팅 테이블을 사용할 수 있습니다.
ip rule add fwmark 0xcafe lookup 100
다음은 표 100의 경로이며, 여기 dev eth5
에는 다음 경로 외에 가장 중요한 경로도 포함되어 있습니다.기본라우팅 테이블:
ip route add ... dev eth5 table 100
...
반환 트래픽은 다음에서 발생합니다.이더리움 5아마도 동일한 테이블을 사용해야 할 것입니다.
ip rule add iif eth5 lookup 100
보충 설명
적어도 테스트 시에는 불완전한 라우팅으로 인한 트래픽 저하를 방지하고,SRPF, 즉.rp_filter
, 활성화하면 안 됩니다(배포에서 기본적으로 활성화하는 경우).
for i in $(sysctl -N -ar 'net\.ipv4\.conf\..*\.rp_filter'); do sysctl -w $i=0; done
스트림의 conntrack 항목에 마커를 저장하는 등 마커를 사용할 때 다른 가능성이 있지만 설정에 대한 정확한 설명이 없으면 여기에 무엇이 필요한지 알 수 없습니다. 이 블로그에는 몇 가지 예가 있습니다.리눅스 이상! 넷필터 코맥.
재라우팅 태그가 관련되어 있음을 참고하세요.지역적으로 시작된(또는 이에 상응하는지역 종료) 포워딩/라우팅 트래픽이 아닌 트래픽은 코너 케이스(TCP보다 UDP의 경우 더 그렇습니다)로 인해 문제가 발생하므로 해당 케이스를 해결하려고 시도조차 하지 않았습니다.