예전에 작업할때 저 두 단위별로 상호 변경이 되지 않아 고민을 한 적이 있었다.
닫음
이를테면 이런것인듯 싶다. iptables에 입력되는 값은 대략 이렇다.
$IPTABLES -A INPUT -p tcp -s 0.0.0.0/0 -d $IPADDR --dport 20 -j ACCEPT $IPTABLES -A INPUT -p tcp -s 0.0.0.0/0 -d $IPADDR --dport 21 -j ACCEPT $IPTABLES -A INPUT -p tcp -s 0.0.0.0/0 -d $IPADDR --dport 22 -j ACCEPT ifconfig에 입력되는 값은 대략 이렇다.
ifconfig eth0 192.168.0.1 netmask 255.255.255.0 (맞나?) 그니까 이런 것이다. 로컬 머신에 대한 정보를 하나만 입력해서, 로컬 네트워크에 대한 파이어월 설정도 하고 싶고, ifconfig로 네트워크 설정도 하고 싶고, 대략 변경점도 하나 입력점도 하나라면 얼마나 편할것인가. (그니까 255.255.255.0랑 /24 중 하나만 쓰고 싶다는 이야기다.)
linux가 unix가 쓰기 시작한게 몇년인데 저거 convert 하는 간단한 쉘 스크립트가 없다는 것인가! 하고 울부짖으며, 시간에 쫓겨서 네트워크를 방황하다가 결국 간단한 C 프로그램으로 해결했던 아픈 기억이 있었더랬다.
그로부터 5년후.
과연 넷의 세계는 넓고도 넓도다. 방황하던 소년은 마침내 목적하던 것을 찾아냈으니..
(하지만 이미 그걸 써먹을 곳은 그만둔지 오래.. 쿨럭;) 언젠가는 또 써먹을 날이 올까 하고 여기에 기록하노라. 쾅쾅.
원본출처 :
http://shorewall.de/pub/shorewall/errata/1.4.6/functions 본인은 cut과 sed, awk 의 간단한 문법만을 사용하여 괘발새발
(맞나?) 필요한 것 만을 만들어 쓰는 스크립터로써, 솔직히 저 스크립트를 보고 살짝 감동을 먹었더랬다.
원했던 핵심은 이거다.
encodeaddr() { addr=$1 local x local y=$(($addr & 255)) for x in 1 2 3 ; do addr=$(($addr >> 8)) y=$(($addr & 255)).$y done echo $y } 요 함수와,
ip_netmask() { local vlsm=${1#*/} [ $vlsm -eq 0 ] && echo 0 || echo $(( -1 $LEFTSHIFT $(( 32 - $vlsm )) )) } 요 함수다.
사실, 저기 내용에 보면 정말 써먹고 싶은 생각이 무럭무럭 우러나오는 황금같은 함수들이 나를 유혹하지만, 저 정도만 가지고 간단하게 스크립트를 만들어보자.
위의 두 함수를 포함해서,
#!/bin/sh LEFTSHIFT='<<' encode_addr() { ... } ip_netmask() { ... } PRIMARY_IP=192.168.0.1 PRIMARY_NET=192.168.0.0/24 cmd_string="ifconfig eth0 $PRIMARY_IP netmask $(encodeaddr $(ip_netmask `echo ${PRIMARY_NET} | /bin/cut -d'/' -f2`) )" echo $cmd_string 자, 결과는?
[root@test01 work]# ./a.sh ifconfig eth0 192.168.0.1 netmask 255.255.255.0 [root@test01 work]# 짝짝짝, 이런거다. 뭐, 사실 저 echo에 cut에 저렇게 안하고,
cmd_string="ifconfig eth0 $PRIMARY_IP netmask $(encodeaddr $(ip_netmask ${PRIMARY_NET} ))" 이렇게 해도,
[root@test01 work]# ./a.sh ifconfig eth0 192.168.0.1 netmask 255.255.255.0 [root@test01 work]# 짝짝짝, 뭐 이정도지.
(젠장.. 걍 이렇게 넣어도 댔었다는거지. 난 무슨 삽질을 한거지;;) 간단한
(아니, 간단하지 않은;) 함수를 하나 더 소개하자면, 이런게 있다.
ip_range() { local first last l x y z vlsm
case $1 in [0-9]*.*.*.*-*.*.*.*) ;; *) echo $1 return ;; esac
first=`decodeaddr ${1%-*}` last=`decodeaddr ${1#*-}`
if [ $first -gt $last ]; then fatal_error "Invalid IP address range: $1" fi
l=$(( $last + 1 ))
while [ $first -le $last ]; do vlsm= x=31 y=2 z=1
while [ $(( $first % $y )) -eq 0 -a $(( $first + $y )) -le $l ]; do vlsm=/$x x=$(( $x - 1 )) z=$y y=$(( $y * 2 )) done
echo `encodeaddr $first`$vlsm first=$(($first + $z)) done }
요렇게 생긴 함수인데.
PRIMARY_RANGE=192.168.0.0-192.168.0.128 echo "$(ip_range ${PRIMARY_RANGE})" 요렇게 하면,
[root@test01 work]# ./a.sh 192.168.0.0/25 192.168.0.128 [root@test01 work]# 요런식으로 나온다. ㅠ_ㅠ;;
아, 저것을 보고도 감동의 눈물을 흘리지 않는 자, 좀더 삽질을 해볼지어다;;
아래 사이트는 위의 스크립트로 만든 firewall이라던가 그런 물건인것 같다.
참고해두면 좋을듯.
참고 :
http://shorewall.de/pub/shorewall/3.2/shorewall-3.2.0/errata/Shorewall/compiler
닫음