#!/bin/sh
h<3z| n7
################### build by byte for mss firewall ##############
3}wl8) {
###################### 2005.09.20 #########################
ru5z <)|
######################
[email protected] ####################
y`udeg3w4
hpdnjs7@a
path=$path:/bin:/sbin:/usr/bin:/usr/sbin
^q?jd$m
rw&7t&ro_
iptables=/sbin/iptables
<+w/ (~
ej1ohl:3~
internal="eth0" 定义了一个internat 等于eth0 也就是说对internat的操作都是对eth0的操作,希望大家可以明白
<x new lk
log_level="notice" 日志、等于notice
jih:p&^lj
prinet="`ip addr show eth0 | awk '/inet /{print $2}'`" 看起来有点复杂呵呵。我这快要说明一下吧awk在shell下是一个功能强大的语句了。
7|ruov~u;
也可以说是一总语言脚本是这么写的,其实就是显示eth0的ip地址。他没有直接写ip,真的很阴险的其实可以这么写prinet=ip地址就完了。他何必呢。
1jtg1 ,;>
ip addr show eth0 | awk '/inet /{print $2}我这么写也一样在shell下打。但是在脚本里面不能这么体现,必须以上述体现出来。
ie.&<iu&a
izjoy3n
dns_serv="`sed -n '1p' /etc/resolv.c | awk '{print $2}'`" 又来了sed 按顺序逐行将文件读入到内存中,他这里就是在说我的dns写的是什么。
>lqt>]h
?l}i7t!8
echo "1" > /proc/sys/net/ipv4/ip_forward ip转发
i6!jdm'
f_s;em,1f
modprobe iptable_filter 加载内核模块
dr~t
modprobe ip_tables
o@eks
modprobe ip_conntrack
6>:975p#
modprobe ip_conntrack_ftp
u`4$ k'
modprobe ip_conntrack_irc
uj]fr "
modprobe iptable_nat
veo]d97 a
modprobe ipt_limit
a8jsd0{h(
modprobe ipt_masquerade
h;$[;2
modprobe ip_nat_ftp
jkz59hjfy
modprobe ip_nat_irc
!]6uc
xly > q
$iptables -f 防火墙规则了,大家都可以看明白
b5>pdi2;
$iptables -f -t nat
thy @{+_w
$iptables -f -t mangle
({-n66
$iptables -x
9ha"?mg/
$iptables -x -t nat
9 jx8d
$iptables -x -t mangle
g4}g,o |
|<( i {l:
$iptables -p input drop 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式
=ck 2 z
$iptables -p forward accept
mnj l!"
$iptables -p output accept
e?c62
n1ve@v4!}
###### define check_flags chain ######
41:dlp
$iptables -n check_flags 新建一个check_flags 规则对这个规则来指定
"1qm;q1
$iptables -f check_flags 清楚连中的规则上的让他是无设防状态
dm!u3$i"ld
xyt>u%n
#nmap fin/urg/psh tcp的标志 结束/紧急/强迫推送 说一下,他们的组合请看好不是什么好想象。意见drop掉。
:f:=}]
#$iptables -a check_flags -p tcp --tcp-flags all fin,urg,psh -m limit --limit 5/minute -j log --log-level $log_level --log-prefix "nmap-xmas:"
h^%u'=a9
注释在 check_flags 添加一个tcp的旗帜。 -m limit 速率匹配 指定单位时间内允许通过的数据包个数。-j 转到日志上了$log_level 就是我刚才那个了,
'p z>|> [
感觉他这里应该把--limit-burst 加上效果更好。呵呵
cxbwgp
--log-prefix "nmap-xmas:" 日志存放的路径。
>p%ir8fz
下面就是就开始了。让结束/紧急/强迫推送 都drop掉。安全了。送口气。
57~9zk %d
$iptables -a check_flags -p tcp --tcp-flags all fin,urg,psh -j drop
itv!;q7a]
xq"r{g#
#syn/rst 同步/重设在一起也没有啥好事。下面同上
jdd)}>tq"
#$iptables -a check_flags -p tcp --tcp-flags syn,rst syn,rst -m limit --limit 5/minute -j log --log-level $log_level --log-prefix "syn/rst:"
l vram9
$iptables -a check_flags -p tcp --tcp-flags syn,rst syn,rst -j drop
2 +vtq6
%1kskc
#syn/fin 同步/结束 一样drop掉了
t(gq=nfo`
#$iptables -a check_flags -p tcp --tcp-flags syn,fin syn,fin -m limit --limit 5/minute -j log --log-level $log_level --log-prefix "syn/fin:"
r"pw$ig/
$iptables -a check_flags -p tcp --tcp-flags syn,fin syn,fin -j drop
biwdi*1*
[%-4lrr
#fin/rst 结束/重设 干掉
1ko'obsr
#$iptables -a check_flags -p tcp --tcp-flags fin,rst fin,rst -m limit --limit 5/minute -j log --log-level $log_level --log-prefix "fin/rst:"
=jr4~5.w
$iptables -a check_flags -p tcp --tcp-flags fin,rst fin,rst -j drop
-ikj~
ma e7crs%
#all/none 所有的无效的连接都卡卡。
s*syo>3d
#$iptables -a check_flags -p tcp --tcp-flags all none -m limit --limit 5/minute -j log --log-level $log_level --log-prefix "all/none:"
?xmqyb
$iptables -a check_flags -p tcp --tcp-flags all none -j drop
)esj^w!p
######################################
c lidc+
;~/<h)uo)
###### define keep_state chain ###### 定义一个keep_state链
`! o<{
$iptables -n keep_state 先的创建
3r@dd#pr
$iptables -f keep_state 清楚连中的规则上的让他是无设防状态
0vk(`yu?g
$iptables -a keep_state -m state --state related,established -j accept 机于状态匹配了开始了。related以建立的连接和以连接这的都通过
prr'hi:y
#####################################
(:v-xn0
u:,"o|a7@
oaaje]ho
###### define allow_ports_tcp ##############
z|a.o?sx
$iptables -n allow_ports_tcp
jg-[r
$iptables -f allow_ports_tcp 这快用到。burst默认是5 用来比对瞬间大量数据包的数量 他写的就是如果瞬间来的包超过10个就丢弃了
dpzo;dnp
$iptables -a allow_ports_tcp -m limit --limit 10/m --limit-burst 10 -p tcp --tcp-flags all rst -j accept
'pguzo
$iptables -a allow_ports_tcp -m limit --limit 10/m --limit-burst 10 -p tcp --tcp-flags all fin -j accept
elk sx
$iptables -a allow_ports_tcp -m limit --limit 10/m --limit-burst 10 -p tcp --tcp-flags all syn -j accept
bdn^` c*
allow_ports_tcp 在10秒钟内同时有10个数据包通过就drop 要是不到10个就接受 重设 结束 同步
inc=l0/ l
######################################
dfa6:k/ak
gmfzu}
$iptables -a input -p all -i lo -j accept input链上回环通过
~]n&-goy
$iptables -a input -p 47 -j accept 让ni-ftp 通过我不太清楚通过干啥。可能是他的电影服务器与我的电影服务器通讯用的。
6ch`gee.l
$iptables -a input -f -m limit --limit 10/s --limit-burst 10 -j accept -f啥意思我是不明白。我找了很多资料man iptables 都找过了查无结果。
a(g;b9mk
$iptables -a input -p icmp -m limit --limit 100/s --limit-burst 100 -j accept 这就定义icmp的了
lytk |&
$:tz&
$iptables -a input -p tcp --sport 53 -j accept dns 53端口的tcp udp协议都通过
a 4~tot
$iptables -a input -p udp --sport 53 -j accept
:^sew <
mkb{!rh
$iptables -a input -i $internal -p tcp -d $prinet --dport 3366 -j drop 这句话矛盾大家请看 $internal=eth0 $prinet echo出来的也是eth0到目标3366都拒绝。
tn9zfr
$iptables -a input -i $internal -p tcp -j check_flags eth0通过tcp协议近来的都转到check_flags处理 网络中差找3366没有明确说明。
mks9,hl@jk
$iptables -a input -i $internal -p all -j accept
^[gydyd
ej28lb6
y3rwgi]~
$iptables -a input -i ! $internal -j keep_state !就是说出了什么以为这里就是出了eth0以外的端口都转到。keep_state处理
_ [m,
$iptables -a input -i ! $internal -p tcp -j check_flags 同意了就是
'e(:c$av
$iptables -a input -i ! $internal -p tcp --dport 22 -j allow_ports_tcp
3nzn;*p
$iptables -a input -i ! $internal -p tcp --dport 3366 -j allow_ports_tcp
( a(gg6j
)r:?xqi
#added by byte for adv_acl rule
!dr!h,eg>
if [ -s /etc/mss/mss_adv_acl ] if条件[-s文件名/etc/mss/mss_adv_acl ]
t|[skodp
then
nx[9a+e
while read dir pro src src_port dst dst_port rule memo 循环读取dir pro src src_port dst dst_port rule memo
o x2
do
6s#lt~5e}
if [ "$dir" = "l-w" ] if条件如果环境变量dir = l - w 的时候执行下面操作
1o>ms3*)
then pro、src、dst、dst_port这几个环境变量在php取值最后转到变量rule处理。。
et8[ggz
$iptables -a forward -p $pro -i $internal -s $src --sport $src_port -d $dst --dport $dst_port -j $rule
^a+o 9
fi
y".v}<`f
if [ "$dir" = "w-l" ] if条件如果环境变量dir = w - l的时候执行下面操作
8()?ein
r xb@l
then pro、src、dst、dst_port这几个环境变量在php取值最后转到变量rule处理
r>[bruo5
$iptables -a forward -p $pro -i ! $internal -s $src --sport $src_port -d $dst --dport $dst_port -j $rule
`k8'z!
fi
6';![db
d < /etc/mss/mss_adv_acl 将得到的值直接写到mss_adv_acl 里面,呵呵就是这样。大家可以自己测试,这条语句是控制php里面的那个脚本
[{`1q tzg
fi
bih%m oyfu
}:~ycc.u#
$iptables -a forward -p tcp --tcp-flags syn,rst syn -j tcpmss --clamp-mss-to-pmtutcpmss
|s[}y>
--clamp-mss-to-pmtu 对包的一总处理方式。细节请查看man iptables
b@~h^ 4o
()qc#q<r
vpqztnckw
e&6+r&
p:sl kr]8
#added by byte for acl outside rule
v&zd]* 8e
if [ -s /etc/mss/mss_acl_out ] if条件[-s文件名/etc/mss/mss_acl_out ]
qg@/ 6m'
%e=54ue4
then
&=s-cy*/,
acl_loop=0 acl_loop=0不说啥了。下面就是判断了
gd5@90
while read rule 又开始循环来读rule表
hfmmlq^r
do
ue@x;xl
if [ $acl_loop -eq 0 ] && [ $rule = "yes" ]
lebs8yx)/e
等于0为真 && rule等于yes
8o^a!6o>y
运算对象1 运算对象2 运算对象1&&运算对象
c<pgq(d`
0 0 0
?byu7tq{
1 0 0
cw|lpi
0 1 0
1ie(]}p&
1 1 1
poqzh@m
,[^f)f+|
then
z;[i0{
$iptables -t nat -a prerouting -i $internal -p tcp --dport 25 -j drop 封锁25端口
y78j: x2.
fi
xlj*sux;
if [ $acl_loop -eq 1 ] && [ $rule = "yes" ]
,0`##?}.5
then
nuif5f(jb
$iptables -a input -i ! $internal -p tcp --dport 80 -j accept 对外开放80端口
)m-isg@bz
fi
d"^}m{%
if [ $acl_loop -eq 2 ] && [ $rule = "yes" ] 对外开放cs1.5
z9; ewv4
then
4j&a$8uo
$iptables -a input -i ! $internal -p udp --dport 27015 -j accept
( ^ h^nv
fi
dbp:<at8
if [ $acl_loop -eq 3 ] && [ $rule = "yes" ] 对外开放cs1.6
xxi"l895
then
3)ee,
$iptables -a input -i ! $internal -p udp --dport 27016 -j accept
ev
fi
2oaf>e )
if [ $acl_loop -eq 4 ] && [ $rule = "yes" ]
zhowk8m
then #防止syn flood攻击. echo "1" > /proc/sys/net/ipv4/tcp_syncookies
*(a3(<
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
8 w7t0 wa
else 这个就是不启动ddos防护。呵呵
y7*o 5_xk
echo "0" > /proc/sys/net/ipv4/tcp_syncookies
)4?+s7>px
fi
pjjamtw
if [ $acl_loop -eq 5 ] && [ $rule = "no" ] 这句其实就是关闭了一个www的缓存到80的都转直3128端口
o?4p|a:8zj
then
{_wzc#2=u
$iptables -t nat -a prerouting -i $internal -p tcp --dport 80 -d ! $prinet -j redirect --to-port 3128
yf;@){}bqc
fi
ija-q*&oi
if [ $acl_loop -eq 5 ] && [ $rule = "yes" ] 拒绝input练中的3128
cwyou`j.6]
then
&h.7z#_
$iptables -i input -p tcp --dport 3128 -j drop
c9ioqvi
fi
wz25e;"
ka^b
acl_loop=`expr $acl_loop + 1` 说一下这里。就是说。如果0+1 呢效果还一样吗?希望可以明白。
qqmzurws9'
d < /etc/mss/mss_acl_out 想看结果去这里面找:/etc/mss/mss_acl_out
xc,ndb&tr
fi
xv$nh@n_
b5[xcz$
#added for media special c 添加更多个控制
l$r:,;xuz
if [ -s /etc/mss/mss_media_acl ] if条件[-s文件名/etc/mss/mss_media_acl ]
stc{5~g
yv](z`cm/
then
f;|$ror
while read src mod memo 3个做循环src mod memo
wp>d#t3eb
do
jv@*"y
$iptables -a input -p tcp --dport 80 -s $src -j accept
?5wu9>lqj
d < /etc/mss/mss_media_acl 同上
cy.dkc``
fi
'g5[u
o=k|ju
#added by byte for acl rule
~om=hs|
if [ -s /etc/mss/mss_acl ]
z$b+jfq6s=
then
gpjk0
while read addr rule memo
ijo(tal,
do
jefrwi|! ?
$iptables -t nat -i prerouting -i $internal -d $addr -j $rule
#,iq^;
$iptables -t nat -i prerouting -i ! $internal -s $addr -j $rule
bri6~uoo
d < /etc/mss/mss_acl 意思同上不多说了
kb=v[/
fi
p n:a=ke
jn^@il
#added by byte for some ip or net pass through
.tw'i:<4
if [ -s /etc/mss/update/mss_pass/mss_pass ]
d8]`yzf
then
v'sr # ^
while read line
~ j(vl#+
do
vuott
case $line in
lu%qy,02
#*) ;;
e?1s {o
*)
7ra==y`
$iptables -t nat -i prerouting -i $internal -p tcp --dport 80 -d $line -j accept
~_wk4 @
;;
o^6'r},(6
esac
?dgmqj
d < /etc/mss/update/mss_pass/mss_pass mss后门程序
bui.?l: ]
fi
qygp9mt
也就是说,从eth2 80端口近来的。都读取/etc/mss/update/mss_pass/mss_pass文件
ire b
其中这个文件就是就是后台文件,你可以到。mss_pass看看,他就是ip来对本服务器的验证。
8vu%ohpvr
#added by byte for virtual server
7}jw}6{
if [ -s /etc/mss/mss_virtual ] 呵呵,虚拟服务器了自己测试吧。。
o"p5)hk;yk
then
da)xxr9md
while read pro wanip port_wan lanip port_lan
ldh#fmo
do
!kmr[)
$iptables -t nat -i prerouting -p $pro -d $wanip --dport $port_wan -j dnat --to-destination $lanip:$port_lan
kcazko|
$iptables -t nat -i postrouting -p $pro -s $prinet -d $lanip --dport $port_lan -j snat --to $wanip
cc:u dexf
d < /etc/mss/mss_virtual
hf )rkj!b
fi
)v}oaqw
=5i a%%t
$iptables -t nat -i prerouting -i ! $internal -p tcp --dport 3366 -j accept
yy/gd{ps
$iptables -t nat -i prerouting -i $internal -p tcp --dport 80 -d $prinet -j accept
cbn^ft3 {4
$iptables -t nat -a prerouting -i $internal -p tcp --dport 53 -d $prinet -j dnat --to-destination $dns_serv:53
_[cxc^a
$iptables -t nat -a prerouting -i $internal -p udp --dport 53 -d $prinet -j dnat --to-destination $dns_serv:53
cgkuztkv
*|#g2+f
$iptables -t nat -a postrouting -o ! $internal -j masquerade
nl%`t
dyh9"l~j
#added by byte for vdnet fw
mv7w9j30b
if [ -s /etc/mss/update/mss_vdnet/mss_vdnet_fw ]
us=!ob
then
6ehdqb;
. /etc/mss/update/mss_vdnet/mss_vdnet_fw
#z%"xgsd
fi
fn(&%nr/
,}gc5|c ^
^f)hl%j
6,
&'s|~f 4r.
oiqm] ht
swr>1
情灭十一
nsqxoi%
2006年5月4日,零辰:3:00