Suchart.Blog –> ITupstart.com

ธันวาคม 27, 2007

Kernel 2.6.23.12 + iptables 1.4.0 (1.3.8) + L7-filter + ipp2p on Ubuntu 7.10 Server

Filed under: Debian,Linux,Ubuntu — suchart @ 7:18 pm

Update 20080105

ไม่แน่ใจว่า ถึงตอนนี้ patch-o-matic จะอัพเดต ipp2p ให้ใช้งานได้กับ iptables 1.4.0 หรือยัง แต่คุณ rokoman ได้แนะนำ patch มาให้

http://sources.gentoo.org/viewcvs.py/gentoo-x86/net-firewall/ipp2p/files/ipp2p-0.8.2-iptables-1.4.0.patch?view=markup

รู้สึกว่าจะมาจาก gentoo แต่ผมยังไม่ได้ลองนะครับ

20071228

คำเตือน Segmentation fault <== ไม่สามารถใช้ iptables 1.4.0 กับ ipp2p ได้ ถ้าต้องการใช้ ipp2p ด้วย ควรติดตั้ง iptables 1.3.8 แทน

— ขีดยาวหน่อย มันคือ ขีด 2 ขีดติดกันนะครับ wordpress มันจับมาติดกันเป็นขีดเดียวซะงั้น ถ้าขยัน เดี๋ยวผมจะกลับมาแก้ให้


Netfilter ในเคอร์เนลลีนุกซ์ จะเป็นส่วนจัดการทางด้าน packet filtering โดยมี iptables เป็น user tool ที่ใช้ในการจัดการอีกทีหนึ่ง


ปกติแล้ว
netfilter และ iptables นั้นจะทำงานในชั้นที่สูงสุดก็แค่ transport เท่านั้น แต่เนื่องจากแอพลิเคชันบางส่วน เช่น p2p นั้น จำเป็นจะต้องใช้ความสามารถในระดับชั้นที่ 7 หรือ application layer จึงจะสามารถกลั่นกรองได้


L7-filter เป็น patch ที่ช่วยใช้ netfilter และ iptables สามารถกลั่นกรองแพ็คเก็ตในระดับชั้นที่ 7 โดยทั่วๆไปได้ ในขณะที่ ipp2p จะเจาะจงเฉพาะ p2p เท่านั้น


ทั้ง
L7-filter และ ipp2p สามารถติดตั้งใช้งานได้หลายแบบ วิธีที่แสดงนี้เป็นแค่วิธีหนึ่งเท่านั้นที่ผมได้ลองติดตั้ง

1. ติดตั้งแพคเกจที่ใช้ในการคอมไพล์และสร้าง kernel image

apt-get update
apt-get install build-essential
apt-get install kernel-package
apt-get install libncurses5-dev

2.

cd /usr/src
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.12.tar.bz2
tar xvjf linux-2.6.23.12.tar.bz2
ln -s linux-2.6.23.12 linux

wget http://jaist.dl.sourceforge.net/sourceforge/l7-filter/netfilter-layer7-v2.17.tar.gz
wget http://jaist.dl.sourceforge.net/sourceforge/l7-filter/l7-protocols-2007-11-22.tar.gz


คำเตือน Segmentation fault <== ไม่สามารถใช้ iptables 1.4.0 กับ ipp2p ได้ ถ้าต้องการใช้ ipp2p ด้วย ควรติดตั้ง iptables 1.3.8 แทน

wget http://iptables.org/projects/iptables/files/iptables-1.4.0.tar.bz2
wget ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20071226.tar.bz2

tar xvzf l7-protocols-2007-11-22.tar.gz
tar xvzf netfilter-layer7-v2.17.tar.gz
tar xvjf patch-o-matic-ng-20071226.tar.bz2
tar xvzjf iptables-1.4.0.tar.bz2
ln -s iptables-1.4.0 iptables

3. patch linux kernel & iptables with l7-filter

cd /usr/src/linux
patch -p1 < ../netfilter-layer7-v2.17/kernel-2.6.22-2.6.24-layer7-2.17.patch

cd ../iptables
patch -p1 < ../netfilter-layer7-v2.17/iptables-1.4-for-kernel-2.6.20forward-layer7-2.17.patch
chmod +x extensions/.layer7-test

4. patch linux kernel & iptables with ipp2p (patch-o-matic)

cd ../patch-o-matic-ng-20071226/
./runme –download

Hey! KERNEL_DIR is not set.

Where is your kernel source directory? [/usr/src/linux] <– Enter

Hey! IPTABLES_DIR is not set.

Where is your iptables source code directory? [/usr/src/iptables] <– Enter

./runme ipp2p

Hey! KERNEL_DIR is not set.

Where is your kernel source directory? [/usr/src/linux] <– Enter

Hey! IPTABLES_DIR is not set.

Where is your iptables source code directory? [/usr/src/iptables] <– Enter

Do you want to apply this patch [N/y/t/f/a/r/b/w/q/?] y

5. config and compile kernel

cd /usr/src/linux
cp /boot/config-2.6.22-14-server ./.config

####### make oldconfig

make menuconfig

เลือกไปที่

Networking –> Networking options –> Network packet filtering framework (Netfilter)

–> Core netfilter configuration

เลือก <M> “layer7” match support

[*] Layer 7 debugging output

ส่วนอันอื่นที่ยังไม่ได้เลือก ก็สามารถเลือกได้ ตามต้องการ

<M> UDP-Lite protocol connection tracking support (EXPERIMENTAL)

<M> SANE protocol support (EXPERIMENTAL)

<M> “TRACE” target support (NEW)

<M> “connlimit” match support (NEW)

<M> “u32” match support

แล้ว exit ออกมา โดยกด Esc 2 ครั้งติดๆกัน แล้วไปที่ IP: Netfilter Configuration เลือก

<M> IPP2P match support

อยู่ด้านล่างสุดเลย แล้ว exit ออกมา โดยกด Esc 2 ครั้ง ไปเรื่อยๆ จนกระทั่งปรากฏหน้าจอ

Do you wish to save your new kernel configuration?

ให้กด Enter เพื่อบันทึกค่าคอนฟิก

6. คอมไพล์และสร้าง kernel image ใหม่ ขั้นตอนนี้ต้องรอนานหน่อยนะครับ

make-kpkg clean
make-kpkg –initrd –append-to-version=-l7-p2p kernel_image kernel_headers

7. หลังจากรอคอยมานาน ต่อไปก็ติดตั้ง kernel ใหม่

cd /usr/src

dpkg -i linux-image-2.6.23.12-l7-p2p_2.6.23.12-l7-p2p-10.00.Custom_i386.deb

dpkg -i linux-headers-2.6.23.12-l7-p2p_2.6.23.12-l7-p2p-10.00.Custom_i386.deb

reboot

shutdown -r now 

8. คอมไพล์และติดตั้ง iptables

cd /usr/src/iptables
make KERNEL_DIR=/usr/src/linux
make install
mv /usr/src/l7-protocols-2007-11-22 /etc/l7-protocols

10. ทดสอบ

iptables -A FORWARD -m layer7 —l7proto bittorrent -j DROP

iptables -A FORWARD -m ipp2p –ipp2p -j DROP

Segmentation fault <== ไม่สามารถใช้ iptables 1.4.0 กับ ipp2p ได้ ซะงั้น (:

11. patch, compile and install iptables 1.3.8 แทน iptables 1.4.0 ที่มีปัญหากับ ipp2p (ไม่ต้อง patch และ compile kernel ใหม่)

cd /usr/src
wget http://iptables.org/projects/iptables/files/iptables-1.3.8.tar.bz2
tar xvjf iptables-1.3.8.tar.bz2
rm iptables
ln -s iptables-1.3.8 iptables
cd iptables
patch -p1 < ../
netfilter-layer7-v2.17/iptables-1.3-for-kernel-2.6.20forward-layer7-2.17.patch
chmod +x extensions/.layer7-test
cd ../patch-o-matic-ng-20071226
./runme –download
./runme ipp2p
cd ../iptables
make KERNEL_DIR=/usr/src/linux
make install

12. Test

iptables -A FORWARD -m layer7 —l7proto bittorrent -j DROP

iptables -A FORWARD -m ipp2p –ipp2p -j DROP

(: ขอพักก่อนนะครับ !

 

Advertisements

12 ความเห็น »

  1. จากการทดสอบ ติดตั้งตามขั้นตอนผ่าน 100% แต่ขณะเดียวกัน ผมได้ทำเป็น bridge การกรอง bittorrent ไม่ได้ผล 100% นะครับ ยังคงผ่านออกไปได้มาก แต่ก็ไม่มากเหมือนก่อนติดตั้ง ไม่ทราบว่าจะทำอย่างไรให้ได้ผลมากกว่านี้ครับ

    ซึ่ง ถ้าไม่ได้เป็น bridge จะปิดกั้นได้ดีกว่านี้ ผมเองก็ชักจะงง

    ความเห็น โดย คนติดตาม — มกราคม 2, 2008 @ 10:18 am | ตอบกลับ

  2. @คนติดตาม

    ผมเองยังไม่มีโอกาสได้ลองกับ linux bridge แต่เท่าที่ตอนนี้พอจะี่คิดไ้ด้ ก็อาจจะเป็นที่ iptables rules หรือที่น่าหนักใจกว่านั้นก็คือ bug
    ถ้ามีความคืบหน้าอย่างไร ก็ช่วยมาบอกกล่าวด้วยนะครับ จะได้เป็นประโยชน์กับผมและคนอื่นๆ ด้วย

    ความเห็น โดย suchart — มกราคม 2, 2008 @ 12:12 pm | ตอบกลับ

  3. ลองใช้ patch ตัวนี้นะคับ

    http://sources.gentoo.org/viewcvs.py/gentoo-x86/net-firewall/ipp2p/files/ipp2p-0.8.2-iptables-1.4.0.patch?view=markup

    จะทำให้สามารถใช้ ipp2p กับ iptables 1.4.0 ได้คับ

    ส่วนในเรื่องของการบล็อค bittorrent ของเจ้าตัว ipp2p ไม่ว่าทำในโหมดไหน ไม่สามารถบล็อค bittorrent ได้ 100% คับ จะบล็อคได้ก็ต่อ 100% ก็ต่อเมื่อยังไม่มีการเชื่อมต่อ

    แต่ผมมีอีกวิธี ลองเอาไปคิดต่อเล่นๆนะคับ ลองทำเป็นโปรแกรมหรือ shell script เวลาเจอไอพีไหนที่ใช้ bittorrent ก็โยนไป chain ของ iptables เช่น blacklistip แต่ทำการบล็อคไปประมาณแค่ 5-10 นาที แย้วทำการลบออกจาก list แค่นี้ก็ทำให้บล็อคบิคได้เกือบ 99% เลย อีก 1% เพื่อไว้กันหน้าแตกอะคับ

    ความเห็น โดย rokoman — มกราคม 4, 2008 @ 4:34 pm | ตอบกลับ

  4. @ rokoman
    ขอบคุณครับ สำหรับลิงค์ของ patch
    เห็นมีหลายๆคนแนะนำว่าควรจะใช้วิธี shape bandwidth ด้วยจะดีกว่า เพราะเอาเข้าจริงๆ แล้ว ถ้า drop เฉยๆ ยูสเซอร์ที่พอจะเป็นหน่อยก็หาทางไปได้อยู่ดี

    ความเห็น โดย suchart — มกราคม 5, 2008 @ 4:18 am | ตอบกลับ

  5. กลับไปทดสอบมานิดหน่อย ก็พบว่าหากโหลดบิตแบบธรรมดาแล้ว การบล็อคพวกนี้ก็ทำได้ไม่ยากครับแต่หากมีการเข้ารหัส (Encryp)ที่ตัวโปรแกรมแล้ว ก็ยากหน่อยที่จะปิดมัน ผมก็นั่ง sniff เครื่องตัวผมเองนี่แหละครับ ถ้าหากมีการ Encryp แล้ว แพ็คเก็จที่วิ่งออกไปนี่ คล้ายคลึงกับการใช้งานปกติ tcp ธรรมดา ๆ อาจจะเหมือนเข้าเว็บพวก https นี่แหละ แต่มันจะออก 80 แฮะ (ชอบหลบพอร์ตกันจริง) สุดท้ายแล้วคงไม่ปิดมันแล้ว ปิดไป ทำให้เกิดการดีเลย์เปล่า ๆ จะเปลี่ยนมาเป็นเกทเวย์โหมด ก็ขี้เกียจไล่แก้เร้าติ้งอีก เฮ้อ

    คงต้องทำ authen ซะแล้ว จะได้รู้ไปเลยว่าใครทำอะไร

    ปล. บทความที่คุณเขียนมานี่ น่าสนใจมากครับ คงต้องแวะมาอ่านบ่อย ๆ ซะแล้ว

    ความเห็น โดย ผ่านมาอีกที — มกราคม 5, 2008 @ 7:15 am | ตอบกลับ

  6. ทดสอบไปทดสอบมา ปรากฎว่า เราทำขั้นตอนนี้ได้ครับ คือกำหนด protocol ให้อีกชุดหนึ่ง ดังนี้ครับ

    สร้างไฟล์ชื่อ announce ขึ้นมาก่อนครับ ที่ห้อง protocol นะครับ
    # Block announce bittorrent
    announce
    ^get.+announce.+info_hash=

    จากนั้นก็บันทึก
    แล้วเพิ่มกฎเข้าไปอีกบรรทัดหนึ่ง
    iptables -A FORWARD -m layer7 –l7proto announce -j DROP

    เท่าที่ผมทดสอบเป็นดังนี้ครับ

    root@filter:/etc/l7-protocols/protocols# iptables -L -n -v
    Chain INPUT (policy ACCEPT 242K packets, 67M bytes)
    pkts bytes target prot opt in out source destination

    Chain FORWARD (policy ACCEPT 6866M packets, 5777G bytes)
    pkts bytes target prot opt in out source destination
    143K 47M DROP all — * * 0.0.0.0/0 0.0.0.0/0 ipp2p v0.8.1_rc1 –ipp2p
    333K 24M DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto bittorrent
    351K 134M DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto bittorrent_announce
    0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto worldofwarcraft
    0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto directconnect
    0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto ares
    0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto soulseek
    0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto fasttrack

    Chain OUTPUT (policy ACCEPT 22944 packets, 5739K bytes)
    pkts bytes target prot opt in out source destination

    ความเห็น โดย ชักชอบแล้ว — มกราคม 7, 2008 @ 8:06 am | ตอบกลับ

  7. @ ชักชอบแล้ว

    ดีครับ เล่นเยอะๆ แล้วก็เขียนมาอีกนะครับ -:) ขอบคุณครับ

    ความเห็น โดย suchart — มกราคม 8, 2008 @ 5:26 am | ตอบกลับ

  8. ต้องขอขอบคุณคำแนะนำดีๆคะ แต่อยากทราบว่า หลังจาก compile kernel เรียบร้อยแล้วต้องไปแก้ grub หรือว่า initrd หรืออะไรแบบนี้ไหมคะ เพราะว่าได้ทดลองทำบน ubuntu 10.7 (VMWare)

    ความเห็น โดย liv fan — มกราคม 8, 2008 @ 8:51 am | ตอบกลับ

  9. @ liv fan

    ubuntu 10.7 นี่ผมไม่แน่ใจ -:) แต่ 7.10 ที่ผมทำโดยใ้ช้ คำสั่งตามข้อ 6 และ 7 มันจะไปแก้ไข grub config ให้เลย มีเมนูให้เลือก โดยตัวดีฟอลต์ก็คือตัวที่เราพึ่งติดตั้งใหม่

    ———————————————–
    6. คอมไพล์และสร้าง kernel image ใหม่ ขั้นตอนนี้ต้องรอนานหน่อยนะครับ

    make-kpkg clean
    make-kpkg --initrd --append-to-version=-l7-p2p kernel_image kernel_headers

    7. หลังจากรอคอยมานาน ต่อไปก็ติดตั้ง kernel ใหม่

    cd /usr/src

    dpkg -i linux-image-2.6.23.12-l7-p2p_2.6.23.12-l7-p2p-10.00.Custom_i386.deb

    dpkg -i linux-headers-2.6.23.12-l7-p2p_2.6.23.12-l7-p2p-10.00.Custom_i386.deb

    reboot
    ————————————————

    ความเห็น โดย suchart — มกราคม 8, 2008 @ 10:20 am | ตอบกลับ

  10. ผมลองทำตามแล้วครับได้ผลดังนี้ครับ
    Chain INPUT (policy DROP 15158 packets, 1246K bytes)
    pkts bytes target prot opt in out source destination
    3243K 2014M ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
    1355 312K REJECT all — eth1 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
    125K 32M DROP all — eth0 * 0.0.0.0/0 0.0.0.0/0
    1844 88512 ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 flags:0x17/0x02
    190 9192 ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 flags:0x17/0x02
    2748 132K ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3990 flags:0x17/0x02
    35239 1691K ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:800 flags:0x17/0x02
    9 432 ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02
    124 24822 ACCEPT all — lo * 0.0.0.0/0 0.0.0.0/0

    Chain FORWARD (policy ACCEPT 376K packets, 181M bytes)
    pkts bytes target prot opt in out source destination
    7190 3055K DROP tcp — * * 0.0.0.0/0 0.0.0.0/0 ipp2p v0.8.1_rc1 –bit
    374K 32M DROP all — eth0 * 0.0.0.0/0 0.0.0.0/0
    0 0 DROP all — * eth0 0.0.0.0/0 0.0.0.0/0
    66815 5954K DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto bittorrent
    2710 304K DROP all — * * 0.0.0.0/0 0.0.0.0/0 ipp2p v0.8.1_rc1 –ipp2p
    4016 997K DROP all — * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto announce
    0 0 DROP all — tun0 * 0.0.0.0/0 0.0.0.0/0 ipp2p v0.8.1_rc1 –ipp2p
    0 0 DROP all — tun0 * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto bittorrent

    ดูเหมือนจะเอาไม่อยู่จริง ๆ ครับแต่ก็ดีใจที่กันไว้ได้ส่วนหนึ่ง

    ความเห็น โดย ainux — เมษายน 8, 2008 @ 8:26 pm | ตอบกลับ

  11. มีใครเคยลองบน Ubuntu8.04 รึยังคะ compile ตามนี้ แต่ on ubuntu8 มันใช้คำสั่ง make-kpkg ไม่ได้อ่ะค่ะ

    ความเห็น โดย สีชมพู — พฤษภาคม 16, 2008 @ 3:18 pm | ตอบกลับ

  12. ผมลองแล้วนะครับ ให้ไปที่ Processor type and features > Paravirtualized guest support ให้เอา Xen guset support ออกครับ เนื่องจาก Source Code ไม่มี Code ของ XEN เลยทำให้ Compile แล้ว Error

    ความเห็น โดย Teamza — กรกฎาคม 5, 2008 @ 9:27 pm | ตอบกลับ


RSS feed for comments on this post. TrackBack URI

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

บลอกที่ WordPress.com .

%d bloggers like this: