利用Debian 的 ifupdown來做到根據不同的Gateway設定不同的網路組態
買了新的notebook就開始想弄一些有的沒有的
所以了這篇心得
================終極目標=====================
當我接上網路線的時候...
電腦會自動幫我檢查我的網路線接到那
然後把IP設定好...
=============================================
在debian下有個很好用的ifupdown的機制
就是你把某個interface的相關ip設定寫在
/etc/network/interfaces
ex:
iface eth0 inet dhcp
這樣當你輸入
ifup eth0
他就會把你把eth0用dhcp來連上網路
當然他也可以使用static IP
ex:
iface eth0 inet static
address 192.168.0.100
netmask 0xffffff00
gateway 192.168.0.1
而當你想要把這個interface關掉時
輸入
ifdown eth0
就可以了
====================稍微進階分隔線=====================
如果你以為ifupdown只有上面那些東西
那你就錯了
他可以幫你在把某個interface啟用之前先執行一些指令
iface eth0 inet dhcp
pre-up /usr/local/bin/print_cch_is_bigbig
如此ifup便會在把eth0啟動前去執行/usr/local/bin/print_cch_is_bigbig
另外也可以使用up,down
iface eth0 inet static
...
up route add -host x.x.x.x y.y.y.y
down route del x.x.x.x
這個應該就很好懂了就是在ifup的時候跑route add, ifdown時跑route del
===================我很無聊分隔線=====================
我為了方便花了一些時間做這個...(嗚...我的論文阿...>
我為了方便花了一些時間做這個...(嗚...我的論文阿...>
首先我想要讓我的系統在eth0的網路線有插著的時候才可以啟動
所以我在eth0的設定時加了一行
iface eth0 inet static
pre-up [ `ifconfig eth0 up; ifconfig eth0 |grep RUNNING` != "" ]
上面這個意思就是先把eth0啟動(此時可能沒有IP)
然後去檢查ifconfig eth0產生的message裡面有沒有RUNNING這個字
有代表網路線有接起來, 這時ifup才會把eth0啟動
只有這樣嗎?!!!!!
那你太小看一個深夜孤單男子的潛力了
請想像在半夜的時候, 有個男人很孤獨的坐在桌前
整個世界裡陪伴他的只有他面前的notebook
他將雙手舉起...開始讓notebook響起了如同機關槍似的聲響
背景請配上The Phantom of the Opera出場的音樂 XD
..............
好吧 我真的很無聊
我為了能夠讓我的nb自動判斷我在家裡還是lab
所以我繼續利用了interfaces這個設定檔裡面的mapping的功能
首先我在裡面加了下面這兩行
mapping eth0
script /usr/local/bin/get-lan-gw-mac
就是說eth0他會利用/usr/local/bin/get-lan-gw-mac的stdout來做mapping
而/usr/local/bin/get-lan-gw-mac這個程式會幫我獲得
我所接上的Gateway的MAC address
然後印在stdout
例如我在實驗室的gateway為192.168.0.1 MAC是00:02:B3:33:DD:BA
所以設定如下
mapping eth0
script /usr/local/bin/get-lan-gw-mac
iface 00:02:B3:33:DD:BA inet static
address 192.168.0.22
netmask 0xffffff00
gateway 192.168.0.1
這樣eth0如果接到我實驗室的gateway上..就會把IP設成192.168.0.22
我另外也寫了一個家裡adsl的
iface 00:30:88:00:58:8b inet static
address 61.64.162.XXX
netmask 0xffffff00
gateway 61.64.162.254
這樣他就可以利用Gateway的MAC address來決定用那個設定
但是 問題來了
要怎麼拿到Gateway的MAC address
大致上我是利用arping這隻程式來做arp level的ping的動作
所以跑起來有點慢
不過因為interface不多我還可以接受
script在下面 我也懶得解釋
有興趣的人可以拿去看看
希望有人能幫我改進啦...XD
====================================================================
#!/usr/bin/perl
$IFACE = $ARGV[0];
if (`ifconfig $IFACE up;ifconfig $IFACE |grep RUNNING` eq "") {exit 1;}
$MAC = "";
my %gateways;
my $use = 0;
my $address = "";
my $gateway = "";
open ETCIFACES,"
while (){
if (/iface/){
if (/iface ..:..:..:..:..:../) {
$use = 1;
$address = "";
$gateway = "";
next;
}else { $use = 0;}
}
next if ($use == 0);
if (/address\b*([^\b]*)/){
$address = $1;
}
if (/gateway\b*([^\b]*)/){
$gateway = $1;
}
if ($gateway != ""){
chomp $gateway;
chomp $address;
$gateways{$gateway} = $address;
}
}
close ETCIFACES;
for $i (keys %gateways){
$MAC = `arping -c 1 -S $gateways{$i} -i $IFACE $i|grep from`;
$MAC =~ s/60 bytes from ([^ ]*) .*/$1/;
last if ($MAC ne "");
}
print $MAC;
exit 0;
==================================================================
呼呼...我真的是太無聊了....
因為...
世界上有一種東西叫做dhcp................................
No comments:
Post a Comment