iptables 및 다중 nat 리디렉션

iptables 및 다중 nat 리디렉션

내 컴퓨터에는 약 20개의 VPS(로컬 IP에서 실행)가 있고 이 VPS에서 iptables를 사용하여 다음과 같은 특정 포트를 리디렉션합니다.

iptables -t nat -A PREROUTING -p tcp -d %hostIP% --dport %real_port% -i eth0 -j DNAT --to-destination %vps_local_ip%":%vps_destination_port%

새로 고침(새 vps 생성 또는 삭제)하려면 2000개의 iptables 명령을 실행해야 합니다. 먼저 모든 규칙을 삭제한 다음 다시 삽입해야 합니다. 때로는 iptables가 빠르게 처리할 수 없고 간격을 추가하는 것이 중요하지 않기 때문에 일부 명령을 건너뛰는 경우도 있습니다. 옵션을 선택하세요. 왜냐하면 이 명령을 빨리 완료해야 하기 때문입니다.

이 문제에 대한 더 나은 해결책이 있습니까?

답변1

VPS가 변경되면 모든 규칙을 재설정할 이유가 없습니다. VPS당 2000개의 명령을 의미하지 않는 한, 이 경우에는 뭔가 잘못하고 있다고 가정하겠습니다.

일반적으로 저는 각 VPS에 두 개의 체인, 즉 하나는 활성이고 다른 하나는 비활성인 것을 권장합니다. 두 명령 사이에 실제로 기다려야 하는 경우 iptables비활성 체인을 구성할 때 그렇게 하십시오. 이 작업이 완료되면 메인 체인의 참조를 활성 체인에서 비활성 체인(아마도 PREROUTING)으로 변경할 수 있습니다.

iptables어떤 VPS가 대상인지 확인하기 위해 많은 명령을 사용하는 경우 이를 사용하여 ipset단일 명령으로 이를 수행할 수 있습니다.

모든 활성 체인과 모든 비활성 체인에 대해 두 개의 체인을 생성합니다. 이를 통해 경합 조건 없이 변경이 이루어질 수 있습니다.

iptables -t nat -I PREROUTING 1 -j chaingroup_a

iptables -t nat -A chaingroup_a -j vps_1a
iptables -t nat -A chaingroup_a -j vps_2a
iptables -t nat -A chaingroup_a -j vps_3a
iptables -t nat -A chaingroup_a -j ACCEPT # stop applying rules

iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 42 -j DNAT --to-destination 10.1.2.3:4242

구성을 변경하려면 비활성 체인을 재설정하고 구성하십시오.

iptables -t nat -F chaingroup_b
iptables -t nat -F vps_1b
iptables -t nat -F vps_2b
iptables -t nat -F vps_3b

iptables -t nat -A chaingroup_b -j vps_1b
iptables -t nat -A chaingroup_b -j vps_2b
iptables -t nat -A chaingroup_b -j vps_3b
iptables -t nat -A chaingroup_b -j ACCEPT # stop applying rules

iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 4321 -j DNAT --to-destination 10.1.2.3:12345

준비가 완료되면 비활성 체인 그룹을 활성 체인 그룹으로 설정합니다.

iptables -t nat -I PREROUTING 1 -j chaingroup_b

-j ACCEPT종료 로 인해 chaingroup_b여전히 존재하는 콘텐츠 chaingroup_a는 무시됩니다. 하지만 PREROUTING변경할 때마다 성장을 방지하려면 어쨌든 제거해야 합니다 .

iptables -t nat -D PREROUTING 2

답변2

실제로 iptables는 이 작업을 충분히 빠르게 수행할 수 있으며 거의 ​​1900개의 규칙을 테스트했습니다. 필요한 것은 목록 파일에서 ip:ports를 추적한 다음 아래 표시된 bash 스크립트와 같은 스크립트를 작성하고 해당 파일에서 ip:port를 다시 로드하는 것입니다.

파일의 각 줄은 realport:vps-ip:port와 같다고 가정합니다.

#/bin/bash
HOST=100.200.100.200 # your public address
LIST=/path/to/file

iptables -t nat -F
cat "$LIST" | while read line
do
realport=`echo $line|cut -f1 -d:`
vpsip=`echo $line|cut -f2 -d:`
port=`echo $line|cut -f3 -d:`
iptables -t nat -A PREROUTING -p tcp -d $HOST --dport $realport -i eth0 -j DNAT --to-destination $vpsip:$port
done

iptables save

이렇게 하면 목록만 처리하면 됩니다. realport:vps-ip:port 대신 쉼표로 구분된 등의 다른 형식을 사용할 수도 있습니다. 그런 다음 -d:를 -d 또는 다른 것으로 변경하십시오.

관련 정보