2008-05-27

不錯的iptables limit 參數備忘

原文:Jamyy's Weblog: iptables limit 參數備忘

2006年03月17日

iptables limit 參數備忘

  • 限制特定封包傳入速度
  • 限制特定埠口連入頻率
  • iptables Log 記錄參數備忘
  • 自定 Chain 使用備忘
  • 防治 SYN-Flood 碎片攻擊

限制 ping (echo-request) 傳入的速度

限制前, 可正常每 0.2 秒 ping 一次

ping your.linux.ip -i 0.2

限制每秒只接受一個 icmp echo-request 封包

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

--limit 1/s 表示每秒一次; 1/m 則為每分鐘一次

--limit-burst 表示允許觸發 limit 限制的最大次數 (預設 5)

再以每 0.2 秒 ping 一次, 得到的回應是每秒一次

ping your.linux.ip -i 0.2

限制 ssh 連入頻率

建立自訂 Chain, 限制 tcp 連線每分鐘一次, 超過者觸發 Log 記錄 (記錄在 /var/log/messages)

iptables -N ratelimit
iptables -A ratelimit -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A ratelimit -p tcp --syn -m limit --limit 1/m --limit-burst 1 -j ACCEPT
iptables -A ratelimit -p tcp -j LOG --log-level "NOTICE" --log-prefix "[RATELIMIT]"
iptables -A ratelimit -p tcp -j DROP

引用自訂 Chain, 限制 ssh (tcp port 22) 連入頻率

iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/16 -j ACCEPT (特定 IP 來源不受限制)
iptables -A INPUT -p tcp --dport 22 -j ratelimit

參考資料: Mike's Blog - How to limit attack attempts in Linux

sshd_config 設定備忘:

  • LoginGraceTime 30 密碼輸入時限為 30 秒
  • MaxAuthTries 2 最多只能輸入 3 次密碼

同理可證

iptables -N pinglimit
iptables -A pinglimit -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A pinglimit -j DROP

iptables -A INPUT -p icmp --icmp-type echo-request -j pinglimit

亦可達到每秒只接受一個 echo-request 封包

補充: 清除自訂 Chain

iptables -L -n --line-number
iptables -D INPUT n
iptables -F ratelimit
iptables -X ratelimit

防治 SYN-Flood 碎片攻擊

iptables -N syn-flood
iptables -A syn-flood -m limit --limit 100/s --limit-burst 150 -j RETURN
iptables -A syn-flood -j DROP

iptables -I INPUT -j syn-flood

模擬攻擊

wget http://www.xfocus.net/tools/200102/naptha-1.1.tgz
wget ftp://rpmfind.net/linux/freshrpms/redhat/7.0/libnet/libnet-1.0.1b-1.src.rpm
tar -zxf naptha-1.1.tgz
rpmbuild --recompile libnet-1.0.1b-1.src.rpm
cp -r /var/tmp/libnet-buildroot/usr/* /usr/local/
cd naptha-1.1
make

./synsend your.linux.host.ip 80 local.host.eth0.ip 0.1

若成功抵擋, 不久後會出現 Can't send packet!: Operation not permitted 的訊息

ping不到127.0.0.1

主要是 lo 設備的問題
可以試著
ifconfig lo 127.0.0.1

盜連防止

參考:【求助】Bot - 第2頁 - WordPress歡樂正體中文交流所
參考:http://blog.ijliao.info/archives/2006/05/30/2318/

2008-05-16

shell script(BASH)的使用注意事項

Author:kawsing 2004/03/06

觀念
執行script時,預設使用子shell,若要在原shell執行,要使用
.
script檔 或 source script檔
子shell會繼承父shell的環境變數,不會繼承父shell的變數


設定變數
變數=變數值


設定環境變數
變數=變數值;export 變數
export
變數=變數值
declare -x 變數=變數值


取用變數
一般
$變數
周圍有字
abc${變數}def



清空變數
1.變數=
2.unset 變數(函數)


設定陣列
直接指定
a[0]=1
a[1]=2
a[2]=3
函數指定
a=(1
2 3)
以字串為索引
a["bash"]="字串索引"


取用陣列元素
${a[0]}
${a["bash"]}


一組的命令
開子shell
(command1;command2;command3;...)
原shell執行
{
command1;command2;command3;... }
***{}的左右要有空白***


連續的命令
command1;command2;command3==>連續執行命令
command1
&& command2 && command3==>一個命令成功才執行下一個
command1
command2 command3==>一個命令不成功才執行下一個


一些特殊字元
\b 後退

\f 跳頁

\n 換行字元

\r return

\t TAB


進階的變數設定
result=${str:-value}
str=非空
result=str
str=
result=value


result=${str:=value}
str=
result=value同時str=value


result=${str:?msg}
str=非空
result=str
str=
顯示錯誤訊息msg


result=${str:+value}
str=非空
result=value
str=
不做取代


截取變數
r="/usr/local/bin/sftp"
path=${r##*/}
path=sftp


path=${r#*/}
path=usr/local/bin/sftp


path=${r%%/*}
path=


path=${r%/*}
path=/usr/local/bin


eval兩次掃描命令
n="兩次代換變數"





str=$n
eval echo \$$str
顯示-->兩次代換變數


一些觀念
cat < text==>將鍵盤輸入改由text檔案提供
cat
text==>顯示text檔案內容
[ab]==>ab任一字元
[!ab]==>非a非b的其他任一字元,注意,在正規表示式中,以^表非,[^A-Z]表非大寫字母
`命令`=$(命令)==>執行命令(命令代換)
back
slash(\)==>跳脫符號
$?==>用來存判斷後的傳回值,0是真,非0是假


正規表示式(Regular Expressions)
意義:一種描述,表示某種樣式某些樣式的組合
樣式寫法:
.==>任一字元
\==>跳脫字元
^==>表一列的開頭
$==>表一列的結尾
*==>任何字元
[]==>[abc]表a或b或c
\{
\}==>指定保留的個數
\( \)==>保留符合的部分
\1==>位置參數


sed指令
格式:sed '樣式' 檔案
意義:一種非交談式串流編輯語言
//在sed中表示搜尋
例子:
sed
'1,4d' file
sed '/[0-9]\{3\}/d' file==>把含有3個數字的列刪除
sed '/^$/d'
file
sed '/abc/p' file==>將有abc的列顯示出,但不符合的也會顯示
sed -n
'/abc/p' file==>將有abc的列顯示出,但不符合的不會顯示(-n 不秀出全部)
sed
-n 's/abc/def/p' file==>將有abc的列取代成def,並只會取代一列
sed -n 's/abc/def/gp'
file==>將有abc的列全部取代成def(g是全部)
sed -n 's/abc//p' file==>將有abc的列的abc刪除
sed
-n 's/^...//' file==>將每列的開頭三個字元去掉
sed -n 's/...$//' file==>將每列的結尾三個字元去掉
sed
-n 's/\(abc\)/\1def/p' file==>把\(abc\)保留在\1中,並作取代
sed -n '/AAA/s/abc/def/p'
file==>搜尋有AAA的列,將其中的abc取代成def
sed -n '/AAA/,/DDD/s/abc/def/p'
file==>搜尋有AAA直到DDD的列,將其中的abc取代成def
sed -n '2,5s/abc/def/p'
file==>取代2-5列


awk指令
格式:awk '樣式' file==>顯示符合樣式的列
awk
'{動作}' file==>對每一列執行{}中的動作
awk
'樣式{動作}' file==>符合樣式的列執行{}中的動作
意義:此指令用於處理資料並產生報告
例子:
awk
'/abc/' file
awk '{ print $1,$2 }' file
awk '/abc/{ print $1,$2 }' file
awk
-F: '/kawsing/{ print $1,$3,$5 }' /etc/passwd(-F 指定分隔符號)
awk -F: 'BEGIN{
OFS="+++" }/kawsing/{ print $1,$3,$5 }' /etc/passwd(BEGIN指定開始的動作,OFS設定分隔符號)


算數運算
m=4+5
echo $m的結果顯示4+5,視為字串
所以,在Bash shell中使用算數運算,要一下面四種方法進行:



  1. expr(外部指令)
    m=`expr 4 + 5`
    m=`expr 4 \* 5`
    m=`expr
    $m + 1`
    不能運算乘冪羽求餘數(%)

  2. $(())
    m=$(( 4 ** 5 ))==>4的5次方
    m=$(( $m + 1 ))
    m=$(( 5
    % 4 ))

  3. $[]
    m=$[ 4 \* 5 ]
    m=$[ 4 ** 5 ]
    m=$[ m + 1 ]

  4. let(內建指令)
    let m=m+1(注意與上面的不同處,無空白$跳脫)
    let
    m=4+5
    let m=4**5


位置參數
Bash shell可以傳遞參數,使用位置參數
$0==>script檔案本身
$1~$9==>檔案的9個參數
$10==>$1加上0,$1是A,則$10就是A0
$#==>參數總數
$*==>所有參數,但"$*"="ABCDEFGHI"
$@==>所有參數,但"$@"="A"
"B" "C" "D" "E" "F" "G"
"H" "I"
shift==>向左移動參數
set==>重設參數,set
a b c d將參數重設為$1=a,$2=b...


運算子(operator)
數字判斷
-eq
-ne
-ge
-le
-gt
-lt
((
"3" > "2"))==>可用><=比較數字
字串判斷
=與==
string1與string2相同
> string1排序大於string2==>[
"string1" \> "string2" ] \>去掉>的特殊意義
<
!=
-n
string長度不為0
-z string長度為0,即空字串
邏輯判斷
-a==>且
-o==>或
!==>非
檔案判斷
-a
檔案存在
-b 檔案存在且是block檔
-c 檔案存在且是character檔
-d 檔案存在且是目錄
-e
檔案存在
-f 檔案存在且是正規檔
-g 檔案存在且是set-gid
-h 檔案存在且是符號連結檔
-k
檔案存在且sticky位元已設定
-p 檔案存在且是FIFO
-r 檔案存在且可讀
-s
檔案存在且大小大於0
-t fd 檔案代碼 fd 已開啟且連接到一個終端機
-u 檔案存在且uid位元已設定
-w
檔案存在且可寫
-x 檔案存在且可執行
-O 檔案存在且被有效的使用者id所擁有
-G
檔案存在且被有效的群組id所擁有
-L 檔案存在且是符號連結檔
-S 檔案存在且是socket
-N
檔案存在且自它上次被讀取之後已被修改過
-nt newer than
-ot older than
-ef
有相同的設備和 inode 編號


流程控制
選擇結構
if
[ 條件式 ]; then
command...
elif [ 條件式 ];then
command...
else
command...
fi


case 變數 in
s1)command...
;;
s2)command...
;;
s3)command...
;;
*)command...
esac


重複結構--迴圈
for:
(1)
for 變數 in
範圍
do
command...
done
(2)
for (( i=0; i<5; i++ ))
do
command...
sleep
sec==>可延遲sec秒後執行下一迴圈
done


while [ 條件式(真) ];then
do
command...
done


until [ 條件式(假) ]; then
do
command...
done


函式
function func(){
command...
}
function
func{}
func(){}
執行函式
func



函式傳遞參數
function func(){
echo $1
}
func
"hello"==>此hello就是$1
函式內部有使用其它變數,您不想讓此變數和外界相同的變數相互影響,可使用 local 這個關鍵字來宣告它
function
localvar(){
local A
local B
}
A="haha"
B=35
變數同名但不相干


select選單
select 變數 in *; do
if
[ -z $變數值 ]; then
break
fi
echo
"你選擇$變數值(you choose $REPLY)"
done



原始來源:shell script(BASH)的使用注意事項

Linux 基本指令

Linux 基本指令

Flashplay10的一些demo



請看:http://labs.adobe.com/technologies/flashplayer10/demos/

文件上傳成敗關鍵的幾點php.ini配置

php.ini裡
查找 max_execution_time默認是30秒.改為
max_execution_time = 0

0表示沒有限制另一種方法是可以在php程序中加入set_time_limit();

改 post_max_size 設定 POST 數據所允許的最大大小。此設定也影響到文件上傳。php默認的post_max_size 為2M.如果 POST 數據尺寸大於 post_max_size $_POST 和 $_FILES superglobals 便會為空.
改為
post_max_size = 150M


3. 還要改一個參數upload_max_filesize 表示所上傳的文件的最大大小。
為8M
改為
upload_max_filesize = 100M


ps:聽說post_max_size 大於 upload_max_filesize 為佳.

參考連結:文件上傳成敗關鍵的幾點php.ini配置_見證我的成長_PHPChina 開源社區門戶 - powered b

2008-05-14

shell - 用date获得前一天的日期 - Shell - Linux教程

shell - 用date获得前一天的日期 - Shell - Linux教程

[Linux]取得每月最後一天的Shell Script

[Linux]取得每月最後一天的Shell Script

linux環境變數設定檔預設值

全體使用者環境變數設定:(只有 root 可以修改)
全體使用者環境變數設定檔位於 /etc/profile


個人環境變數設定:(開放使用者可自行修改)
個人環境變數設定,顧名思義這是使用者自行更改環境變數的方法,系統管理者無須偏勞。 習慣上每一個使用者的家目錄都不會一樣,習慣上都應該位於 /home 下面,以 test 這個使用者為例, test 的家目錄習慣上應該位於 /home/test 。每一個使用者家目錄下應該都會有個 隱藏的檔案 ~/.bashrc,請 「ls -la ~/」。而這個檔案就是個人的「個人環境變數設定檔」, 設定作法同「全體使用者環境變數設定檔」 一樣都是直接編輯該檔案


參考連結:撰寫環境變數設定檔

2008-05-13

ADSL(PPPOE)接入指南

ADSL(PPPOE)接入指南

apt-get 的更新套件

su -
#先將自己的身份變成 root
apt-get update;apt-get dist-upgrade
#開始更新軟體

參考連結:套件更新
參考連結2:修改 Ubuntu 8.04 的 sources.list 成台灣的主機

Linux 多個ADSL 合併方式

配置多個ADSL 

運行adsl-setup程序,會一步一步的提示你完成配置過程.

創建ppp0

(1)直接拷貝
cp /etc/sysconfig/network-scripts/ifcfg-ppp0 /etc/sysconfig/network-scripts/ifcfg-ppp1

(2)修改其中的ppp0為ppp1,

修改PIDFILE=/var/run/pppoe-adsl.pid 為PIDFILE=/var/run/pppoe-adsl1.pid
修改採用的新接線路的網卡,例如:改ETH=eth1 為ETH=eth2


(3)增加新線路的帳號和密碼. 帳號密碼一般是保存在/etc/ppp/chap-secrets 和pap-secrets

我們只需要在最後增加新的用戶名2和密碼2即可.


啟動多個ppp

因為adsl-start 命令缺省只能啟動第一的ppp接口。所以要啟動兩個接口,必須指定配置文件。

可以用:
方法一:
ifup ppp0
ifup ppp1
(ifup pppn...)

或方法二:

adsl-start /etc/sysconfig/network-scripts/ifcfg-ppp0
adsl-start /etc/sysconfig/network-scripts/ifcfg-ppp1
(adsl-start /etc/sysconfig/network-scripts/ifcfg-pppn)

在 /etc/rc.local 後面增加:

ifup ppp0

ifup ppp1

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o ppp1 -j MASQUERADE

ip route replace default scope global nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1

ip route flush cache





參考連結:寂雨(&$^#@*!~)|在Linux下配置多線路ADSL的方法


另一個方法:【轉】雙adsl鏈路冗餘互備及流量分擔的實現

Linux 的 BONDING 可以用來合併頻寬

Linux 的 BONDING 可以用來合併頻寬
參考連結:|聯成電子報 第十一期 2006年07月|講師專欄 Linux

2008-05-12

擴充 yum 的內含

擴充 yum 的內含
yum內含套件只有基本必要套件而已 (如. proftpd...就不在yum中),所以我們可以透過設定 [RPMforge] 來增加套件數量。
執行安裝 [RPMforge] 套件
#rpm -Uhv
http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm




參考連結:Weithenn Study Daily: CentOS 5.1-初始環境設定:

iptables -L -vn

iptables -L -vn
"-L" 參數列出鏈中的規則, 因為沒有指定鏈名, 所以預設列出 filter 鏈的規則
"-v" 參數將顯示完整的資訊, 以便觀察傳輸量統計的狀況, 一般不使用"-v "參數時, 只會顯示如來源位址等簡要的資訊
"-n" 參數設定 iptables 不要將 IP 反查為網域名稱



原始連結:旗標知識網:如何使用 iptables 統計傳輸量

knownhost 的 vps 如何使用 port 轉向

將 port:8080 轉到 port:10000
在knownhost 的vps 測試多次,底下的用法才能使用
iptables -t nat -A PREROUTING -p tcp -i venet0 --dport 8080 -j DNAT --to-destination 67.222.10.12(實體ip):10000
以下用法,是失敗的
iptables -t nat -A PREROUTING -p tcp -i venet0 --dport 8080 -j DNAT --to-destination 0.0.0.0:10000
iptables -t nat -A PREROUTING -p tcp -i venet0 --dport 8080 -j DNAT --to-destination 127.0.0.1:10000



參考連結:IPTABLES: DNAT port 1433 - LinuxQuestions.org

vps的iptable如何使用venet0:0

在 linux 的 venet0:0 是模擬出來的。

if venet0:0 is 192.168.1.1
change:
/sbin/iptables -A OUTPUT -o venet0:0 -m state --state NEW -j ACCEPT
to:
/sbin/iptables -A OUTPUT -o venet0 -s 192.168.1.1 -m state --state NEW -j ACCEPT


原文連結:Iptables error: weird character in interface `venet0:0' - VPSlink Forums

2008-05-09

如何在godaddy的name server 中使用自已的ip

主要在 host Summary 加入 ip ,然後在 Name Servers 中 加入 Summary 中的 domain ,就可以了

原文:
You are not required to register hosts, but if you intend to set up your own Domain Name Server (DNS) service, you can register your own hosts.
WARNING: Unless you have a thorough understanding of this process, we recommend that you do not use this feature.
To Register Your Own Hosts
Log in to your Account Manager.
In the My Products section, click Manage Domains.
Click the domain for which you want to create a host.
In the Host Summary area at the bottom of the page, click the add hyperlink in the header.
In the Host Name field, enter the host name you want to register.
NOTE: Do not enter "www" as your host name.
In the Host IP fields, enter the IP address(es) you want to add to the host.
Click OK.
It takes 4 to 8 hours to register hosts for .COM and .NET domains and 24 to 48 hours for all other domain extensions.

原文連結 >>Registering Your Own Nameservers - Help Center—Knowledge Base and FAQ