Link Aggregate between Cisco & Ubuntu

[cisco]

conf t
int range g1/0/1 -2
channel-group 1 mode active
no sh
int po1
ip add 192.168.1.1 255.255.255.0
no sh

[Ubuntu]

sudo vi /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bonding mode=4 miimon=100
sudo vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
#auto eth0
#iface eth0 inet dhcp
auto bond0
iface bond0 inet static
address 192.168.1.10
gateway 192.168.1.1
netmask 255.255.255.0
slaves eth0 eth1
bond-mode 4
bond-miimon 100

sudo vi /etc/modprobe.d/bonding.conf
alias bond0 bonding

options bonding mode=4

miimon=100

sudo vi /etc/network/interfaces

# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5).

# The loopback network interface

auto lo

iface lo inet loopback
# The primary network interface

#auto eth0

#iface eth0 inet dhcp
auto bond0

iface bond0 inet static

address 192.168.1.10

gateway 192.168.1.1

netmask 255.255.255.0

slaves eth0 eth1

bond-mode 4

bond-miimon 100

#######################

Linux Bonding mode

mode=0 (balance-rr)  Round-robin policy: Transmit packets in sequential order from the first available slave through the last. This mode provides load balancing and fault tolerance.

mode=1 (active-backup)  Active-backup policy: Only one slave in the bond is active. A different slave becomes active if, and only if, the active slave fails. The bond’s MAC address is externally visible on only one port (network adapter) to avoid confusing the switch. This mode provides fault tolerance. The primary option affects the behavior of this mode.

mode=2 (balance-xor)  XOR policy: Transmit based on [(source MAC address XOR’d with destination MAC address) modulo slave count]. This selects the same slave for each destination MAC address. This mode provides load balancing and fault tolerance.

mode=3 (broadcast)  Broadcast policy: transmits everything on all slave interfaces. This mode provides fault tolerance.

mode=4 (802.3ad)  IEEE 802.3ad Dynamic link aggregation. Creates aggregation groups that share the same speed and duplex settings. Utilizes all slaves in the active aggregator according to the 802.3ad specification.

  • Pre-requisites:
  • Ethtool support in the base drivers for retrieving the speed and duplex of each slave.
  • A switch that supports IEEE 802.3ad Dynamic link aggregation. Most switches will require some type of configuration to enable 802.3ad mode.

mode=5 (balance-tlb) Adaptive transmit load balancing: channel bonding that does not require any special switch support. The outgoing traffic is distributed according to the current load (computed relative to the speed) on each slave. Incoming traffic is received by the current slave. If the receiving slave fails, another slave takes over the MAC address of the failed receiving slave.

  • Prerequisite: Ethtool support in the base drivers for retrieving the speed of each slave.

mode=6 (balance-alb) Adaptive load balancing: includes balance-tlb plus receive load balancing (rlb) for IPV4 traffic, and does not require any special switch support. The receive load balancing is achieved by ARP negotiation. The bonding driver intercepts the ARP Replies sent by the local system on their way out and overwrites the source hardware address with the unique hardware address of one of the slaves in the bond such that different peers use different hardware addresses for the server.

How to login with SSH without enter password

How to login with SSH without enter password
[Client]
$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/XXXX/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

$scp .ssh/id_rsa.pub mylogin@192.168.1.1:.ssh/authorized_keys
Password:

#Testing
$ssh mylogin@192.168.1.1

[Linux] เพิ่มความสามารถให้ squid cache video ได้

โดยปกติแล้ว squid ไม่สามารถ cache พวก youtube ได้ซึ่งถ้ามัน cache ได้ก็จะ ประหยัด bandwidth ได้มาก
Download program จาก h**p://cachevideos.com/
ผมลอง test install บน
– Ubuntu 9.04
– Squid 2.7 STABLE3
– Lighttpd
– Videocache 1.9.2

เริ่มจาก Ubuntu
$sudo apt-get install python-urlgrabber
ส่วน module ของ python-iniparse_0.3.1-1_all.deb ต้องไป download จาก h**p://code.google.com/p/iniparse/
$sudo dpkg -i python-iniparse_0.3.1-1_all.deb
ส่วนโปรแกรม videocache จาก http://cachevideos.com/download
$tar xvfz videocache-1.9.2.tar.gz
$cp videocache-1.9.2
$sudo cp -r videocache /usr/share/
$sudo cp videocache-sysconfig.conf /etc/videocache.conf
$cd /var/www
$sudo mkdir videocache
$sudo videocache/tmp videocache/youtube videocache/metacafe videocache/dailymotion videocache/google videocache/redtube videocache/xtube videocache/vimeo videocache/wrzuta videocache/youporn videocache/soapbox videocache/tube8 videocache/tvuol videocache/bliptv videocache/break
$sudo chown -R proxy:proxy videocache <-- user,group proxy เป็น user ของ process squid
$sudo mkdir /var/log/videocache
$sudo chown -R proxy:proxy /var/log/videocache
แก้ไข config ของ videocache
$sudo vi /etc/videocache.conf
cache_host = x.x.x.x <== เป็น ip ของ server
proxy = http://x.x.x.x:3128/ <== เป็น ip และ port ของ squid
base_dir = /var/www/videocache/ <== เป็นที่เก็บ cache ของ videocache ซึ่งจะต้องมีการเรียกใช้ผ่าน lighttpd ด้วยครับ
logdir = /var/log/videocache/
$sudo vi /etc/lighttpd/lighttp.conf
server.document-root = “/var/www/”
server.port = 80

$sudo vi /etc/squid/squid.conf
โดยเพิ่มที่ด้านล่างของไฟล์ ได้เลยครับ
# –BEGIN– videocache config for squid
url_rewrite_program /usr/bin/python /usr/share/videocache/videocache.py
url_rewrite_children 7
acl videocache_allow_url url_regex -i .youtube.com/get_video?
acl videocache_allow_url url_regex -i .youtube.com/videoplayback .youtube.com/videoplay .youtube.com/get_video?
acl videocache_allow_url url_regex -i .youtube.com/videoplayback .youtube.com/videoplay .youtube.com/get_video?
acl videocache_allow_url url_regex -i .youtube.[a-z][a-z]/videoplayback .youtube.[a-z][a-z]/videoplay .youtube.[a-z][a-z]/get_video?
acl videocache_allow_url url_regex -i .googlevideo.com/videoplayback .googlevideo.com/videoplay .googlevideo.com/get_video?
acl videocache_allow_url url_regex -i .google.com/videoplayback .google.com/videoplay .google.com/get_video?
acl videocache_allow_url url_regex -i .google.[a-z][a-z]/videoplayback .google.[a-z][a-z]/videoplay .google.[a-z][a-z]/get_video?
acl videocache_allow_url url_regex -i (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/videoplayback?
acl videocache_allow_url url_regex -i (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/videoplay?
acl videocache_allow_url url_regex -i (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/get_video?
acl videocache_allow_url url_regex -i proxy[a-z0-9-][a-z0-9][a-z0-9][a-z0-9]?.dailymotion.com/
acl videocache_allow_url url_regex -i vid.akm.dailymotion.com/
acl videocache_allow_url url_regex -i [a-z0-9][0-9a-z][0-9a-z]?[0-9a-z]?[0-9a-z]?.xtube.com/(.*)flv
acl videocache_allow_url url_regex -i bitcast.vimeo.com/vimeo/videos/
acl videocache_allow_url url_regex -i va.wrzuta.pl/wa[0-9][0-9][0-9][0-9]?
acl videocache_allow_url url_regex -i .files.youporn.com/(.*)/flv/
acl videocache_allow_url url_regex -i .msn.com.edgesuite.net/(.*).flv
acl videocache_allow_url url_regex -i media[a-z0-9]?[a-z0-9]?[a-z0-9]?.tube8.com/ mobile[a-z0-9]?[a-z0-9]?[a-z0-9]?.tube8.com/
acl videocache_allow_url url_regex -i .mais.uol.com.br/(.*).flv
acl videocache_allow_url url_regex -i .video[a-z0-9]?[a-z0-9]?.blip.tv/(.*).(flv|avi|mov|mp3|m4v|mp4|wmv|rm|ram)
acl videocache_allow_url url_regex -i video.break.com/(.*).(flv|mp4)
acl videocache_allow_dom dstdomain .mccont.com .metacafe.com .redtube.com .cdn.dailymotion.com
acl videocache_deny_url url_regex -i http://[a-z][a-z].youtube.com http://www.youtube.com
url_rewrite_access deny videocache_deny_url
url_rewrite_access allow videocache_allow_url
url_rewrite_access allow videocache_allow_dom
redirector_bypass on
# –END– videocache config for squid

ดูจาก forum ของ videocache.com ครับต้องแก้ code ของ videocache.py ด้วย

$sudo vi /usr/share/videocache/videocache.py

if enable_google_cache:
if (host.find(‘.youtube.com’) > -1 or host.find(‘.youtube.com’) > -1 or re.compile(‘.youtube.[a-z][a-z]’).search(host) or re.compile(‘^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$’).match(host)) and (path.find(‘videoplayback’) > -1 or path.find(‘videoplay’) > -1 or path.find(‘get_video’) > -1) and path.find(‘get_video_info’) < 0:
type = ‘YOUTUBE’
arglist = params.split(‘&’)
dict = {}
for arg in arglist:
try:
dict[arg.split(‘=’)[0]] = arg.split(‘=’)[1]
except:
continue
if dict.has_key(‘video_id’):
video_id = dict[‘video_id’]
elif dict.has_key(‘docid’):
video_id = dict[‘docid’]
elif dict.has_key(‘id’):
video_id = dict[‘id’]
else:
video_id = None
if video_id is not None:
new_url = submit_video(pid, client, type, url, video_id)
else:
log(format%(pid, client, ‘-‘, ‘URL_ERROR’, type, ‘docid not found in ‘ + new_url))

จากนั้น start process ของ squid และ lighttp
$sudo /etc/init.d/squid start
$sudo /etc/init.dlighttpd start
ดู logging จาก /var/log/squid/access.log, /var/log/videocache/videocache.log
$sudo tail -f /var/log/squid/access.log
$sudo tail -f /var/log/videocache/videocache.log

เมื่อเราเปิด video จาก youtube ดูในครั้งที่ 2 จะมีการเปิดจาก cache ครับสังเกตุง่ายๆครับว่าตรงมุมซ้ายด้านล่างของ firefox จะเห็นเป็น ip ของ server

[Linux] script สำหรับ check process แบบง่ายๆๆๆๆ

สืบเนื่องมาจากเปิด transmission-daemon ไว้แล้วมัน crash บ่อยเลยอยากให้มี script ไว้ตรวจสอบแล้ว restart อัติโนมัติ

$vi psmon.sh
#!/bin/sh
pid=`ps -ef|grep transmis|grep -v grep|awk ‘{print $2}’`
if [ -z “$pid” ]; then
echo “Process NOT running, Start process now!”
/etc/init.d/transmission-daemon restart
date >> /home/ubuntu/Ubuntu/psmon.log
else
echo “Process running”
fi
$chmod 755 psmon.sh
แล้วเรียก script ใน crontab ทุกๆ 5 นาที
$crontab -e
*/5 * * * * /home/ubuntu/Ubuntu/psmon.sh

[Linux] ใช้ wireshark บน text mode

ผมติดการใช้งาน wireshark แต่พอดีมาใช้บน linux แล้วเป็น text mode command line ใช้ tcpdump มันแสดงผลไม่สวยเห็น wireshark มีบน text เหมือนกันชื่อ tshark

install
$sudo apt-get install tshark
$sudo tshark -i eth0 -V -f “host 192.168.1.1”
ตัวอย่างมีการ capture interface eth0 โดยมี filter ที่มี src หรือ dst เป็น 192.168.1.1 แล้วแสดงผลเป็น tree คล้ายๆ GUI

[Linux] ทำ FTP caching

ต้องการทำ ftp caching ให้ install package frox
vi /etc/frox.conf
Listen 0.0.0.0
Port 2121
ResolvLoadHack wontresolve.doesntexist.abc
TcpOutgoingAddr 192.168.1.100
#^– ifconfig eth0:1 inet 192.168.1.100 netmask 255.255.255.255 up
User frox
Group frox
WorkingDir /var/spool/frox
LogLevel 20
LogFile /var/spool/frox/frox-log
PidFile /var/run/frox.pid
APConv yes
BounceDefend yes
CacheModule local
CacheSize 10240
CacheAll yes
CacheOnFQDN yes
MaxForks 10
MaxForksPerHost 10
ACL Allow * – *

[Linux] Compile cacti-spine แล้ว error

ผมใช้ ubuntu 8.10 เวลาจะ compile cacti-spine เองมัน error
ubuntu@hybitz:~/cacti-spine-0.8.7a$ ./configure
configure: error: cannot run /bin/bash config/config.sub
วิธีแก้คือ

aclocal
autoheader
libtoolize –force
automake –add-missing
autoconf
./configure
make
make install

Tunning TCP window size ของ Windows

ผมลอง FTP ระหว่าง linux กับ XP ไป Siteเดียวกัน Link เดียวกัน ปรากฏว่าผล download ของ Linux ดีกว่า เลยต้องปวดหัว ดูจาก packet ก็น่าจะเกี่ยวกับ window size เลยไปถามพี่ google พี่แกก็เลยบอกมาว่าไปดูที่ h**p://rdweb.cns.vt.edu/public/notes/win2k-tcpip.htm ซึ่งหลังจาก tunning registry แล้วก็ Ok เลย

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters]


The names/values I installed are:

GlobalMaxTcpWindowSize

REG_DWORD

131400 (decimal)

TcpWindowSize

REG_DWORD

131400 (decimal)

Tcp1323Opts

REG_DWORD

3

[Linux] เวลาเราใช้ vmware เพื่อใช้ emu Olive เจอปัญหาเรื่อง console

เวลาเราใช้ vmware เพื่อ emulation Olive ซึ่งโดย default แล้ว olive จะ input/output ทาง console ฉะนั้นทำให้เราไม่สามารถ console กับ vmware ได้
1. ที่ vmware ทำการ add serial port โดยเป็น name pipe
path= /tmp/com1
This end is the server
This other end is an application
2. install software name socat
sudo apt-get install socat
3. run socat
socat -d -d /tmp/com1 pty <-- socat จะทำการ emulate /dev/pts/? จากนั้นเราใช้ minicom use port /dev/pts/?
4. minicom -s

[Linux] perl script สำหรับไป show config ของ cisco

perl script สำหรับเก็บ config cisco โดยดึงข้อมูลจาก Database ของ cacti แล้ว telnet ไป show running-config แล้วมาเก็บไว้ จากนั้นก็ทำการ compare กับของเดิมที่มีอยู่โดยใช้ unix diff command ถ้า config มีการเปลี่ยนแปลงให้ส่งเมล์

#!/usr/bin/perl
use Net::Telnet::Cisco;
use DBI();
use File::Copy;
use MIME::Lite;
#$|++;

$diff_cmd =”/usr/bin/diff -b -B -i -w “;
$mail_server = “mail.server.co.th”;
$mail_from = ‘tacacs@server.co.th’;
$mail_to = ‘admin@server.co.th’;

$username = ‘cisco_priv15’;
$password = ‘cisco_password’;

$db_name = ‘cacti’;
$db_username = ‘cacti’;
$db_password = ‘cacti’;

$mail_diff_enable = 1;
$mail_diff_alert = 0;

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$time=sprintf “%4d-%02d-%02d_%02d:%02d:%02d”,$year+1900,$mon+1,$mday,$hour,$min,$sec;

$backup_path = sprintf “./config-backup/%4d%02d%02d”, $year+1900,$mon+1,$mday;
$backup_lastest = “./config-backup/lastest”;
$mail_data =””;
$config_change_count = 0;
mkdir($backup_path);

# Connect to the database.
my $dbh = DBI->connect(“DBI:mysql:database=$db_name;host=localhost”,$db_username,$db_password,{‘RaiseError’ => 1});
my $sth = $dbh->prepare(“SELECT id,description,hostname FROM host WHERE hostname != ‘127.0.0.1’ and disabled != ‘on’ “);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
#print “Found a row: id = $ref->{‘id’}, description = $ref->{‘description’}, hostname = $ref->{‘hostname’}n”;

$session = “”; # restore to default value
my $session = Net::Telnet::Cisco->new(Host => $ref->{‘hostname’}, Errmode => “return”);
if($session){
$session->login($username, $password);

$session->cmd(‘term len 0’);
@output = $session->cmd(‘show running-config’);
$num = @output;

if($num > 2 ){
$backup_file = $backup_path.”/”.$ref->{‘description’}.”_”.$ref->{‘hostname’}.”.cfg”;
$backup_lastest_file = $backup_lastest.”/”.$ref->{‘description’}.”_”.$ref->{‘hostname’}.”.cfg”;
#print “backup file: $backup_filen”;
#print “backup lastest file: $backup_lastest_filen”;
open(FP,”>$backup_file”);
for( $i = 3 ; $i < $num ; $i++){ # suppress header file
$cfg = $output[$i];
print FP $cfg;
}
if( -e “$backup_lastest_file”){
$diff = `$diff_cmd $backup_lastest_file $backup_file`;
if($diff){
$mail_data = $mail_data.”#==============================================n”;
$mail_data = $mail_data.”# Hostname: “.$ref->{‘description’}.” (“.$ref->{‘hostname’}.”)n”;
$mail_data = $mail_data.”#==============================================n”;
$mail_data = $mail_data.”$diffn”;
$mail_diff_alert = 1;
$config_change_count++;
#print $mail_data;
}
}
copy($backup_file, $backup_lastest_file);
close(FP);
}

$session->close;
}else{
print “Can’t remote telnet to $ref->{‘hostname’}n”;
}
}
if($mail_diff_alert && $mail_diff_enable){
$msg = MIME::Lite->new(
From =>”$mail_from”,
To =>”$mail_to”,
Subject =>”Config has modified $config_change_count host(s) : $time”,
Data =>”$mail_data”);
$msg->send(‘smtp’, “$mail_server”, Timeout=>60);
}

$sth->finish();

$dbh->disconnect();