forcemax's

IBM Thinkpad X60에서 Ubuntu 10.04에서 10.10으로 업그레이드를 완료하고 리부팅을 한후에 사용하려고 보니, 화면이 이상하게 나오고 있었다.
10.04에서도 intel driver 관련하여 문제가 있었는데 또 발생했다. ㅠ.ㅜ
이번에는 지난번에 발생한 문제와 상황이 좀 다른듯하여 구글님의 도움을 받아보기로 하였다.

관련 페이지는 아래 참조 링크.

결론은 xorg-edgers PPA를 추가하고 패키지를 업데이트하면 된다는 것이다.

다음의 명령 몇개 입력해주고 재부팅하면 끝.

$ sudo apt-add-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ sudo apt-get upgrade

만약 위의 방법으로 패키지를 업데이트 했는데도 문제가 해결이 안되었을 경우, 일단 업데이트한 패키지를 제거하기 위해서 다음의 명령을 입력해준다.

$ sudo ppa-purge xorg-edgers

참조 : https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/619663

/etc/init.d/iptables를 다음과 같이 만든다. (permission은 775)

#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    networking ifupdown $local_fs
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

IPTABLES=/sbin/iptables
EXT_ETH=eth0

${IPTABLES} -F
${IPTABLES} -t nat -F
${IPTABLES} -X BLACKLISTCHECK

${IPTABLES} -P INPUT ACCEPT
${IPTABLES} -P OUTPUT ACCEPT
${IPTABLES} -P FORWARD ACCEPT

${IPTABLES} -A INPUT -j ACCEPT -i lo
${IPTABLES} -A INPUT -j ACCEPT -p icmp --icmp-type any
${IPTABLES} -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

${IPTABLES} -N BLACKLISTCHECK
${IPTABLES} -A INPUT -j BLACKLISTCHECK -i ${EXT_ETH} -m state --state NEW -p tcp --dport 22

for x in `cat /tmp/ssh_evil`; do
${IPTABLES} -I BLACKLISTCHECK -s $x -j DROP
done

# 80, 22번 포트만 오픈
${IPTABLES} -A INPUT -j ACCEPT -i ${EXT_ETH} -m state --state NEW -p tcp --dport 22
${IPTABLES} -A INPUT -j ACCEPT -i ${EXT_ETH} -m state --state NEW -p tcp --dport 80

${IPTABLES} -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
${IPTABLES} -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 6 -j LOG --log-prefix "SSH_brute_force "

${IPTABLES} -A INPUT -j REJECT --reject-with icmp-host-prohibited

/etc/init.d/swatch 파일이 없다면 다음의 내용으로 생성한다. (permission은 775)
#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          swatch
# Required-Start:    networking ifupdown $local_fs
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

PATH="/sbin:/bin:/usr/sbin:/usr/bin"
NAME="swatch"
DAEMON="/usr/bin/swatch"
DESC="simple watcher"
CONFFILE="/etc/swatch.conf"
#LOGFILE="/var/log/secure"
LOGFILE="/var/log/syslog"
PIDFILE="/var/run/swatch.pid"
OPTS="--config-file=$CONFFILE --tail-file=$LOGFILE --pid-file=$PIDFILE --awk-field-syntax --tail-args='-F' --daemon"

test -x $DAEMON || exit 0

start() {
    if [ ! -f "$CONFFILE" ]; then
        echo "Error: $CONFFILE does not exist."
        exit 1
    fi
    if [ ! -f "$LOGFILE" ]; then
        echo "Error: $LOGFILE does not exist."
        exit 1
    fi
    if [ -f "$PIDFILE" ]
    then
        echo "Error: $NAME is already running."
    else
        $DAEMON $OPTS >/dev/null 2>&1
    fi
}

stop() {
    if [ -f "$PIDFILE" ]
    then
        PID=`cat $PIDFILE`
        if ps h $PID > /dev/null
        then
            pkill -P $PID
            kill $PID
        else
            echo "Error: $NAME is not running, but PID file exists. Deleting it."
        fi
        rm -f $PIDFILE
    else
        echo "Error: $NAME is not running."
    fi
}

case "$1" in
  start)
    echo "Starting $DESC: $NAME"
    start
    ;;
  stop)
    echo "Stopping $DESC: $NAME"
    stop
    ;;
  restart)
    echo "Restarting $DESC: $NAME"
    stop
    sleep 1
    start
    ;;
  *)
    echo "Usage: $0 start|stop|restart"
    exit 1
    ;;
esac

exit 0

swatch.conf에는 다음을 추가한다.
perlcode my $sshscript = '/root/swatch-ssh';
watchfor /([a-zA-Z]{3})\s+([0-9]{1,2}) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([a-zA-Z0-9_-]+) kernel: \[.*\] SSH_brute_force .*SRC=(.*) DST=/
        exec "$sshscript '$*' >> /var/log/swatch.log"
        throttle 00:00:30

swatch에서 실행할 스크립트를 만든다.
/root/swatch-ssh 파일의 내용은 다음처럼 구성한다. (역시 permission은 775)
(다른 기능도 같이 하는 스크립트에서 일부만 발췌함)
#!/usr/bin/ruby1.8

if ARGV.length==0 && ARGV.length < 2
  puts "Error!! Argument must more than 1 words!!"
  puts "ex) swatch-ssh message"
  exit 1
else
  begin
    message = ""
    argv_msg = ARGV[0].split
    host = argv_msg[3]

    beginflag = false
    for qs in argv_msg do
      message = message + (message!=""?" ":"") + qs if beginflag == true
      beginflag = true if qs == host
    end

    # for 3ware modules message
    message.sub!(/kernel: \[[0-9\s]+\.[0-9]+\] /, '')
    message.sub!(/\(.*\)/, '')

    smsmessage = sprintf("[%s]%s\n", host, message)
#    smsmessage.gsub!(' ', '_')
    smsmessage.sub!(/\[mgm\]/, '')
    smsmessage.sub!(/SSH_brute_force .* SRC=/, '')
    smsmessage.sub!(/ DST=.*/, '')

    File.open("/tmp/ssh_deny", 'a') {|f| f.write(smsmessage) }
    command = sprintf("cat /tmp/ssh_evil /tmp/ssh_deny | sort -u > /tmp/ssh_uniq_evil ; rm /tmp/ssh_deny ; cp /tmp/ssh_uniq_evil /tmp/ssh_evil ; /etc/init.d/iptables")
#    printf("%s\n", command)
    system(command)
  end
end

exit 0

이제 모든 준비는 완료되었습니다.
iptables 스크립트를 실행시키고 swatch를 restart하면 끝.
iptables -N BLACKLISTCHECK
touch /tmp/ssh_evil
update-rc.d iptables defaults 20
update-rc.d swatch defaults 20
/etc/init.d/iptables
/etc/init.d/swatch restart

위에서 설정한 내용은 다음과 같습니다.

1. iptables를 설정하여 ssh 연결이 1분에 6번 이상 연결되면 kernel에 log를 남기게 됩니다.
2. swatch에서는 iptables가 남긴 kernel log를 발견하게 되면 /root/swatch-ssh 스크립트를 실행시킵니다.
3. /root/swatch-ssh 스크립트에서는 해당 IP Address를 /tmp/ssh_evil 파일에 남기는 동시에 /etc/init.d/iptables 스크립트를 실행시켜서 발견된 IP Addreess를 통해서 들어오는 연결을 차단합니다.

위의 1,2,3 과정을 반복하면서 ssh brute force attack이 발견되면 해당 IP Address를 지속적으로 차단합니다.

작성자 : 저입니다. ^^

현재 openafs를 사용하는 시스템이 xen위에 올라와 있어서 가끔 이상동작을 하기는 하지만 이번에는 다음과 같은 에러가 발생해서 좀 알아보았다.

Found system call table at 0xc03226c0 (pattern scan)
sysctl_check_dir: failed: /afs .1 ref: /kernel .1
sysctl table check failed: /afs .1 Inconsistent directory names

현재 운영중인 OS는 Ubuntu 8.04 LTS Hardy Heron이며 다음과 같이 작업하여 문제를 해결하였다. 64bit amd64를 사용중이다.
cd /usr/src

wget http://mirrors.kernel.org/ubuntu/pool/universe/o/openafs/openafs-modules-source_1.4.11+dfsg-4_amd64.deb

mv modules modules.old

dpkg -i openafs-modules-source_1.4.11+dfsg-4_amd64.deb

## module-assistant를 실행해서 openafs-modules를 build하고 설치

m-a -t a-i openafs-modules-source


원인은 아마 Ubuntu 8.04와 openafs 1.4.6이 호환성이 좋지 않아서가 아닐까하는 추측만 남았다.

mkfs.xfs 옵션 설정

Linux2009. 9. 24. 14:29
mkfs.xfs -f -d su=256k,sw=7 -l version=2,su=256k /dev/sdb1

sw는 disk의 갯수에 맞게 수정 (8개 raid5의 경우 7)
su는 raid stripe size에 맞추어서 수정 (raid 구성시 설정을 256k로 하였음)

PAM인증이나 HTTP인증등이 실패하는 경우 log를 분석하여 netfilter/iptables를 사용하여 접속을 차단해준다.

횟수를 지정할 수 있으며 다양한 서비스를 지원하고 있으므로 sshd, vsftpd등의 brute force attack도 방어할 수 있다.

http://www.fail2ban.org/

회사일 때문에 아직 Ubuntu 8.04 hardy heron을 사용중이다.

Logitech G5의 버튼중 Tilt-Wheel 과 Back 버튼이 동작을 안해서 동작시키려 한다.

xorg.conf에는 기본 설정만으로 동작하므로 무시

xbindkeys 및 xvkbd 패키지를 설치한다.

~/.xbindkeys를 다음과 같이 만든다.

"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Left]""
 m:0x0 + b:8
"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Right]""
 m:0x0 + b:7
"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Left]""
 m:0x0 + b:6

위 설정대로라면 Right-Tilt-Wheel은 Back 기능을 Left-Tilt-Wheel은 Forward 기능을 하게된다.
물론 Back 버튼은 Back 기능을 하게된다.

이제 xbindkeys 를 실행하면 Tilt-Wheel 과 Back 버튼이 동작하게 된다.


회사 서비스 서버중 DB 서버가 4GB의 메모리를 갖고 있는데 우리가 많이 사용하는 max_connections 계산식에 대입해보면 max_connections값으로 1333을 설정할 수 있다고 한다.

그런데 아무리 [mysqld] 섹션에 max_connections 값으로 1200을 설정해도 적용이 안되고 show variables 해보면 max_connections값이 886으로 되어 있다.

이러한 이유에서 찾아보니 다음의 두가지 설정이 중요하였다.

일단 /etc/mysql/my.cnf에는 다음의 설정을 넣어준다.

[mysqld]
max_connections = 1200
open-files-limit = 4096

그리고 한 process의 최대 open files 값을 변경하기 위해 /etc/security/limits.conf 에 다음 설정을 추가한다.

mysql           soft    nofile          4096
mysql           hard    nofile          4096

mysql 데몬을 재시작하자!



1. Unit 생성
tw_cli /c0 add type=raid5 disk=0-7 storsave=protect stripe=64

RAID5, 디스크 0-7번, protect 모드, 64KB Stripe 로 Unit을 생성하는 명령

2. Unit Migrate (Unit 0을 raid5, 256KB Stripe 로 migrate)
tw_cli /c0/u0 migrate type=raid5 stripe=256
* 주로 unit의 기존 설정값을 변환할때 사용

3. storsave 변경 (Unit 0의 storsave 값을 balance로 변경)
tw_cli /c0/u0 set storsave=balance

Ubuntu 8.10 Intrepid Ibex에서는 기존의 xorg.conf 파일을 설정하는 방법으로는 IBM TrackPoint의 휠 기능을 사용할 수 없다.

Xorg가 시동중에 hal의 설정을 임의로 불러와 사용하는데 이 부분에서 기존의 Xorg 설정이 무시되기 때문이다.

결국 hal에 설정을 해주어야 Xorg가 해당 설정을 읽어서 TrackPoint의 휠 기능이 동작할 수 있게 된다.

/proc/bus/input/devices 파일을 보면 다음과 같은 내용이 있다.

I: Bus=0003 Vendor=06cb Product=0009 Version=0100
N: Name="Synaptics Inc. Composite TouchPad / TrackPoint"
P: Phys=usb-0000:00:0b.0-4.4/input0
S: Sysfs=/devices/pci0000:00/0000:00:0b.0/usb1/1-4/1-4.4/1-4.4:1.0/input/input4
U: Uniq=
H: Handlers=mouse2 event4
B: EV=17
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=3
B: MSC=10

I: Bus=0003 Vendor=06cb Product=0009 Version=0100
N: Name="Synaptics Inc. Composite TouchPad / TrackPoint"
P: Phys=usb-0000:00:0b.0-4.4/input1
S: Sysfs=/devices/pci0000:00/0000:00:0b.0/usb1/1-4/1-4.4/1-4.4:1.1/input/input5
U: Uniq=
H: Handlers=mouse3 event5
B: EV=17
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=3
B: MSC=10

위에 나오는 내용외에도 각종 input device 관련 내용이 있는데 일단 무시하고 Name 항목을 복사해 두자.

/etc/hal/fdi/policy/mouse-wheel.fdi 파일을 만든다. 내용은 다음과 같다.

<match key="info.product" string="Synaptics Inc. Composite TouchPad / TrackPoint">
<merge key="input.x11_options.EmulateWheel" type="string">true</merge>
<merge key="input.x11_options.EmulateWheelButton" type="string">2</merge>
<merge key="input.x11_options.ZAxsisMapping" type="string">4 5</merge>
<merge key="input.x11_options.Emulate3Buttons" type="string">true</merge>
</match>

위 설정중 match 태그의 string property에 나오는 내용이 위에 /proc/bus/input/devices에서 복사해둔 내용이다.

위 파일을 저장하고 hal 데몬을 재시작한 후 X를 재시작 한다.

이제 IBM TrackPoint의 휠 기능이 동작한다.

참조 : http://www.linlap.com/wiki/Lenovo+Thinkpad+W500

Linux Traffic Control 2

Linux2008. 10. 13. 21:18

지난번에는 ingress policing을 구현하였는데 이번에는 egress shaping을 구현할 일이 생겼다.

구현할 내용은 local network에 대해서는 최대 트래픽을 사용하지만 internet으로 나가는 트래픽에 대해서는 제한을 두는 것이다.

#!/bin/bash

TC=/sbin/tc
DEV=bond0
MAX=2000
LIMIT=1000

case "$1" in
        start)
                $TC qdisc del dev $DEV root 2> /dev/null
                $TC qdisc add dev $DEV root handle 1: htb default 10
                # local network is unrestricted
                $TC class add dev $DEV parent 1: classid 1:10 htb rate ${MAX}mbit burst ${MAX}k quantum 1514
                $TC qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
                $TC filter add dev $DEV parent 1:0 protocol ip prio 10 u32 match ip dst 192.168.5.0/24 flowid 1:10
                # internet traffic is limited
                $TC class add dev $DEV parent 1: classid 1:20 htb rate ${LIMIT}mbit ceil ${LIMIT}mbit burst ${LIMIT}k quantum 1514
                $TC qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
                $TC filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip src 0.0.0.0/0 flowid 1:20
                ;;
        stop)
                $TC qdisc del dev $DEV root 2> /dev/null
                ;;
        show)
                $TC qdisc show dev $DEV
                $TC -s class show dev $DEV
                $TC -s filter show dev $DEV
                ;;
        *)
                echo "Usage: $0 start|stop|show" >&2
                exit 3
                ;;
esac




일단 위의 스크립트 대로 적용하면 2Gbps의 bond0 인터페이스에서 외부로 나가는 트래픽중
'192.168.5.0/24' 대역에 걸리는 트래픽은 $MAX에 정해놓은 수치(위에는 2Gbps)로
그 외 '0.0.0.0/0' (전체 네트웍)으로 나가는 트래픽은 $LIMIT에 정해놓은 수치(위에는 1Gbps)로
나가도록 설정된다.