登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

糟老頭的地盤

老頭的地盤听老頭的

 
 
 

日志

 
 

RED HAT 9.0 做软路由全过程(1)  

2007-04-23 03:16:21|  分类: linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

候总是NAT不成功,个人认为有三点

1.可能是iptables没写好(大部分的网友都是iptables的问题)

2.配置的不对(比如说修改网卡的IP地址)

3.从来没做过,想学又无从下手

好了不说了

现在大家就开始跟着我开始做RED HAT的路由吧

首先,我们用一台机器安装好RED HAT(版本无所谓)。

然后我们要修改八个文件。这八个文件的名字是:

network

ifcfg-eth1

ifcfg-eth0

hosts

sysctl

static-routes

rc.local

resolv

这八个文件相当重要,一定要更改才可以!

这八个文件分别相对应的目录是:

/etc/sysconfig/network

/etc/sysconfig/network-scripts/ifcfg-eth0

/etc/sysconfig/network-scripts/ifcfg-eth1

/etc/hosts

/etc/sysconfig/static-routes

/etc/rc.d/rc.local

/etc/sysctl.conf

建议大家用VI编辑器进行修改!

这八个文件的意思是什么呢?下面就是这八个文件的作用!

network 主网络设置文件

ifcfg-eth0 eth0 网卡设置文件

ifcfg-eth1 eth1 网卡设置文件

hosts 网络主机名配置

static-routes 静态路由表文件

rc.local IPTABLES 脚本(关键)

sysctl.conf Linux 内核IP转发启用文件

文件介绍完后我们就要动手开始修改拉 。最先出场的是network文件。这个文件是你的主要网络设置文件!在这个文件里面要修改你的网络大概构架(比如你的想要启用的网关地址,网关名字,还有选择主网卡等)

接下来是我们的ifcfg-eth1和ifcfg-eth0两个文件。这两个文件是你网卡的IP地址文件!

ifcfg-eth0就对应你内网的IP和网关。而ifcfg-eth1就对应你外网的IP和网关。用VI编辑器打开后,里面显示的内容是这样的:

DEVICE=eth1

BOOTPROTO=static

IPADDR=192.168.0.1

BROADCAST=192.168.0.255

NETMASK=255.255.255.0

NETWORK=192.168.0.0

GATEWAY=192.168.0.1

ONBOOT=yes

DEVICE=eth1是你的硬件设备名

BOOTPROTO=static 是你的配置方式(也可以添PPPOE)

BROADCAST=192.168.0.255是你的 广播地址

IPADDR=192.168.0.1 是你的IP地址

NETMASK=255.255.255.0 是你的子网掩码

NETWORK=192.168.0.0 是你的整个网段的地址

GATEWAY=192.168.0.1 是你的网关

ONBOOT=yes 意思是你是否启用网卡(也就是起用这个文件的意思。默认是开启的)

2.改好了后接下来我们还要修改hosts文件。这个文件里面就可以更改你这台机器的名称和域(工作组)

3.然后再修改sysctl.conf文件。这个文件就是LINUX的IP转发文件。在这里我们一定要起用IP转发才可以。里面可以这样写:

net.ipv4.ip_forward=1

net.ipv4.conf.default.rp_filter=1

kernel.sysrq=0

4.好了就是static-routes文件。这个文件就是你的静态路由表文件!这个文件记得一定添加才可以!里面的语法是这样的:

eth0(设备名) net(网络地址) 192.168.0.0 (子网)netmask 255.255.255.0 (网关地址)gw 192.168.0.1

5.接下来该修改resolv文件了。这个文件是你DNS服务器的地址文件,语法是:

nameserver(DNS服务器) 202.100.4.15(DNS的IP服务器地址)

6.改好了后我们就需要修改rc.local这个文件了!关于这个文件你首先要去学习iptables语法!请参见我下面的两篇文章:

http://www.cocokl.com/blog/n98c5p2.aspx

http://www.cocokl.com/blog/n98c5p3.aspx

修改好了就可以PING你的ISP了。如果通可就一切OK了

上面的方法都是在RED HAT的全系列版本中全部测试通过!

一、 /etc/sysconfig/iptables 文件

# /etc/sysconfig/iptables 文件

#

#======================= 古公 =======================

#

# mangle 段

*mangle

: PREROUTING ACCEPT [0:0]

: OUTPUT ACCEPT [0:0]

COMMIT

#

#

# nat 段

*nat

: PREROUTING ACCEPT [0:0]

: POSTROUTING ACCEPT [0:0]

: OUTPUT ACCEPT [0:0]

#

# 为使用 SQUID 作“透明代理”而设定!

#

# 没有指定 网卡、地址:

#[0:0] -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

#

# 指定 网卡、地址:

[0:0] -A PREROUTING -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

[0:0] -A PREROUTING -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3128

# 将 对于 80、443 端口的访问 重定向到 3128 端口。

#

#

# 这些机器可以走这个机器做网关上 Internet 网。

# 需要在 /etc/sysctl.conf 文件里面修改成 net.ipv4.ip_forward = 1

# 或者 echo 1 > /proc/sys/net/ipv4/ip_forward

# 由于利用 SQUID 实现了“透明代理”,Masq 取消相应的客户地址。

# 这里,只剩下几个需要利用“IP伪装”来上网的机器(可以上 QQ、雅虎通、msn 之类的):

#

[0:0] -A POSTROUTING -s 192.168.20.3 -j MASQUERADE

[0:0] -A POSTROUTING -s 192.168.20.10 -j MASQUERADE

[0:0] -A POSTROUTING -s 192.168.20.32/255.255.255.240 -j MASQUERADE

# 若你的 公网的 IP 地址是固定的,使用这个语句似乎更好些:

#[0:0] -A POSTROUTING -s 192.168.20.32/255.255.255.240 -j SNAT --to 211.148.130.133

COMMIT

#

#

# filter 段

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

#

# 屏蔽 来自 microsoft 的站点:

[0:0] -A INPUT -s 207.46.0.0/255.255.0.0 -j DROP

[0:0] -A INPUT -d 207.46.0.0/255.255.0.0 -j DROP

#

# 防止IP欺骗:

# 所谓的IP欺骗就是指在IP包中存在着不可能的IP源地址或目标地址。

# eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,

# 也就是说,如果有一个包从eth1进入主机,而说自己的源地址是属于

# 192.168.20.0网络,或者说它的目标地址是属于这个网络的,那么这显

# 然是一种IP欺骗,所以我们使用DROP将这个包丢弃。

[0:0] -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP

[0:0] -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP

#

# 同样的,如果有包要通过eth1向Internet,而且它的源地址或目标地址是属于

# 网络192.168.20.0,那么显然也是不可能的。我们仍然使用DROP将它丢弃。

[0:0] -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP

[0:0] -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP

#

# 防止广播包从IP代理服务器进入局域网:

[0:0] -A INPUT -s 255.255.255.255 -i eth0 -j DROP

[0:0] -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP

[0:0] -A INPUT -d 0.0.0.0 -i eth0 -j DROP

# 当包的源地址是255.255.255.255或目标地址是0.0.0.0,则说明它是一个

# 广播包,当广播包想进入eth0时,我们就应该DENY,丢弃它。而240.0.0.0/3

# 则是国际标准的多目广播地址,当有一个源地址是属于多目广播地址的包,

# 我们将用DROP策略,丢弃它。

#

# 屏蔽 windows xp 的 5000 端口(这个端口是莫名其妙的 !)

[0:0] -A INPUT -p tcp -m tcp --sport 5000 -j DROP

[0:0] -A INPUT -p udp -m udp --sport 5000 -j DROP

[0:0] -A OUTPUT -p tcp -m tcp --dport 5000 -j DROP

[0:0] -A OUTPUT -p udp -m udp --dport 5000 -j DROP

# 原来是用来跑 vpn 的,呵呵,我误解了。

#

#

# 防止 Internet 网的用户访问 SAMBA 服务器:

[0:0] -A INPUT -s 211.148.130.129 -i eth1 -p tcp -m tcp --dport 137:139 -j DROP

[0:0] -A INPUT -s 211.148.130.129 -i eth1 -p udp -m udp --dport 137:139 -j DROP

[0:0] -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp --dport 137:139 -j ACCEPT

[0:0] -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p udp -m udp --dport 137:139 -j ACCEPT

[0:0] -A INPUT -s 211.148.130.128/255.255.255.240 -i eth1 -p tcp -m tcp --dport 137:139 -j ACCEPT

[0:0] -A INPUT -s 211.148.130.128/255.255.255.240 -i eth1 -p udp -m udp --dport 137:139 -j ACCEPT

[0:0] -A INPUT -p tcp -m tcp --dport 137:139 -j DROP

[0:0] -A INPUT -p udp -m udp --dport 137:139 -j DROP

#

#

# 对于本局域网用户不拒绝访问:

[0:0] -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -j ACCEPT

[0:0] -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p udp -j ACCEPT

#

#

[0:0] -A INPUT -i eth1 -p udp -m udp --dport 3 -j DROP

[0:0] -A INPUT -i eth1 -p tcp -m tcp --dport 3 -j DROP

[0:0] -A INPUT -i eth1 -p tcp -m tcp --dport 111 -j DROP

[0:0] -A INPUT -i eth1 -p udp -m udp --dport 111 -j DROP

#

#

[0:0] -A INPUT -i eth1 -p udp -m udp --dport 587 -j DROP

[0:0] -A INPUT -i eth1 -p tcp -m tcp --dport 587 -j DROP

#

# 防止 Internet 用户访问 SQUID 的 3128 端口:

[0:0] -A INPUT -s 211.148.130.129 -i eth1 -p tcp -m tcp --dport 3128 -j DROP

[0:0] -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp --dport 3128 -j ACCEPT

[0:0] -A INPUT -s 211.148.130.128/255.255.255.240 -i eth1 -p tcp -m tcp --dport 3128 -j ACCEPT

[0:0] -A INPUT -p tcp -m tcp --dport 3128 -j DROP

#

# 让人家 ping 不通我 !

[0:0] -A INPUT -i eth1 -s 192.168.30.0/24 -p icmp -m icmp --icmp-type 8 -j ACCEPT

[0:0] -A INPUT -i eth1 -s 211.148.130.128/28 -p icmp -m icmp --icmp-type 8 -j ACCEPT

[0:0] -A INPUT -i eth1 -p icmp -m icmp --icmp-type 8 -j DROP

#

COMMIT

# ======================= 结束 =======================

# ======================= 古公 =======================

二、再看看 /etc/squid/squid.conf 文件

# /etc/squid/squid.conf 文件

#

# http_port 3128

http_port 192.168.20.8:3128

hierarchy_stoplist cgi-bin ?

acl QUERY urlpath_regex cgi-bin \?

no_cache deny QUERY

# cache_mem 8 MB

cache_mem 48 MB

# emulate_httpd_log off

# ============================================================================

emulate_httpd_log on

# ============================================================================

# redirect_rewrites_host_header on

# ============================================================================

redirect_rewrites_host_header off

# ============================================================================

#Recommended minimum configuration:

acl all src 0.0.0.0/0.0.0.0

acl manager proto cache_object

acl localhost src 127.0.0.1/255.255.255.255

acl SSL_ports port 443 563

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 563 # https, snews

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

# ============================================================================

#

acl allow_domain dstdomain "/etc/squid/allow_domain"

# 下面是只允许每天上三个小时的:

acl no_allow_time_0_1 time "/etc/squid/no_allow_time_0_1"

acl no_allow_time_0_2 time "/etc/squid/no_allow_time_0_2"

acl no_allow_time_0_3 time "/etc/squid/no_allow_time_0_3"

acl no_allow_time_0_4 time "/etc/squid/no_allow_time_0_4"

acl no_allow_time_0_5 time "/etc/squid/no_allow_time_0_5"

# 完

# 下面是只允许每天上八个小时的:

acl no_allow_time_1_1 time "/etc/squid/no_allow_time_1_1"

acl no_allow_time_1_2 time "/etc/squid/no_allow_time_1_2"

acl no_allow_time_1_3 time "/etc/squid/no_allow_time_1_3"

acl no_allow_time_1_4 time "/etc/squid/no_allow_time_1_4"

acl no_allow_time_1_5 time "/etc/squid/no_allow_time_1_5"

# 完

acl no_allow_web dst "/etc/squid/no_allow_web"

acl no_allow_domain dstdomain "/etc/squid/no_allow_domain"

acl no_allow_client src "/etc/squid/no_allow_client"

#acl allow_time time "/etc/squid/allow_time"

#

acl allow_client_inf src "/etc/squid/allow_client_inf"

acl allow_client_fore src "/etc/squid/allow_client_fore"

acl allow_client_8h src "/etc/squid/allow_client_8h"

acl allow_client_3h src "/etc/squid/allow_client_3h"

#

#

#

acl Uncachable url_regex cgi \?

#

# Only allow cachemgr access from localhost

http_access allow manager localhost

http_access deny manager

# ============================================================================

# Deny requests to unknown ports

http_access deny !Safe_ports

# ============================================================================

no_cache deny Uncachable

http_access allow allow_domain

http_access allow allow_client_inf

http_access deny no_allow_web

http_access deny no_allow_domain

http_access deny no_allow_client

http_access allow allow_client_fore

#

# 下面是只允许每天上八个小时的:

http_access deny no_allow_time_1_1 allow_client_8h

http_access deny no_allow_time_1_2 allow_client_8h

http_access deny no_allow_time_1_3 allow_client_8h

http_access deny no_allow_time_1_4 allow_client_8h

http_access deny no_allow_time_1_5 allow_client_8h

http_access allow allow_client_8h

# 完

#

# 下面是只允许每天上三个小时的:

http_access deny no_allow_time_0_1 allow_client_3h

http_access deny no_allow_time_0_2 allow_client_3h

http_access deny no_allow_time_0_3 allow_client_3h

http_access deny no_allow_time_0_4 allow_client_3h

http_access deny no_allow_time_0_5 allow_client_3h

http_access allow allow_client_3h

# 完

#http_access deny no_allow_time

# ============================================================================

# Deny CONNECT to other than SSL ports

http_access deny CONNECT !SSL_ports

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

#

# And finally deny all other access to this proxy

http_access allow localhost

http_access deny all

#Allow ICP queries from eveyone

icp_access allow all

cache_mgr webmaster@fruitron.com.cn

# httpd_accel_port 80

# +++++++++++++++++++++++++++++++++++ 古公 ++++++++++++透明代理的设定+++++++++

httpd_accel_host virtual

#httpd_accel_port 80

# +++++++++++++++++++++++++++++++++++ 古公 ++++++++++++透明代理的设定+++++++++

# httpd_accel_with_proxy on

# +++++++++++++++++++++++++++++++++++ 古公 ++++++++++++透明代理的设定+++++++++

httpd_accel_with_proxy off

# +++++++++++++++++++++++++++++++++++ 古公 ++++++++++++透明代理的设定+++++++++

# httpd_accel_uses_host_header off

# +++++++++++++++++++++++++++++++++++ 古公 ++++++++++++透明代理的设定+++++++++

httpd_accel_uses_host_header on

# +++++++++++++++++++++++++++++++++++ 古公 ++++++++++++透明代理的设定+++++++++

append_domain .fruitron.com.cn

# ============================================================================

error_directory /usr/lib/squid/errors/Simplify_Chinese

# ============================================================================

# ============================================================================

delay_pools 1 # 1 delay pools

delay_class 1 3 # pool 1 is a class 3 pool

# ============================================================================

#delay_access 1 deny all

delay_access 1 allow allow_client_3h allow_client_8h allow_client_fore allow_client_inf

delay_access 1 deny all

# ============================================================================

# ============================================================================

delay_parameters 1 8000/8000 2000/4000 4000/8000

#delay_parameters 2 8000/8000 4000/8000 4000/8000

#delay_parameters 3 8000/8000 4000/8000 4000/8000

# ============================================================================

# ie_refresh off

# ============================================================================

#ie_refresh on

--------------------

参照一下 ifconfig 的输出,可能效果更好一些:

2002年11月18B4下午13时41分28秒[root@squid gugong]# ifconfig

eth0 Link encap:Ethernet HWaddr 00:50:FE:B7:7A:8D

inet addr:192.168.20.8 Bcast:192.168.20.255 Mask:255.255.255.0

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1

RX packets:11020015 errors:0 dropped:0 overruns:0 frame:0

TX packets:11436178 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:2195933623 (2094.2 Mb) TX bytes:3942280622 (3759.6 Mb)

Interrupt:10 Base address:0xd000

eth0:0 Link encap:Ethernet HWaddr 00:50:FE:B7:7A:8D

inet addr:192.168.10.8 Bcast:192.168.20.255 Mask:255.255.255.0

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1

Interrupt:10 Base address:0xd000

eth1 Link encap:Ethernet HWaddr 00:05:5D:0D:BE:8A

inet addr:211.148.130.133 Bcast:211.148.130.135 Mask:255.255.255.248

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:1710331 errors:0 dropped:0 overruns:0 frame:0

TX packets:1135502 errors:3 dropped:0 overruns:0 carrier:0

collisions:21006 txqueuelen:100

RX bytes:1075231971 (1025.4 Mb) TX bytes:153524789 (146.4 Mb)

Interrupt:11 Base address:0xb800

lo Link encap: Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:7094 errors:0 dropped:0 overruns:0 frame:0

TX packets:7094 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:835017 (815.4 Kb) TX bytes:835017 (815.4 Kb)

--------------------

前言

防火墙在校园内一直被认为陌晦高深,很少有系管师有勇气进行计划性的实验,基本上这份讲义也可以当成测试报告来阅读,是笔者秉持我不入地狱、谁入地狱的精神,冒着生命危险,蛮干出来的成果,也藉此抛砖引玉,希望能带动国内能力高于笔者许多的众家高手,一起来进行有利于校园网络的公益研究!

壹、什么是防火墙

防火墙是一套能够在两个或两个以上的网络之间,明显区隔出实体线路联机的软硬件设备组合。被区隔开来的网络,可以透过封包转送技术来相互通讯,透过防火墙的安全管理机制,可以决定哪些数据可以流通,哪些资料无法流通,藉此达到网络安全保护的目的。

防火墙产品可以概略归类为硬件式防火墙和软件式防火墙,但实际上无论是硬件式或软件式防火墙,它们都需要使用硬件来作为联机介接,也需要使用软件来设定安全政策,严格说两者间的差别并不太大。我们只能从使用的硬件与操作系统来加以区分,硬件式防火墙是使用专有的硬件,而软件式防火墙则使用一般的计算机硬件,硬件式防火墙使用专有的操作系统,而软件式防火墙则使用一般的操作系统。

防火墙依照其运作方式来分类,可以区分为封包过滤式防火墙 (Packet Filter) 、应用层网关式防火墙 (Application-Level Gateway,也有人把它称为 Proxy 防火墙)、电路层网关式防火墙 (Circuit-Level Gateway)。其中被广为采用的是封包过滤式防火墙,本文要介绍的 iptables 防火墙就是属于这一种。

封包过滤是最早被实作出来的防火墙技术,它是在 TCP/IP 四层架构下的 IP 层中运作。封包过滤器的功能主要是检查通过的每一个 IP 数据封包,如果其标头中所含的数据内容符合过滤条件的设定就进行进一步的处理,主要的处理方式包含:放行(accept)、丢弃(drop)或拒绝(reject)。要进行封包过滤,防火墙必须要能分析通过封包的来源 IP 与目的地 IP,还必须能检查封包类型、来源埠号与目的埠号、封包流向、封包进入防火墙的网卡接口、TCP的联机状态等数据。

防火墙由于种种理由价格一直居高不下,对于贫穷的中小学来讲要采购一台防火墙,简直是不可能的任务,而由于 Linux 的风行,使用 Linux 来充作软件式防火墙,似乎是不错的解决之道,本文拟介绍以 Linux 上最新最强大的 iptables 防火墙软件,建置出适合学校使用的过滤规则,让缺钱的学校能有一套好用的防火墙来看守校园网络的大门。

贰、Linux 防火墙演变简史

Linux 最早出现的防火墙软件称为 ipfw,ipfw 能透过 IP 封包标头的分析,分辨出封包的来源 IP 与目的地 IP、封包类型、来源埠号与目的埠号、封包流向、封包进入防火墙的网卡界面......等,并藉此分析结果来比对规则进行封包过滤,同时也支持 IP 伪装的功能,利用这个功能可以解决 IP 不足的问题,可惜这支程序缺乏弹性设计,无法自行建立规则组合(ruleset)作更精简的设定,同时也缺乏网址转译功能,无法应付越来越复杂的网络环境,而逐渐被淘汰。

取而代之的 ipchains,不但指令语法更容易理解,功能也较 ipfw 优越;ipchains 允许自订规则组合(ruleset),称之为 user-define chains,透过这种设计,我们可以将彼此相关的规则组合在一起,在需要的时候跳到该组规则进行过滤,有效将规则的数量大幅缩减,以往 ipfw 仅能进行循序过滤,导致规则又臭又长的毛病,就不药而愈了。除了这个明显的好处以外,ipchains 并能结合本身的端口对应功能和 redir 程序的封包转送机制,模拟出网址转译的能力,而满足 NAT 的完整需求,堪称为一套成熟的防火墙作品。

防火墙软件的出现,确实曾经让骇客们晚上睡不着觉,因为防火墙的阻隔能够有效让内部网络不设防的单机不致于暴露在外,也能有效降低服务器的能见度,减少被攻击的机会,骇客过去所用的网络探测技术因此受到严格的挑战,越来越多的攻击对象躲藏在防火墙后方,让骇客难以接近,因此必须针对新的情势,研究出新的探测技术,藉以规避防火墙的检查,达到发现目标并进而攻击入侵的目的,新的技术非常多,本文并不拟进一步讨论,请自行参考 CERT 组织的技术文件,网址是 www.cert.org ,想看中文请连到 www.cert.org.tw

iptables 作为 ipchains 的新一代继承人,当然也针对骇客不断推陈出新的探测技术拟出一些因应之道,那就是对封包的联机状态,作出更详细的分析,例如:是否为新联机或响应封包、是否为转向联机、联机是否失去响应,联机时间是否过长......等等,透过这样的分析能对一些可能被骇客利用的弱点加以阻隔(请详见后文的说明),另外也开发出真正的封包改写能力,不需要透过其它程序的协助来仿真网址转译,除此之外,iptables 也获得系统核心的直接支持,不需要像 ipchains 那样需要自行重新编译核心。

iptables 优越的性能使它取代了 ipchains,成为网络防火墙的主流,而 ipchains 并未被淘汰,目前 ipchains 已经转型成单机防火墙,在安装新版 Linux 时,会自动被安装启用,以保护单机上未被使用的通讯端口。

参、iptables 防火墙概论

iptables 防火墙的指令非常类似于 ipchains,使用过 ipchains 的人应该很容易上手,但是 iptables 的机制与 ipchains 有很大的不同,使用 ipchains 的概念来设定规则,将会使防火墙无法正常运作。ipchains 跟 iptables 最大的不同在于对 INPUT、FORWARD 、OUTPUT 三个网络函式的定义不同,这三个网络函式是 TCP/IP 驱动程序的一部分,结构如下图所示,是介于网卡驱动程序和应用程序的中间,Linux 核心预设会启用 INPUT、OUTPUT 和 LOOPBACK,而 FORWARD 函式则必须自行启用,可以使用下面指令,或直接修改 /etc/sysconfig/network 组态档:

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

左图为 ipchains 概念下的运作图

从上图可以知道 ipchains 如何处理封包的流动,分述如下:

? IP INPUT:所有封包都由 IP INPUT 函式负责处理,所以设定过滤规则时,几乎都是设定在 INPUT 规则炼上。

? IP FORWARD:目的 IP 非本机的 IP,这些封包需要进一步作转送处理,此函式用来处理 IP 伪装和 Port 转送。

? IP OUTPUT:所有流出的封包都由这个函式处理,通常不需设定任何规则。

iptables 除了上述三支函式以外,还使用两个新的函式:Prerouting、Postrouting。现在来比较一下 iptables 的运作模式(loopback 接口与上图相同,所以省略不画):

从上图可以知道 iptables 如何处理封包的流动,分述如下:

? IP INPUT:只有要到达本机的封包才会 由 INPUT 函式处理,所以会让来自内部网络的封包无条件放行,来自外部网络的封包则过滤是否为 响应封包,若是则放行。

? PREROUTING:需要转送处理的封包由此函式负责处理,此函式用来做目的地 IP 的转译动作(DNAT)。

? IP FORWARD:所有转送封包都在这里处理,这部分的过滤规则最复杂。

? POSTROUTING:转送封包送出之前,先透过这个函式进行来源 IP 的转译动作(SNAT)。

? IP OUTPUT:从本机送出去的封包由这个函式处理,通常会放行所有封包。

iptables 和 ipchains 都可以自行定义规则群组(rule-set),规则群组被称为规则炼(chains),前面所描述的函式,也都有相对应的规则炼(INPUT、FORWARD、OUTPUT、Prerouting、Postrouting),为了有别于自行定义的规则炼,这些规则炼我们就称为内建规则炼,其运作流程仿真如下图:

从上面两张假想图,学员们不难了解 ipchains 为什么要叫做 chains,因为它是将所有规则串接成一个序列逐一检查过滤,就像一条铁链一样一个环接一个环,在过滤过程中只要符合其中一条规则就会立即进行处理,如果处理动作是跳到某个规则群组,则继续检查群组内之规则设定,但如果处理动作是 ACCEPT、REJECT、DROP、REDIRECT 或 MASQUERADE,则会中断过滤程序,而不再继续检查后面的规则设定,在这样的结构之下,有时候规则顺序的对调会产生完全相反的结果,这一点在设定防火墙时不能不谨慎。

而 iptables 是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的 IP 判断是否需要转送出去,接着就会跳到 INPUT 或 Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述流程继续进行下一个规则炼的过滤(注意:这一点与 ipchains 不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。

虽然 iptables 为了扩充防火墙功能,而必须采用比较复杂的过滤流程,但在实际应用时,同一规则炼下的规则设定还是有先后顺序的关系,因此在设定规则时还是必须注意其中的逻辑。

肆、订定校园网络安全政策

在实际设定防火墙之前,我们必须根据校园网络的安全需求,先拟定一份安全政策,拟定安全政策前必须搜集以下资料:

1. 找出需要过滤保护的服务器

2. 条列出被保护的服务器将提供何种网络服务

3. 一般工作站,需要何种等级的保护

4. 了解网络架构与服务器摆放位置

根据这些数据,我们可以决定安全政策,以石牌国小为例:

1. 校内使用 NAT 虚拟网络,IP 数量需要两组 C,所有 IP 均需作 IP 伪装

2. 校园内安全需求不高,服务器与工作站摆在同一网段,不需采用 DMZ 设计

3. 由于服务器功能经常扩充,所有服务器均采用一对一对应,不使用 port 转送功能

4. 所有工作站均能自由使用网络资源,不限制只能看网页

5. 服务器提供之服务包含:dns、web、mail、ftp、wam、webmin、ssh、rdp、pcaw,不提供 proxy 及其它网络服务

6. 为增进校园网络之安全性,采用正面表列方式进行封包过滤(定义想放行之封包,其余封包一律阻挡)

还有一些网络安全须注意的事项,则是每所学校都应防范的,没有等差之别,例如:联机被绑架、阻断式攻击、连接端口扫描......等。

伍、iptables 指令

语法:

iptables [-t table] command [match] [-j target/jump]

-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。各个规则表的功能如下:

nat 此规则表拥有 Prerouting 和 postrouting 两个规则炼,主要功能为进行一对一、一对多、多对多等网址转译工作(SNAT、DNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一封包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。

mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三个规则炼。

除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以便进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。

filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则炼,这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。

常用命令列表:

命令 -A, --append

范例 iptables -A INPUT ...

说明 新增规则到某个规则炼中,该规则将会成为规则炼中的最后一条规则。

命令 -D, --delete

范例 iptables -D INPUT --dport 80 -j DROP

iptables -D INPUT 1

说明 从某个规则炼中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

命令 -R, --replace

范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP

说明 取代现行规则,规则被取代后并不会改变顺序。

命令 -I, --insert

范例 iptables -I INPUT 1 --dport 80 -j ACCEPT

说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。

命令 -L, --list

范例 iptables -L INPUT

说明 列出某规则炼中的所有规则。

命令 -F, --flush

范例 iptables -F INPUT

说明 删除某规则炼中的所有规则。

命令 -Z, --zero

范例 iptables -Z INPUT

说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

命令 -N, --new-chain

范例 iptables -N allowed

说明 定义新的规则炼。

命令 -X, --delete-chain

范例 iptables -X allowed

说明 删除某个规则炼。

命令 -P, --policy

范例 iptables -P INPUT DROP

说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。

命令 -E, --rename-chain

范例 iptables -E allowed disallowed

说明 修改某自订规则炼的名称。

常用封包比对参数:

参数 -p, --protocol

范例 iptables -A INPUT -p tcp

说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含 udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。

参数 -s, --src, --source

范例 iptables -A INPUT -s 192.168.1.1

说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时也可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。

参数 -d, --dst, --destination

范例 iptables -A INPUT -d 192.168.1.1

说明 用来比对封包的目的地 IP,设定方式同上。

参数 -i, --in-interface

范例 iptables -A INPUT -i eth0

说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也可以使用 ! 运算子进行反向比对,例如:-i ! eth0。

参数 -o, --out-interface

范例 iptables -A FORWARD -o eth0

说明 用来比对封包要从哪片网卡送出,设定方式同上。

参数 --sport, --source-port

范例 iptables -A INPUT -p tcp --sport 22

说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:--sport 22:80,表示从 22 到 80 埠之间都算是符合条件,如果要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。

参数 --dport, --destination-port

范例 iptables -A INPUT -p tcp --dport 22

说明 用来比对封包的目的地埠号,设定方式同上。

参数 --tcp-flags

范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设定,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子进行反向比对。

参数 --syn

范例 iptables -p tcp --syn

说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 ! 运算子,可用来比对非要求联机封包。

参数 -m multiport --source-port

范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110

说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。

参数 -m multiport --destination-port

范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110

说明 用来比对不连续的多个目的地埠号,设定方式同上。

参数 -m multiport --port

范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110

说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80 但目的地埠号为 110,这种封包并不算符合条件。

参数 --icmp-type

范例 iptables -A INPUT -p icmp --icmp-type 8

说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码可以用。

参数 -m limit --limit

范例 iptables -A INPUT -m limit --limit 3/hour

说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均一次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封包数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。

参数 --limit-burst

范例 iptables -A INPUT -m limit --limit-burst 5

说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。

参数 -m mac --mac-source

范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则炼上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到哪个网络接口去。

参数 --mark

范例 iptables -t mangle -A INPUT -m mark --mark 1

说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最大不可以超过 4294967296。

参数 -m owner --uid-owner

范例 iptables -A OUTPUT -m owner --uid-owner 500

说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出去,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。

参数 -m owner --gid-owner

范例 iptables -A OUTPUT -m owner --gid-owner 0

说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

参数 -m owner --pid-owner

范例 iptables -A OUTPUT -m owner --pid-owner 78

说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。

参数 -m owner --sid-owner

范例 iptables -A OUTPUT -m owner --sid-owner 100

说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。

参数 -m state --state

范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED

说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。

INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。

ESTABLISHED 表示该封包属于某个已经建立的联机。

NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。

RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

常用的处理动作:

-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:

ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(nat:postrouting)。

REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:

iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式 porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则。例如:

iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例如下:

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。

  评论这张
 
阅读(919)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018