我们用Michael RashLinux Firewalls: Attack Detection and Response with iptables, psad, and fwsnort 》中提到默认Iptables防火墙的配置脚本,来说明问题。
 
关于官方默认的防火墙模板配置脚本,有兴趣的话请到:http://www.cipherdyne.org/LinuxFirewalls/ch01/下载。
上个月的时候我下载的脚本(iptables.sh 2373 2009-07-29 08:16:17Z mbr)执行发现有问题,后来更正以后才发现,网站上给出页面显示的那个的是没问题的(iptables.sh I2470 2009-09-11 03:30:35Z mbr)
一切看需求,这样我们所做的才有意义

网络环境
下面是我模拟的环境,特别说明一下,这个环境与上面提到脚本中提及的那个环境大同小异。只是防火墙的一个公网和一个私网接口,被我替换成了两个私网接口。
 
eg.
Firewalls防火墙:
eth0:192.168.1.254
eth1:192.168.0.2
gw:192.168.1.1
int_sccanner内网主机:
eth0:192.168.0.3
gw:192.168.0.1
webservice:apache
ext_sccanner外网主机:
eth0:192.168.1.253
gw:192.168.1.1
已知需求

服务器(webdns在内网192.168.0.0/24)允许外网192.168.1.0/24及其它外网访问;
内部网络可以通过防火墙向外部服务器发起下开类型的通信:
DNS查询
FTP传输
网络时间校对
ssh对话
简单邮件协议
网站访问httphttps
whois查询
默认防火墙的规则脚本

说明,这个脚本不是我的原创,是我根据上面的环境做了适当的改动。我们重点拿它来说明问题。
#!/bin/sh
# modefied by wang_xiaoyu@qq.com
# 2009-9-16 添加额外的中文注释
#############################################################################
#
# File: iptables.sh
#
# Purpose: To build a basic iptables policy with default log and drop rules.
#          This script was written for the book "Linux Firewalls: Attack
#          Detection and Response" published by No Starch Press.
#
# Copyright (C) 2006-2007 Michael Rash (mbr@cipherdyne.org)
#
# License (GNU Public License):
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
#   USA
#
#
#############################################################################
#
# $Id: iptables.sh 1406 2008-04-14 01:48:04Z mbr $
#
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe
INT_NET=192.168.0.0/24
### flush existing rules and set chain policy setting to DROP
### 清空默认的防火墙规则,并设置默认的行为为丢弃
echo "[+] Flushing existing iptables rules..."
$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -X
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
### load connection-tracking modules
### 加载连接跟踪模块,
### 注意这里可能需要编译内核,具体检查模块是否已经包含的方法请查看后面的脚本后面的编译内核部分。
#
$MODPROBE ip_conntrack
$MODPROBE iptable_nat
$MODPROBE ip_conntrack_ftp
$MODPROBE ip_nat_ftp
###### INPUT chain ######
###### 操作INPUT  ####
#
echo "[+] Setting up INPUT chain..."
### state tracking rules
###### 状态跟踪规则 ####
$IPTABLES -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
$IPTABLES -A INPUT -i eth1 -s ! $INT_NET -j LOG --log-prefix "SPOOFED PKT "
$IPTABLES -A INPUT -i eth1 -s ! $INT_NET -j DROP
### ACCEPT rules
$IPTABLES -A INPUT -i eth1 -p tcp -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
### default INPUT LOG rule
$IPTABLES -A INPUT -i ! lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
###### OUTPUT chain ######
###### 操作OUTPUT  ####
 
#
echo "[+] Setting up OUTPUT chain..."
### state tracking rules
###### 状态跟踪规则 ####
 
$IPTABLES -A OUTPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
### ACCEPT rules for allowing connections out
$IPTABLES -A OUTPUT -p tcp --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
### default OUTPUT LOG rule
### 默认OUTPUT链的日志记录,注意这里的日志对于发现攻击和响应攻击是必不可少的,关键的时候它还能够取证。
 
$IPTABLES -A OUTPUT -o ! lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
###### FORWARD chain ######
###### FORWARD  ######
 
#
echo "[+] Setting up FORWARD chain..."
### state tracking rules
### 状态跟踪规则
$IPTABLES -A FORWARD -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
### 防泛洪水攻击的规则,哈哈这个是网上经常提到的,其实意思就目标地址不是我这的,却发给了我的统统丢弃
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j LOG --log-prefix "SPOOFED PKT "
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j DROP
### ACCEPT rules
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT
### default LOG rule
### 默认的日志规则
 
$IPTABLES -A FORWARD -i ! lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
###### NAT rules ######
###### NAT表规则 ######
 
#
echo "[+] Setting up NAT rules..."
$IPTABLES -t nat -A PREROUTING -p tcp --dport 21 -i eth0 -j DNAT --to 192.168.0.245:21
$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.0.245:80
$IPTABLES -t nat -A PREROUTING -p tcp --dport 443 -i eth0 -j DNAT --to 192.168.0.245:443
$IPTABLES -t nat -A PREROUTING -p udp --dport 53 -i eth0 -j DNAT --to 192.168.0.245:53
$IPTABLES -t nat -A POSTROUTING -s $INT_NET -o eth0 -j MASQUERADE
###### forwarding ######
#####  打开转发的方法 ##
###### 这个是实时生效的
#
echo "[+] Enabling IP forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward

exit
### EOF ###
## 请到文章末尾下载

 

编译内核

重新编译内核使用内核支持务必支持ip_conntrack\iptable_nat\ip_conntrack_ftp\ip_nat_ftp
关于是否支持可以查看:
/lib/modules/`uname -r`/kernel/net/netfilter
 
例如:
我的内核版本为:2.6.30
那么我的模块位置就是:
/lib/modules/2.6.30/kernel/net/netfilter/
 
注意我们提倡把内核的iptables的一些模块编译成外挂的方式,这样使用更清晰。
 
关于内核的编译:
1.cp old configure file
2.change directory of the new /old kernel
3.make silentoldconfig
To upgrade the kernel source config file.
4.make
5.make module_install && make install

 

关于测试

 
先执行上面脚本
# . iptables.sh
如果在测试中需要暂时停止防火墙的规则
# /etc/init.d/iptables stop
我们现在要看看我们实现的效果。这里我们主要用到的网络测试工具是ping\hping\nc。大家可以根据需要使用nmaptcpdump工具,它们也很优秀。
 
内网主机:
假设已经通过rpmdeb包安装了相应的Apache软件。
# echo 192.168.0.3 >/var/www/html/index.html
 
外网主机:
NAT

访问http://192.168.1.254(iptablesfw)
看到192.168.0.3的网站。

 

TCP

nc -v 192.168.1.254 5500 # 访问tcp5500端口,默认返回的是端口不可达,因为默认这个端口是不绑定服务的。
但是对于防火墙,
# nc -v 192.168.1.7 5500
nc: connect to 192.168.1.7 port 5500 (tcp) failed: Connection refused
停滞在那里不动。
 
# nc -v 192.168.1.7 5500
同时防火墙会做类似记录:
Sep  1 01:02:09 localhost kernel: DROP IN=eth0 OUT= MAC=00:0c:29:bc:2d:01:00:0c:29:97:b2:86:08:00 SRC=192.168.1.253 DST=192.168.1.254 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=64567 DF PROTO=TCP SPT=51166 DPT=5500 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A039ED8040000000001030302)
Sep  1 01:02:12 localhost kernel: DROP IN=eth0 OUT= MAC=00:0c:29:bc:2d:01:00:0c:29:97:b2:86:08:00 SRC=192.168.1.253 DST=192.168.1.254 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=64568 DF PROTO=TCP SPT=51166 DPT=5500 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A039EE3BC0000000001030302)
Sep  1 01:02:18 localhost kernel: DROP IN=eth0 OUT= MAC=00:0c:29:bc:2d:01:00:0c:29:97:b2:86:08:00 SRC=192.168.1.253 DST=192.168.1.254 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=64569 DF PROTO=TCP SPT=51166 DPT=5500 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A039EFB2C0000000001030302)

 

UDP

hping 工具,没有的请预先编译:hping2-rc3是最稳定的版本
 
hping2 -2 -c 1 -p 5500 192.168.1.254
-2指的是UDP协议
-c 1指只发送一次
-p 指定端口
# hping2 -2 -c 1 -p 5500 192.168.1.254
HPING 192.168.1.254 (eth0 192.168.1.254): udp mode set, 28 headers + 0 data bytes
--- 192.168.1.254 hping statistic ---
1 packets tramitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
没有回显。
同时防火墙会记录如下的信息:
Sep  1 00:57:05 localhost kernel: DROP IN=eth0 OUT= MAC=00:0c:29:bc:2d:01:00:0c:29:97:b2:86:08:00 SRC=192.168.1.253 DST=192.168.1.254 LEN=28 TOS=0x00 PREC=0x00 TTL=64 ID=59162 PROTO=UDP SPT=1427 DPT=5500 LEN=8
如果是没有配置iptables策略:
会回显:ICMP Port Unreachable
# hping2 -2 -c 1 -p 5500 192.168.1.7
HPING 192.168.1.7 (eth0 192.168.1.7): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=192.168.1.7 name=localhost
--- 192.168.1.7 hping statistic ---
1 packets tramitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

 

ICMP

hping -1 -c 1 --icmptype echo-reply
# hping -1 -c 1 --icmptype echo-reply 192.168.1.254
HPING 192.168.1.254 (eth0 192.168.1.254): icmp mode set, 28 headers + 0 data bytes
--- 192.168.1.254 hping statistic ---
1 packets tramitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
防火墙记录:
Sep  1 01:19:21 localhost kernel: DROP INVALID IN=eth0 OUT= MAC=00:0c:29:bc:2d:01:00:0c:29:97:b2:86:08:00 SRC=192.168.1.253 DST=192.168.1.254 LEN=28 TOS=0x00 PREC=0x00 TTL=64 ID=44056 PROTO=ICMP TYPE=0 CODE=0 ID=39430 SEQ=0
而一般的系统都是丢弃这样的:只发送回显应答数据包,却没有对应的回显请求。
 
同时说明一下,这个脚本的功能远远不止这些,它还可以配合PsadFwsnort等程序实现IDS的功能,甚至于对单个数据包授权访问(SPA)。
 
想了解更多的内容可以看这本原作,个人感觉写得很精彩,还可以学习到许多TCP/IP协议的内容。