分享
 
 
 

iptables基础和应用(3)

王朝other·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

#

# 4.1.1 Set policies

# 定义安全政策为正面表列

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT DROP

$IPTABLES -P FORWARD DROP

#

# 4.1.2 Create userspecified chains

#

#

# 新增使用者自订规则炼 bad_tcp_packets、 allowed 和 icmp_packets

$IPTABLES -N bad_tcp_packets

$IPTABLES -N allowed

$IPTABLES -N icmp_packets

#

# 4.1.3 Create content in userspecified chains

#

#

# bad_tcp_packets chain

# bad_tcp_packets 规则炼的功能是:将要求重导向的联机记录起来,然后将封包丢弃(防止联机被绑架,但会档掉需要三方交谈的服务,例如:M$ Media Server)

$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-level INFO --log-prefix "New not syn:"

$IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP

# allowed chain

# allowed 规则炼的功能是:允许要求联机封包或响应封包进入,将其余封包丢弃

$IPTABLES -A allowed -p TCP --syn -j ACCEPT

$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A allowed -p TCP -j DROP

#

# ICMP rules

# icmp_packets 规则炼的功能是:允许 ping 封包进入,将其余封包丢弃

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

#

# 4.1.4 INPUT chain(过滤要到达防火墙的封包)

#

#

# 进入防火墙主机的 TCP 封包必须先进行 bad_tcp_packets 过滤

$IPTABLES -A INPUT -p tcp -j bad_tcp_packets

# 从 WAN 进入防火墙主机的 ICMP 封包必须先进行 icmp_packets 过滤,这是为了避免骇客传送不完整的 IP 封包,系统会响应 ICMP 封包通知对方,导致主机位置被侦测出来

$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

# 从 LAN 进入防火墙主机的全部 unicast 和 broadcast 封包,通通放行;额外检查目的地 IP 可以将 multicast 封包滤除

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BROADCAST_ADDRESS -j ACCEPT

# 从 Loopback 接口进入防火墙主机的所有封包,检查是否来自本机,若是则放行;此规则去检查来源 IP ,似乎有些画蛇添足,因为只有来自本机的封包才有机会进入 Loopback 接口

$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT

$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT

$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT

# 从 LAN 进入防火墙主机的 DHCP 封包,予以放行,只有当防火墙担任 DHCP 时才使用

#$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT

# 从 WAN 进入防火墙主机的所有封包,检查是否为响应封包,若是则予以放行

$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT

# 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式攻击

$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level INFO --log-prefix "IPT INPUT packet died: "

#

# 4.1.5 FORWARD chain(过滤要通过防火墙的封包)

#

#

# 通过防火墙的 TCP 封包必须先进行 bad_tcp_packets 过滤

$IPTABLES -A FORWARD -p TCP -j bad_tcp_packets

# 从 LAN 要到 WAN 的封包通通放行

$IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -j ACCEPT

# 从 WAN 要到 LAN 的封包仅放行回应封包

$IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许来自 WAN 的 Ping 封包,递送到校内所有的服务器

$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -j icmp_packets

$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -j icmp_packets

$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -j icmp_packets

$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -j icmp_packets

$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -j icmp_packets

$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -j icmp_packets

# 允许来自 WAN 的 HTTP、HTTPS 封包,递送到校内所有的 WEB 服务器

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -m multiport --dport $HTTP,$HTTPS -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -m multiport --dport $HTTP,$HTTPS -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -m multiport --dport $HTTP,$HTTPS -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -m multiport --dport $HTTP,$HTTPS -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -m multiport --dport $HTTP,$HTTPS -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -m multiport --dport $HTTP,$HTTPS -j allowed

# 允许来自 WAN 的 FTP 封包,递送到校内所有的 FTP 服务器

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP1_IP -m multiport --dport $FTP,$FTP_DATA -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP2_IP -m multiport --dport $FTP,$FTP_DATA -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP3_IP -m multiport --dport $FTP,$FTP_DATA -j allowed

# 允许来自 WAN 的 SMTP、POP3、IMAP 封包,递送到校内所有的 MAIL 服务器

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL1_IP -m multiport --dport $SMTP,$POP3,$IMAP -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL2_IP -m multiport --dport $SMTP,$POP3,$IMAP -j allowed

# 允许来自 WAN 的 SSH、TELNET、WEBMIN、WAM 封包,递送到校内所有的 LINUX 服务器

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM1_IP -m multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM2_IP -m multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed

# 允许来自 WAN 的 PCanywhere 封包,递送到校内所有的 PCanywhere 服务器

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport $PCAW_TCP -j allowed

$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport $PCAW_UDP -j ACCEPT

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport $PCAW_TCP -j allowed

$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport $PCAW_UDP -j ACCEPT

# 允许来自 WAN 的 DNS 封包,递送到校内的 DNS 服务器

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS -j allowed

$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS -j ACCEPT

# 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式攻击

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "

#

# 4.1.6 OUTPUT chain(过滤从防火墙送出的封包)

#

#

# 从防火墙送出的 TCP 封包必须先进行 bad_tcp_packets 过滤

$IPTABLES -A OUTPUT -p TCP -j bad_tcp_packets

# 从防火墙网卡送出的所有封包,通通放行

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT

$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT

$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT

# 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式攻击

$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "

######

# 4.2 nat table

#

#

# 4.2.1 Set policies

#

#

# 4.2.2 Create user specified chains

#

#

# 4.2.3 Create content in user specified chains

#

#

# 4.2.4 PREROUTING chain(定义目的地地址转译)

#

# 从 WAN 要到校内服务器的封包,在封包过滤前先转译目的地 IP 为 NAT IP

$IPTABLES -t nat -A PREROUTING -d $HTTP1_IP -j DNAT --to-destination $LAN_HTTP1_IP

$IPTABLES -t nat -A PREROUTING -d $HTTP2_IP -j DNAT --to-destination $LAN_HTTP2_IP

$IPTABLES -t nat -A PREROUTING -d $HTTP3_IP -j DNAT --to-destination $LAN_HTTP3_IP

$IPTABLES -t nat -A PREROUTING -d $HTTP4_IP -j DNAT --to-destination $LAN_HTTP4_IP

$IPTABLES -t nat -A PREROUTING -d $HTTP5_IP -j DNAT --to-destination $LAN_HTTP5_IP

$IPTABLES -t nat -A PREROUTING -d $HTTP6_IP -j DNAT --to-destination $LAN_HTTP6_IP

#

# 4.2.5 POSTROUTING chain(定义来源地址转译)

#

# 从校内服务器要到 WAN 的封包,在送出之前先转译来源 IP 为 NIC IP,配合上面区块的设定,就可以做到一对一对应

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP1_IP -j SNAT --to-source $HTTP1_IP

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP2_IP -j SNAT --to-source $HTTP2_IP

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP3_IP -j SNAT --to-source $HTTP3_IP

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP4_IP -j SNAT --to-source $HTTP4_IP

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP5_IP -j SNAT --to-source $HTTP5_IP

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP6_IP -j SNAT --to-source $HTTP6_IP

# 从校内一般单机要到 WAN 的封包,在送出之前先转译来源 IP 为预设的 NIC IP,这就是多对一对应,若指定成 IP 范围,就变成多对多对应,例如本范例即是如此

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $IP_POOL

#

# 4.2.6 OUTPUT chain

#

######

# 4.3 mangle table

#

#

# 4.3.1 Set policies

#

#

# 4.3.2 Create user specified chains

#

#

# 4.3.3 Create content in user specified chains

#

#

# 4.3.4 PREROUTING chain

#

#

# 4.3.5 INPUT chain

#

#

# 4.3.6 FORWARD chain

#

#

# 4.3.7 OUTPUT chain

#

#

# 4.3.8 POSTROUTING chain

#

柒、Log 分析

分析 iptables 防火墙 Log 的免费软件相当多,底下仅介绍 iptables_logger_v0.3,这个软件提供一个 perl 程序,可以读取系统 LOG,并将数据写入 MySql 数据库,然后还提供 php 程序,可以从数据库读取数据,整理成网页提供浏览,因此要安装此分析软件,必须先安装 perl、php、mysql 和 apache,有关这些套件的安装在这里不再介绍,请自行参考相关文件,或参加 Linux 进阶班课程。你可以从这里取得 iptables_logger_v0.3 程序,其安装程序如下:

安装数据表:

这个套件解压缩后,可以看到有一个数据夹叫做 sql,数据夹内有一个 sql 的指令稿叫做 db.sql,这个指令稿是用来建立摆放联机纪录所需的数据表,请利用以下指令来安装,如果您还不熟悉 mysql 的指令,请自行阅读 man mysql 文件。

root@firewall sql# mysql -u root -p(以 root 身分登入 MySql 主控台)

mysql> create database iptables;(建立一个数据库叫做 iptables,数据库也可以自行命名,但是要记得修改相关程序)

mysql> grant create,select,insert on iptables.* to iptables_admin@localhost identified by 'xx';(将 iptables 数据库新建、读取和写入权限授权给 iptables_admin 这个账号,并限制只能从本机联机,密码为 xx,请自行修改上述指令中之账号与密码)

mysql> grant create,select on iptables.* to iptables_user@localhost identified by 'xx';(将 iptables 数据库读取权限授权给 iptables_user 这个账号,并限制只能从本机联机,密码为 xx,请自行修改上述指令中之账号与密码)

root@firewall sql# cat db.sql | mysql -u iptables_admin -p iptables(以 iptables_admin 身分来执行 db.sql,如果你改了数据库的名字,请记得修改 db.sql)

修改 iptables 指令稿:

由于这支 Log 分析程序是以读取系统 LOG 加以分析后才汇入到数据库的方法,来处理联机纪录,并非使用 ULOG 直接由 iptables 将纪录写入 mysql 数据库,感觉上效能比较差,但在 ULOG 机制尚未被实体化之前,这也不失为一个好的解决方案。

原则上只要在 iptables 指令稿中有产生 LOG 的动作,这些信息就会被分析汇入到数据表(由 feed_db.pl 负责这个工作),特别要注意的是 LOG 产生时会加入一个标头(prefix),程序是透过标头来分析这笔 LOG 的意义,请将 LOG 标头取名为 IPTABLES DROP 或 IPTABLES ACCEPT,以方便事后的统计。范例如下:

首先建立一个新的规则炼 LOG_DROP,这个规则炼用来将要丢弃的封包先 LOG 到系统日志文件,然后再丢弃。

iptables -N LOG_DROP

iptables -A LOG_DROP -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES DROP] : '

iptables -A LOG_DROP -j DROP

接着修改所有规则,只要是需进行 DROP 动作,都改为跳到 LOG_DROP 规则炼,例如:

$IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP

改为

$IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j LOG_DROP

至于需要进行 ACCEPT 处理的规则也如法炮制,先建立 LOG_ACCEPT 规则炼:

iptables -N LOG_ACCEPT

iptables -A LOG_ACCEPT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES ACCEPT] : '

iptables -A LOG_ACCEPT -j ACCEPT

接着修改所有规则,例如:

$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

改为

$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j LOG_ACCEPT

安装显示分析结果的 PHP 程序:

在解压缩的数据夹中,找到一个叫做 web 的子数据夹,里面就是要给人从网页浏览分析结果的 PHP 程序,如果你的 Apache 已经设定好支持 php 和 php_mysql,那么只要将此数据夹复制到 Apache 的根文件目录就行了。方法如下:

cp -R web /var/www/iptables

拷贝完成后请修改 config.php ,目的是为了让 PHP 程序执行时,能以正确的账号密码连上 MySql ,以便从数据库读取数据,请找到底下三行:

$db_host="localhost";(一般不需修改,除非数据库在另一台主机上)

$db_user="iptables_user";(修改为仅具有读取权限的账号,如果之前安装数据库有自设帐号的话)

$db_password="xxxx";(请将密码修改为自设的密码)

安装 feed_db.pl:

前面已经介绍过这支程序的作用,请务必修改这支程序中有关数据库联机的 SQL 指令,将指令中的账号密码,改成你当初所设定的账号密码,建议最好不要用 root 身分联机,以免影响防火墙的安全性。这支程序是放在解压缩后数据夹内的 scripts 子数据夹,请修改下面这三行:

my $dsn = 'DBI:mysql:iptables:localhost';(请将 iptables 改成你自订的数据库名称)

my $db_user_name = 'iptables_admin';(请将 iptables_admin 改成你自订的管理账号)

my $db_password = 'xxxx';(请将 xxxx 改成管理账号的密码)

程序修改好后,请将它拷贝到 /usr/local/bin 数据夹,接着将程序执行起来,注意:这支程序会跑一个无穷尽循环,持续分析系统 LOG,因此必须在背景执行,同时只能有一支程序执行,以避免造成 IO 过大的负载,执行方式如下:

tail --follow=name --retry /var/log/syslog | /usr/local/bin/feed_db.pl &

如果这些动作都作了,但程序并未执行成功,有可能是因为 perl_DBI:DBD 套件没安装,请自行用 rpm 补装该套件。

查看分析结果:

完成以上所有安装步骤后,就可以坐下来享受一下成果,请打开浏览器输入底下网址

http://192.xx.1.254/iptables

看到的画面,如下图所示(请点选放大):

安装 LOG 分析后的安全防范:

防火墙上安装越多套件,系统安全性也就越低,改进的方法有两个:

1. 将 apache 和 mysql 架设在内部网络的一台机器上,防火墙上仅安装 mysql client,这样可以避免 apache 和 mysql 的漏洞被骇客利用

2. 在防火墙上设定规则,仅允许来自内部的网络,进行 HTTP 和 MySql 联机,这个方法比较简单,本文所介绍的 iptables 范例也是采用此法,缺点是无法在校外查看 LOG 分析结果

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有