Wednesday, December 27, 2006

Linux Transparent Firewall架設完全攻略

前言:
很多時候,在不想變動原本的網路架構下,如果有需要將網路隔離開時,就需用到透通式的防火牆,所謂的透通式的防火牆它是個in-line mode的裝置,你可以把它想成是一個Bridge裝置,但確有可以過濾封包的功能,提醒一下既然是Bridge裝置,當然它就是屬於Layer 2那一層囉!


Environment:
以下是筆者所測試的環境:

Server ---------- Firewall ---------- Client
Server IP address: 192.168.1.100
Client IP address: 192.168.1.200
Firewall IP address: 192.168.1.1

Objective:
只允許Server可以透過網芳將檔案傳送到Client端(單向),Server與Client可互相透過icmp echo request確認彼此間的連線 (雙向) 。

Setup Procedure:

1.Bind兩張網卡成一個bridge interface:
Firewall至少要有兩張網卡,然後只要將它們bind起來,Firewall就可以成了一個Bridge裝置。首先要安裝bridge-utils與bridge-utils-devel這兩個套件,這兩個套件可以把eth0與eth1 bind成一個bridge裝置,正好符合我們以上的需求,筆者是用RHEL4.4架設的,非常方便的是這兩個套件在安裝光碟裡面就有。
# rpm –ivh bridge-utils-*

緊接著將eth0與eth1 bind成bri0 interface.

# ifconfig eth0 0.0.0.0
# ifconfig eth1 0.0.0.0
# brctl addbr bri0
# brctl addif bri0 eth0
# brctl addif bri0 eth1

執行brctl show確認一下:
# brctl show
bridge name bridge id STP enabled interfaces
bri0 8000.00034730c5b3 no eth0
eth1

好了問題來了,既然bri0 interface已經建置好了,那麼是否可以在上面設定IP呢?答案當然是可以的囉~不然怎麼remote control它呢? 至於設定的方法有兩種,一種是設定Static IP,另一種是透過DHCP Server get到IP,以下是設定的方法:
Static IP:
# ifconfig bri0 192.168.1.1 netmask 255.255.255.0 up
DHCP Client:
# dhclient bri0

以上的所有動作您可以把它寫成一個shell script file,並讓它在開機時自動執行,以RHEL的話是放在/etc/rc.local,順便一提SLES是/etc/init.d/boot.local

2. Allow IP forwarding

# vi /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
#sysctl –p

請測試一下,目前Server與Client的網路是相通的。

3. 設定Policy

重頭戲來了,如何設定Policy? 一般來說Linux firewall的設定是透過iptables,iptables預設分為3個table,5個chain,我要把rule設定在那個table及那個chain是一開始該有的認知。先提醒一個觀念,iptables比對的順序為mangle->nat->filter,這是什麼意思?事實上mangle,nat與filter就是預設的三個table,若前面的規則是allow,到了後面的table卻是deny的話,那就是deny! 反之若前面是deny而後面是allow的話,那就是allow! 這是套用於不同table時,規則相互抵觸時的法則,想一想有沒有可能在相同的chain中,設定相互抵觸的規則?當然是有可能的囉!這時是first match! 當hit到規則後,則不在進行比對,這點請特別注意!

可以確定的是,利用filter table就可以設定我們的policy,接下來考慮一下要設定在那個chain? INPUT OUTPUT FORWARD? 答案是 FORWARD,別忘了!它是個Bridge裝置,封包當然是透過eth0到eth1或是eth1到eth0囉!

為了最高安全指導原則,首先要把 FORWARD default policy設定為DROP,只放行SMB protocol與icmp echo request.

# iptables –P FORWARD DROP

測試一下 Server與Client目前應該是完全不通!

設定允許n個封包之後的連線:

# iptables –A FORWARD –m state –state RELATED,ESTABLISHED –j ACCEPT

設定允許icmp echo request:

# iptables –A FORWARD –s 192.168.1.0/24 –p icmp –icmp-type 8 –j ACCEPT

設定只有Server可以透過網芳將檔案傳送到Client:

# iptables –A FORWARD –s 192.168.1.100/32 –d 192.168.1.200/32 –p tcp –dport 139 –j ACCEPT

# iptables –A FORWARD –s 192.168.1.100/32 –d 192.168.1.200/32 –p tcp –dport 445 –j ACCEPT

這樣一來便可達到我們的需求!
歡迎轉載,不過請註明出處唷~ ^^

筆者簡介:
Lawrence Chiu – 已取得RHCE與NCLP認證,曾任職於D-Link testing engineer負責資安產品的測試,現任職於TrendMicro Anti-Spam Lab administrator。

利用Linux架設Transparent Firewall

前幾天帽客利用一台PIII的機器,安裝好Linux後並設定成透通式防火牆,架設在公司網路裡面使用,在不想改變現有的環境下,而又想阻擋某些對外連線時,這是一個好方法,經過這幾天的觀察,發覺還挺穩的,因為網路流量挺大的,還在擔心這台老機器會不會撐不住,呵~ 果然是我想太多了! Linux就是棒呀! 就算是老機器給它灌上Linux也能有第二春!

Tuesday, December 19, 2006

設定DHCP Server只由某張網卡分配出去

是的,帽客在家及在公司都已經有架設起一台NAT Server以供測試,下一個問題當然是架設起DHCP Server的服務,但總不能讓它兩張網卡都分配出去IP吧! 如果我要限定只從某個網卡分配出去呢? 該怎麼辦? 問了問Google大神,果然找到的解決的方法,以下是Redhat說明:

- 開啟 /etc/init.d/dhcpd
- 找到 daemon /usr/sbin/dhcpd ${DHCPDARGS} 2>/dev/null 修改為 daemon /usr/sbin/dhcpd eth1 ${DHCPDARGS} 2>/dev/null
- # service dhcpd start; chkconfig dhcpd on

這麼一來DHCP Server就只會從eth1分配IP出去!
至於SLES10,很簡單的囉~ 使用yast2來設定就好了,這裡就不多加詳述了.

Monday, December 18, 2006

Linux iptables SNAT+DNAT+FTP passive mode

帽客今天在SLES10下實現了SNAT與DNAT的環境,這台SLES10當成NAT Server負責內部IP連線到Internet上,並在內部網路架設一台FTP Server,讓Internet上的機器可以存取到它,也就是所謂的DNAT, 實作的方法跟Redhat有一點不同,但觀念是一樣的,讓帽客整理一下吧!

如果有需要這篇文章的朋友,請與我連繫. =)

Thursday, December 14, 2006

帽客的iptables設定- 單機篇

以下是帽客常用的配置方式:
# Generated by iptables-save v1.2.11 on Tue Dec 12 23:24:06 2006
*filter
:INPUT DROP [1032:90974]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1758:160527]
:BADPKT - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 127.0.0.0/255.0.0.0 -i ! lo -j DROP
-A INPUT -m state --state INVALID -j BADPKT
-A INPUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j BADPKT
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -m state --state NEW -j ACCEPT
-A INPUT -j LOG --log-prefix "** Firewall INPUT DROP **"
-A BADPKT -j DROP
COMMIT
# Completed on Tue Dec 12 23:24:06 2006

解說:
Create一個新chain名為BADPKT,預設動作為DROP
-A INPUT -i lo -j ACCEPT -> 對於loopback interface的封包是接受的
-A INPUT -s 127.0.0.0/255.0.0.0 -i ! lo -j DROP -> 對於127.0.0.1的IP位址,來源的介面必需為loopback,否則DROP
-A INPUT -m state --state INVALID -j BADPKT -> 封包狀態若不正常予以DROP
-A INPUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j BADPKT -> 對於tcp的第一個封包必需是SYN,否則DROP
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j ACCEPT -> 允許ssh的連線請求,最好加上 -s參數限定那個IP or subnet才可連線
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -> 允許本機第n個封包(自己發出去的嘛! 當然對之後的封包也要允許呀!)
-A INPUT -j LOG --log-prefix "** Firewall INPUT DROP **" -> 將iptables log記錄到/var/log/messages
-A BADPKT -j DROP -> BADPKT預設的policy

Tuesday, December 12, 2006

Install VMware Server on SLES10

Extra packages needed:
xorg-x11-libs
gcc
kernel-source

之後用rpm安裝,並執行vmware-config.pl,
一步一步配置VMware Server的環境.




Thursday, December 07, 2006

帽客桌面


好久沒秀一下帽客的桌面了,就給它秀一下吧! ^_^
這張是FFIII裡的赤魔導吧?! FFIII大概是我國中時代吧......唉~ 沒想到我已經要當爸爸了 @@

PS FFIII 同時也是帽客第一次接觸到的RPG類型遊戲.

關閉SLES10的firewall

在安裝SLES10時,不小心設定預設啟動firewall的功能,確又不太了解firewall setting (iptables)的朋友,可以利用以下的方法將其關閉

# rcSuSEfirewall2 stop -> 目前關閉,但當系統重新開機後,還是啟動
# chkconfig SuSEfirewall2_setup off
# chkconfig SuSEfirewall2_init off -> 以上兩行設定系統啟動時,不啟動firewall

如果對照到Redhat是這樣子的:

# service iptables stop -> 目前關閉,但當系統重新開機後,還是啟動
# chkconfig iptables off -> 設定系統啟動時,不啟動firewall

Monday, December 04, 2006

Shell Script: 確定user目前是否登入系統

Filename: finduser

#!/bin/bash

if [ $# -ne 1 ]; then
echo "usage: finduser username"
else
who | grep "$1"
fi

有趣的語法

somecmd && {
cmd1
cmd2
cmd3
}

這樣可能看不太懂吧!如果改成這樣呢?

test -f /etc/issue && {
cat /etc/issue
}

如果還不能了解的話,請往下看:

if [ -f /etc/issue ]; then
cat /etc/issue
fi

有趣吧 =)