변수를 기반으로 여러 인터페이스에 적용되는 iptables 규칙을 작성하려고 합니다. 어떤 규칙이 더 효율적이고 더 빠릅니까? 최소한의 코드로 이 규칙을 작성하는 더 좋은 방법이 있습니까?
#Variable
Ext_INTF="eth0 usb0 tun0 tun1"
1)
for i in $Ext_INTF;
do
iptables -A FORWARD -i $i -j DROP
done
2)
iptables -A FORWARD -i $Ext_INTF -j DROP
답변1
방법 2는 작동하지 않습니다. 잘못된 iptables
호출이 생성됩니다. 무엇을 할 것이라고 생각하든 iptables 규칙만 추가할 뿐이며 단일 규칙에서 인터페이스 세트를 일치시킬 수는 없습니다. 방법 1은 일반적인 방법이며 거의 유일한 방법입니다.
iptables 규칙 설정의 효율성은 문제가 되지 않습니다. 분명히 최적이 아닌 일을 하려면 정말 열심히 노력해야 합니다. 여기서 중요한 점은 규칙을 올바르게 만들고, 규칙 자체의 효율성을 높이고, 쉽게 유지 관리할 수 있도록 스크립트를 읽을 수 있게 유지하는 것입니다.
쓰기 $Ext_INTF
(큰따옴표 밖의 변수 대체)는 변수 값을 공백으로 구분된 부분으로 분할한 다음 각 부분을 파일 이름과 일치하는 와일드카드 패턴으로 확장합니다. 여기의 변수에는 와일드카드 문자( \[*?
)가 포함되어 있지 않습니다. 따라서 for i in $Ext_INTF; …
변수 값의 단어를 반복하십시오.일반적으로 큰따옴표 안에 변수 대체만 사용해야 합니다., 이후 $Ext_INTF
큰따옴표 안에만 "값"을 나타내지만 Ext_INTF
여기서는 분할하려고 하며 해당 부분에는 쉘 와일드카드가 포함되어 있지 않습니다.
Ext_INTF="eth0 usb0 tun0 tun1"
for i in $Ext_INTF; do
iptables -A FORWARD -i "$i" -j DROP
done
bash와 ksh에서는 일반 sh가 아닌 문자열 변수 대신 배열을 사용할 수 있습니다. (zsh에서는 배열을 사용하거나 를 사용하여 명시적으로 분할을 요청해야 합니다 $=Ext_INTF
.) 문자를 몇 개 더 입력해야 하지만 이렇게 하면 의도가 더 명확해지고 필요한 경우 요소에 공백과 와일드카드를 포함할 수 있습니다.
Ext_INTF=(eth0 usb0 tun0 tun1)
for i in "${Ext_INTF[@]}"; do
iptables -A FORWARD -i "$i" -j DROP
done