常看到有人乱使用 port scan 软件,(ex:nmap) 来乱扫他人的 port,
这里提供几个方式,透过 linux kernel 2.4 的新核心机制 + iptables
来进行一些设限: # NMAP FIN/URG/PSH
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# Xmas Tree
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP
# Another Xmas Tree
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# Null Scan(possibly)
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP
# SYN/RST
iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN/FIN -- Scan(possibly)
iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
 
这是针对一些像是使用 scan 软件,配合所谓的 Stealth 等机制去乱扫他人
主机时,可以把这些封包丢弃不处理。那对方一扫就卡死了,或者是
要等联机 timeout 才能够继续工作,拉长 scan 所需的时间。
下面是我设定 iptables 的一些简单规则,可以参考一下。(与 NAT 无关喔)
# 挂入相关 module modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
 
# 重设 iptables -F
iptables -X
iptables -F -t nat
iptables -X -t mangle
 
# 把 FORWARD 关闭 iptables -P FORWARD DROP
 
这是打开让自己网域可以方便连结,也就是该网域不设防 iptables -A INPUT -p all -s ip_net/netmask -j ACCEPT
 
允许相关连结服务 iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 113 -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j DROP
 
上面是打开允许 port 20、21、22、23、25、53、110、113 等服务才能够
被外面所联机。
port 20、21 : ftp 使用的。
port 22 : ssh 联机
port 23 : telnet 联机。方便使用,其实不开放比较安全。
port 25 : sendmail 使用。让信件可以寄进来。
port 53 : dns 使用。dns 需要打开 udp 使用。
port 110 : pop3 使用
port 113 : auth 身份确认。我打开是让一些使用该 113 确认身份的主机
不至于反查时会卡住很久。
最后一行是对于主动联机或者是不合法联机,一律通通拒绝掉。
这个 .. 内容,很适用只允许外面连结特定的 port 服务,剩下的其余
port 就拒绝外面主动建立的联机。比方使用 Modem 拨接,只希望里面可以
正常联机出去,外面都无法联机进来这个需求。(ps: modem 是使用 ppp0
等这些接口,上面的 eth0 要改成 ppp0 )
防止 sync flood ***的设定: iptables -N synfoold
iptables -A synfoold -p tcp --syn -m limit --limit 1/s -j RETURN
iptables -A synfoold -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state NEW -j synfoold
 
这个方式对于一个很忙碌的站台来说,这个设定方式会不会有不良影响呢?
测试过一个很忙碌的站台用这个设定,老实说并不好....
所以也许可以调整时间与次数的触发值。
防止 Ping of Death : iptables -N ping
iptables -A ping -p icmp --icmp-type echo-request -m limit --limit \
1/second -j RETURN
iptables -A ping -p icmp -j REJECT
iptables -I INPUT -p icmp --icmp-type echo-request -m state --state NEW \
-j ping
 
这里只有把 icmp 的 echo request 部份拒绝掉,可以视情况再调整。
或者是直接设定主机不响应 echo request 。 /proc/sys/net/ipv4/icmp_echo_ignore_all
 
补充心得
iptables 机制是逐条检查...
但是假设当一个封包要通过时,第一条规则已经放行通过,封包的命运已经定下来,剩余规则就不会再检查,就算剩余规则中有要挡下这个封包时也无效!
例:
规则 1 : 放行所有 80 port 的封包
规则 2 : 拒绝 210.58.221.241 80 port 封包
规则 3 ........
像这样子时,根本无法挡下 210.58.221.241 80 port 封包...
因为第 1 条规则已经先放行所有 80 port 的封包了,所以该封包早就先通过了......
正确的写法应该将规则 1 与规则 2 互换.....
※ 引述《AceLan (小蛋蛋)》之铭言: > [root@babu netfilter]# pwd
> /lib/modules/2.4.13-7mdk/kernel/net/ipv4/netfilter
> [root@babu netfilter]# ls
> ip_conntrack.o.gz ipchains.o.gz ipt_mark.o.gz
> ip_conntrack_ftp.o.gz ipfwadm.o.gz ipt_multiport.o.gz
> ip_conntrack_h323.o.gz ipt_LOG.o.gz ipt_owner.o.gz
> ip_conntrack_irc.o.gz ipt_MARK.o.gz ipt_state.o.gz
> ip_conntrack_talk.o.gz ipt_MASQUERADE.o.gz ipt_tcpmss.o.gz
> ip_nat_ftp.o.gz ipt_MIRROR.o.gz ipt_tos.o.gz
> ip_nat_h323.o.gz ipt_REDIRECT.o.gz ipt_unclean.o.gz
> ip_nat_irc.o.gz ipt_REJECT.o.gz iptable_filter.o.gz
> ip_nat_talk.o.gz ipt_TCPMSS.o.gz iptable_mangle.o.gz
> ip_queue.o.gz ipt_TOS.o.gz iptable_nat.o.gz
> ip_tables.o.gz ipt_limit.o.gz
> ip_vs/ ipt_mac.o.gz
 
东西好多 我在 iptables 主站里没有找到相关的资料
> ([url]http://netfilter.samba.org/[/url])
> 只是很好奇各个模块的功能 有 ip_ 开头 ipt_ & iptable_ 开头的
> 这些模块有什么不同呢?
iptables_ 开头,是给 iptables -t xxxx 的。比方:
iptables -t nat ...
iptables -t mangle .....
ipt_ 开头的,是 -j xxxx 使用的。比方:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT ....
ip_conntrack 开头的是一些纪录/追踪通讯协议的运作,然后适时修改封包
内容让特定通讯协议可以正常工作。
ip_nat_ 开头的是解决一些常见服务在 nat 环境可能无法使用的情况。
ip_conntrack* 与 ip_nat_* 这些 module 一般要使用 modprobe 来加载。
ip_tables 是主要提供 iptables 功能的核心。ip_queue 是可以让封包过滤
传输丢给使用层的应用程序来处理。