希望那个帮一下我这个新手搞IP代理

由 you98 在 02-04-2003 20:21 发表:

希望那个帮一下我这个新手搞IP代理

我是刚刚学习linix,在搞IP代理的时候,不知道如何处理,情况是这样的,我是用ADSL来上网的,ADSL的驱动我是安装成功,并且能够上网,但是就是我这台linux可以上网,其他电脑无法通过我的linux上网,说明我配置的squid是不成功的,,

我的网络是这样的,电信ADSL--->etho网卡,eth0网卡的地址是192.168.0.3,电信的IP是218.21.X.X(因为是动态的),机子上还有另外一块网卡eth1,eth1---->链接另外一台win2k(win2k的IP是192.168.0.1)的电脑.

我的想法是,能够用linux做代理,win2k通过linux上网,玩游戏,聊QQ,希望有朋友能够给我讲一下如何配置squid.conf,或者发一个配置好的给我看一下[email protected],我也可能发给你,谢谢大家,再次说新年好!


由 eTony 在 02-04-2003 22:52 发表:


聊QQ

squid能够实现么??

或许.........

iptables

socks 可以


Seeking Freedom,pure Freedom!

http://211.92.88.40/~tony/

http://etony.blogone.net/


由 you98 在 02-04-2003 23:11 发表:


那我应该如何做呢?可以指点一下嘛!说句不好听的话,我是想学,但是你的回复里面我找不到什么可以学的东西,如果squid不行,你就直接给我一个可以解决的方法,但是我笨,是不是可以给详细点的配置出来?


由 eTony 在 02-04-2003 23:21 发表:

架设 Squid 代理服务器[转帖]

架设 Squid 代理服务器

摘要:

Linux 目前已经逐步成为网络的同义词。它可以在办公环境或日常家庭中作为文件服务器、打印服务器、

邮件服务器以及应用软件服务器来使用, 并且逐渐作为代理服务器来使用。

一台代理服务器可以通过一个Internet连接在同一时间为不同的用户提供Internet访问服务。好的代理服

务器同时还为访问请求提供缓存服务,这样当一个本地访问请求到达时,代理服务器会先在缓存记录里查

找有无相同的请求,如果有,则从缓存中把数据直接回送到客户端,从而缩短访问WEB的时间并减轻带宽

的压力。

Squid 是一个支持Proxy、HTTP缓存、Ftp、Gopher 等等的软件,它也支持SSL、访问控制、DNS缓存并且为

所有的请求做记录。Squid 在 Windows NT 下也可用,详见 Logi Sense.

本文的重点是为配置一台代理服务器并为用户提供可控访问提供基本的指导。

Squid 已经安装了吗?

Squid 的 rpm 文件已经和 RedHat 7.1 捆绑发行了,在安装系统的时候,如果在 Networks 选项中选中的

话,它会自动安装在系统上。您可以用下面的命令检查您的系统中是否已经安装了 Squid:

rpm -q squid

Squid 的最新版本可以在 Squid 主页 或它的镜像站点得到。 Squid 可以用下述命令安装在系统上:

rpm -ivh squid-2.3.STABLE4-10.i386.rpm

配置 Squid

Squid 的定制是通过编辑它的配置文件 squid.conf 来实现的,squid.conf 文件通常在 /etc/squid 目录

下。这个配置文件内容很多,但好在它的每个选项都有详尽的说明。

首先要修改的是 http_port,这个选项指定了 Squid 监听客户请求的端口,默认值是 3128。要使用代理

功能,这个端口值要和运行 Squid 的机器的 IP 地址一起使用,可以修改成下面这样:

http_port 192.168.0.1:8080

上述声明表示 Squid 绑定在 IP 地址 192.168.0.1 上,端口为 8080。端口可以设置为任意,但要确认

没有其他程序会使用同样的端口。其他的服务请求的端口设置也可以设为类似的配置。

上述声明表示 Squid 绑定在 IP 地址 192.168.0.1 上,端口为 8080。端口可以设置为任意值,但要确认

没有其他程序会使用同样的端口。其他的服务请求的端口设置也可以设为类似的配置。

访问控制

使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。 Squid 访问控制有两个要素:ACL 元素和 访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。

下面列出一些重要的 ACL 元素类型

  • src : 源地址 (即客户机IP地址)

  • dst : 目标地址 (即服务器IP地址)

  • srcdomain : 源名称 (即客户机名称)

  • dstdomain : 目标名称 (即服务器名称)

  • time : 一天中的时刻和一周内的一天

  • url_regex : URL 规则表达式匹配

  • urlpath_regex: URL-path 规则表达式匹配,略去协议和主机名

  • proxy_auth : 通过外部程序进行用户验证

  • maxconn : 单一 IP 的最大连接数

为了使用控制功能,必须先设置 ACL 规则并应用。ACL 声明的格式如下:

acl acl_element_name type_of_acl_element values_to_acl

注:

1. acl_element_name 可以是任一个在 ACL 中定义的名称。

2. 任何两个 ACL 元素不能用相同的名字。

3. 每个 ACL 由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换言之,即任一 ACL

元素的值被匹配,则这个 ACL 元素即被匹配。

4. 并不是所有的 ACL 元素都能使用访问列表中的全部类型。

5. 不同的 ACL 元素写在不同行中,Squid 将把它们组合在一个列表中。

我们可以使用许多不同的访问条目。下面列出我们将要用到的几个:

  • http_access: 允许 HTTP 访问。这个是主要的访问控制条目。

  • no_cache: 定义对缓存请求的响应。

访问列表的规则由一些类似 'allow' 或 'deny' 的关键字构成,用以允许或拒绝向特定或一组 ACL 元素提供服务。

注:

1. 这些规则按照它们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束。

2. 一个访问列表可以又多条规则组成。

3. 如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。

4. 一个访问条目中的所有元素将用逻辑与运算连接:

http_access Action 声明1 AND 声明2 AND 声明 OR.

http_access Action 声明3

多个 http_access 声明间用或运算连接,但每个访问条目的元素间用与运算连接。

5. 请记住列表中的规则总是遵循由上而下的顺序。

回到配置 Squid

Squid 默认不做任何用户访问控制。若要允许某个访问,必须进行定制规则。在 squid.conf 中 http_access deny 行前输入下述文字:

acl mynetwork 192.168.0.1/255.255.255.0

http_access allow mynetwork

mynetwork 是 acl 名称,下一行则是适用于特定 acl (即 mynetwork ) 的规则。192.168.0.1 指明是网络中掩码为 255.255.255.0 的子网。mynetwork 主要是为了给出网络上一组机器,下一条规则则允许这些

机器访问 http 服务。上述修改配合 http_port 就可以让 Squid 很好的工作起来了。 修改完成后,Squid

可以用下述命令启动:

service squid start

注:

Squid 也可以在系统启动的时候自动运行,方法是在 ntsysv 或 setup(系统服务菜单)中打开 Squid。在

对配置文件做了任何更改之后,当前正运行的 Squid 进程必须重新启动。可以用下面的命令来完成:

1. service squid restart 或

2. /etc/rc.d/init.d/squid restart

配置客户端

由于客户端的请求是送到代理服务器的特定端口的,因此,客户端也要做相应配置。在继续下一步之前,请

确认要访问代理服务器的客户端已经连接在局域网中并已分配了有效的 IP 地址,请确认它们都能 ping 通

运行了 Squid 的 Linux 服务器。

在 Internet Explorer 下的配置:

1. 点击菜单上的 工具 -> Internet 选项

2. 选择 连接 并单击 局域网设置

3. 选中 使用代理服务器 输入上述代理服务器的 IP 地址和端口。

在 Netscape Navigator 下的配置:

1. 点击菜单上的编辑(Edit)->首选项(Preference)->高级(Advanced)->代理服务器(Proxies)。

2. 选中手动配置代理服务器(Manual Proxy Configuration)。

3. 点击查看(View) 并

4. 输入上述代理服务器的 IP 地址和端口。

使用访问控制

多个访问控制及其规则为客户端访问控制提供了一种灵活的机制。下面给出通常所用到的例子:

1. 允许列表中的机器访问 Internet。

acl allowed_clients src 192.168.0.10 192.168.0.20 192.168.0.30

http_access allow allowed_clients

http_access deny !allowed_clients

这个规则只允许 IP 地址为 192.168.0.10、192.168.0.20 及 192.168.0.30 的机器

访问 Internet,其他 IP 地址的机器则都被拒绝访问。

2. 限制访问时段。

acl allowed_clients src 192.168.0.1/255.255.255.0

acl regular_days time MTWHF 10:00-16:00

http_access allow allowed_clients regular_days

http_access deny !allowed_clients

这个规则允许子网192.168.0.1中的所有客户机在周一到周五的上午10:00到下午4:00

访问 Internet。

3. 为不同的客户机分配不同的访问时段。

acl hosts1 src192.168.0.10

acl hosts2 src 192.168.0.20

acl hosts3 src 192.168.0.30

acl morning time 10:00-13:00

acl lunch time 13:30-14:30

acl evening time 15:00-18:00

http_access allow host1 morning

http_access allow host1 evening

http_access allow host2 lunch

http_access allow host3 evening

http_access deny all

在这个规则中,主机 host1 可以在 morning 和 evening 时段访问 Internet,主机

host2 和 host3 分别只能在 lunch 和 evening 时段访问 Internet。

注:

一个访问条目中所有的元素之间用与运算按下述方式连接 :

http_access Action statement1 AND staement2 AND statement OR.

多个 http_access 声明之间用或运算连接而每个访问条目中的元素用与运算连接,见

下:

http_access allow host1 morning evening

无法在时段 morning 和时段 evening 同时进行(morning AND evening ),这个表达

式将不会返回真值(TRUE),从而这个条目将不会引发任何动作。

4. 站点屏蔽

Squid 可以屏蔽某些特定站点或含有某些特定字词的站点。可以用下面的规则实现:

acl allowed_clients src 192.168.0.1/255.255.255.0

acl banned_sites url_regex abc.com ()(.com

http_access deny banned_sites

http_access allow allowed_clients

也可以用以屏蔽含有某些特定字词(比如说 dummy、fake)的站点

acl allowed_clients src 192.168.0.1/255.255.255.0

acl banned_sites url_regex dummy fake

http_access deny banned_sites

http_access allow allowed_machibes

在实际应用中,不需要把需屏蔽的所有站点或字词都列在上面,可以先保存在一个文件

中(请查看 /etc 目录中的 banned.list文件)ACL 将从这个文件中读出所需信息用以

屏蔽被禁止的站点。

acl allowed_clients src 192.168.0.1/255.255.255.0

acl banned_sites url_regex "/etc/banned.list"

http_access deny banned_sites

http_access allow allowed_clients

5. 优化

Squid 可以通过使用 maxconn 元素来限制客户端连接的数目。 要使用这个选项,必须

先允许 client_db。

acl mynetwork 192.168.0.1/255.255.255.0

acl numconn maxconn 5

http_access deny mynetwork numconn

注:

maxconn ACL 使用小于(less-than)对比。此 ACL 规则将在连接数大于设定值时被匹配。

这是 ACL 不与 http_access 允许规则连用的主要原因。

6. 缓存数据

对于静态页面,缓存的数据能够立刻回送到发出请求的客户端。没有必要去缓存 cgi-bin

或 Servlet,这些可以用 ACL 元素 no_cache 来禁止。

acl cache_prevent1 url_regex cgi-bin /?

acl cache_prevent2 url_regex Servlet

no_cache deny cache_prevent1

no_cache deny cache_prevent2

7. 自定错误反馈信息

可以用拒绝规则的 deny_info 选项来自定错误反馈信息。Squid 默认的错误信息放在

/etc/squid/errors 目录中。这个目录可以用 error_directory 选项指定。您也可以

定制现存的错误反馈信息。

acl allowed_clients src 192.168.0.1/255.255.255.0

acl banned_sites url_regex abc.com ()(.com

http_access deny banned_sites

deny_info ERR_BANNED_SITE banned_sites

http_access allow allowed_clients

在上面的例子中,当用户试图访问被禁止的站点时,将会显示一条定制的信息。

ERR_BANNED_SITE 选项中的文件名必须在上述的错误信息的目录中。错误信息必须是 HTML 格

式的。上面列出了 ACL 的一些选项,您可以参看 Squid 主页上的 FAQ 文档 以获得使用 ACL

更多的信息。

日志

Squid 的所有日志文件都存放在 /var/log/squid 目录中,有缓存日志、访问日志和 store.log文件。文

件 access.log 记录了有关客户机的请求、连接活动、每个 HTTP & ICP 询问、客户机 IP 地址、请求方

式、请求的 URL 等等信息。这些数据可以用来对访问进行分析。许多程序如 sarg、 calamaris, Squid-Log-Analyzer 都可以用来分析这些数据并产生 HTML 格式的分析报告。 这些报告可以在一组用户、一组

IP 地址或一组访问过的站点等等记录中产生。

这些记录文件也可以成为下面这样:

cache_access_log For access.log

cache_log For cache.log

cache_store_log For store.log (Store manager)

pid_filename Squid process ID file name

验证方式

Squid 的默认配置允许任何用户不经过验证过程就可以进行访问。Squid 通过一个外部程序提供用户验证

功能(比如说只允许有效的用户访问 Internet),这就需要一个有效的用户名和密码。可以用 proxy_auth

ACL 和 authenticate_program 来实现,在允许访问前强制进行用户名和密码的核查。下面列出一些 Squid

能用到的验证程序:

1. LDAP : 使用 Linux Lightweight 目录访问协议(Linux Lightweight Directory Access Protocol)

2. NCSA : 使用 NCSA 风格的用户名和密码档

3. SMB : 使用 SMB 协议的服务,如 SAMBA 或 Windows NT

4. MSNT : 使用 Windows NT 的域验证

5. PAM : 使用 Linux 的可装载验证模块

6. getpwam : 使用 Linux 密码档

必须指定使用的验证程序,可以用 authenticate_program 选项完成。请确认选定的验证程序已安装并能很

好的工作。

修改 squid.conf 文件选定验证程序

authenticate_program /usr/local/bin/pam_auth

acl pass proxy_auth REQUIRED

acl mynetwork src 192.168.0.1/255.255.255.0

http_access deny !mynetwork

http_access allow pass

http_access deny all

这个规则表示,使用 PAM 验证程序,所有用户在获得访问许可前必须进行验证。

还有些选项比如 authenticate_ttl 和 authenticate_ip_ttl,可以用来改变验证程序的动作,比如说使某个用户名及密码重新生效。


Seeking Freedom,pure Freedom!

http://211.92.88.40/~tony/

http://etony.blogone.net/


由 eTony 在 02-04-2003 23:22 发表:

Linux 2.4 Packet Filtering HOWTO 简体中文版[转贴]

Rusty Russell, mailing list [email protected]

$Revision: 1.3 $ $Date: 2002/06/05 13:21:56 $

简体中文:洋鬼鬼·NetSnake

感谢 网中人[email protected] 提供的繁体参照

此文档描述在Linux2.4 内核中,如何使用iptables过滤不正确的包

(译者:Packet在很多专业书籍中译为分组,此处根据大部分人的习惯,仍译为包)

1. 简介

2. 官方站点及邮件列表

3. 那么,什么是Packet Filter?

3.1 我为什么需要Packet Filter?

3.2 如何在Linux下进行包过滤?

3.2.1 iptables

3.2.2 创建永久性规则

4. 你算老几,凭什么玩弄我的内核?

5. Rusty的真正的包过滤快速指南

6. 包是如何穿过过滤器的

7. 使用iptables

7.1 当计算机启动后你会看到的

7.2 对单个规则的操作

7.3 过滤规格

7.3.1 指定源和目的IP地址

7.3.2 反向指定

7.3.3 协议指定

7.3.4 接口指定

7.3.5 分片指定

7.3.6 iptables扩展:新的匹配

7.3.6.1 TCP 扩展

7.3.6.1.1 TCP标志的解释

7.3.6.2 UDP 扩展

7.3.6.3 ICMP扩展

7.3.6.4 其他匹配的扩展

7.3.6.5 状态匹配

7.4 目标规格

7.4.1 用户定义链

7.4.2 iptables扩展:新目标

7.4.3 特殊的内建目标

7.5 对整个链进行操作

7.5.1 创建新链

7.5.2 删除链

7.5.3 清空一个链

7.5.4 对链进行列表

7.5.5 重置(清零)计数器

7.5.6 设置原则(默认规则)

8. 使用ipchains和ipfwadm

9. NAT和包过滤的混合使用

10. iptables和ipchains之间的差别

11. 对制定包过滤器的建议

1. 简介

欢迎,亲爱的读者。

这篇文章假设你知道有关IP地址、网络地址、网络掩码、选路和DNS。如果不知道,我建议你先阅读网络概念的HowTo(Network Concepts HOWTO)。

这篇HOWTO并非一个简要的介绍(会让你发热、发毛,没有安全感),也非一个完全的原始的披露(最吃苦耐劳的人也会被搅晕,不过必定会有所斩获)。

你的网络并不安全。问题在于,必须获取快速、简洁的通讯,但又必须限于良好的、无恶意的行为,就如同在嘈杂的大戏院里,你可以高谈阔论,但是绝不能大喊:着火了!。这篇HOWTO不能解决这种问题。

(译者:所有安全都只是相对的,否则根本不会产生这种东西了)

因此,你只能决定在哪方面妥协。我想帮助你使用一些可用的工具和一些通常需要注意的漏洞,希望你将它们用在好的一面,而不是出于恶意的目的 -- 另一个同样重要的问题。

(C) 2000 Paul `Rusty' Russell. Licenced under the GNU GPL.

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

2、 官方站点及邮件列表位置

这里有三个官方站点:

o Thanks to Filewatcher http://netfilter.filewatcher.org.

o Thanks to The Samba Team and SGI http://netfilter.samba.org.

o Thanks to Harald Welte http://netfilter.gnumonks.org.

你可以通过以下站点访问全部相关站点。

http://www.netfilter.org and http://www.iptables.org

以下是netfilter官方邮件列表

http://www.netfilter.org/contact.html#list.

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

3.那么,什么是包过滤器?

包过滤器是这样一种软件:它检查通过的每个包的头部,然后决定如何处置它们。可以这样对待它们:丢弃(也就是说,如果这个包从未被接受,那么丢弃它),通过(也就是说,让包通过),或者更复杂的(操作)。

Linux下,包过滤内建在内核中(内核模块,或者内建),而且我们还有处理包的一些技巧,不过检查头部和处理包的一般性原则仍在这里。

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

3.1 我为何要包过滤?

控制、安全、警戒。

控制:

当你用你的Linux服务器把你的内部网和另一个网络(就是Internet吧)连起来,你可以决定哪些通信是允许的,哪些不允许。例如,包头部包含了包的目标地址,你可以阻碍包发送到(你)确定的几个外部网络,另一个例子,我用NetScape连接到Dilbert archives。页面上有来自doubleclick.net的广告,然后NetScape浪费了我的时间愉快的下载他们。 告诉包过滤器禁止任何来自或者发往doubleclick.net地址的包,问题就解决了。(当然有更好的办法,见Junkbuster)。

安全:

当Linux服务器是混乱的Internet和你良好的、有序的网络之间唯一的东西时, 你最好能知道哪些东西可以进入你的大门。例如,你可以允许所有(包)从你的网络 发出,不过你可能会为来自外部的著名的“Ping of Death”而焦急。另一个例子,你不希望 外人telnet到你的Linux服务器,尽管所有账户都有密码。或许你只想(像绝大多数人)成为 Internet的旁观者,而非它的服务器(也可能愿意是吧)。简单的不允许任何人接入,设置 包过滤器拒绝所有进入的包(是不错的办法)。

警戒:

有时,本地网络上错误配置的机器可能会向外部喷射出大量的包。最好是当(网络中)出现任何不正常现象时,让包过滤器告诉你。这样你可能可以做点什么,或者你天生就很好奇。

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

3.2 如何在Linux下进行包过滤?

Linux内核在其1.1系列中就有了包过滤功能。第一代,由Alan Cox 1994年移植于BSD的ipfw。这在Linux 2.0中由Jos Vos和其他人进行了加强;用户空间工具'ipfwadm'可用来控制内核过滤规则。1998年中,我在Michael Neuling的帮助下,为Linux 2.2进行了重写,推出了用户空间工具'ipchains'。最后,1999年中,基于Linux 2.4的第四代工具,'iptables',和其他内核的改写正式推出。这就是这个iptables的HOWTO文档的所在。

译者:userspace根据台湾同胞的说法,是用来区别系统内存中的适用范围的,分为核心空间和使用者空间,不必深究)

你需要包含netfilter架构的内核。netfilter是Linux中的一个通用框架,也可以插入(plug in)其他内容(如iptables模块)。也就是说你需要2.3.15及以后版本,而且在配置内核时对CONFIG_NETFILTER回答'Y'。

iptables这个工具用来和内核交互并告诉它哪些包应该过滤。除非你是程序员或者 特别好奇,否则这就是你用来控制包过滤的了。

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

3.2.1. iptables

iptables工具向内核的包过滤表中插入和删除规则。这就意味着无论怎样设置,启动后信息都会丢失;请参看“制定永久性规则”(Making Rules Permanent)来确定如何保证下次启动这些规则能被恢复。

iptables是ipfwadm和ipchains的替代品。如果你是它们的使用者,请参看 “使用ipchains和ipfwadm”,如何轻松使用iptables。

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

3.2.2 创建永久性规则

你当前的防火墙设置保存在内核中,所以重启后就会丢失。你可以试着用iptables-save和iptables-restore脚本来保存他们,并由一个文件恢复。

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

4. 你算老几,凭什么玩弄我的内核?

我是Rusty Russell。Linux IP防火墙的维护者,也是一个适当的时候出现在适当的地方的coder。我写了ipchains(参见“如何在Linux下进行包过滤?”看看实际的工作其实由哪些人完成),并希望能学到足够的东西修正这次的包过滤。

WatchGuard,一个非常出色的防火墙公司,总之一堆广告,此处省略一千字……

在此,我想澄清一个误解:我不是内核专家,我了解它,是因为我的核心工作让我接触了他们:David S. Miller, Alexey Kuznetsov, Andi Kleen, Alan Cox。无论如何,他们做了最深层的工作,轮到我时,已经非常安全和容易了。

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

5. Rusty的真正的包过滤快速指南

绝大部分人只有一个PPP连接到Internet,而且不希望有人由此进入他们的网络或者防火墙:

插入connection-tracking模块(如国内建在内核中就不需要)

insmod ip_conntrack

insmod ip_conntrack_ftp

对创建大量新的连接创建一个链,除非这些连接来自内部。

iptables -N block

iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT

iptables -A block -j DROP

由INPUT和FORWARD链跳往(刚刚创建的)那条链。

iptables -A INPUT -j block

iptables -A FORWARD -j block

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

6. 包是如何穿过过滤器的

内核由'filter'表中的以下三个规则开始。这些被称为防火墙链或就叫链。这三个链分别是 INPUT、OUTPUT和FORWARD。

对于ASCII艺术迷来说,链好象这样:(注意:这与2.0和2.2内核非常不同)

译者:ASCII艺术,这里指的是利用纯ASCII文本作图


Incoming / \ Outgoing

-->[Routing ]--->|FORWARD|------->

[Decision] \_____/ ^

| |

v ____

___ / \

/ \ |OUTPUT|

|INPUT| \____/

\___/ ^

| |

----> Local Process ----

三个圈代表上面说的三个链。当包到达图中的一个圈,那个链就检查并确定包的命运。 如果链决定DROP包,包在那里就被杀死。但是如果链决定让包ACCEPT,包就继续在图中前进。

一个链是规则的列表。每个规则都会说:'如果包头看上去像这个的话,那么就这样处理'。 如果规则和包不匹配,由链中的下一个规则处理。最后,如果再也没有要进行处理的规则了, 内核就根据链的原则(policy,有时称为默认规则)来决定应当如何做。在一个注重安全的 系统中,原则通常是让内核丢弃这个包。

1. 当一个包进入时(就是由以太网卡),内核首先检查包的目的地。这被称作“选路”。

2. 如果它就是进入本机的,包会向图中的下方移动,到达INPUT链。如果到了这里,任何等待这个包的进程都会收到它。

3. 否则,如果内核未被允许转发,或者不知道该如何转发这个包,它会被丢弃。如果允许转发,而且包的目的地是另一个网络接口(如果你有另一个的话),那么包向我们图中的右边行进,到达FORWARD链。如果允许通过(ACCEPT),它就被送了出去。

4. 最后,服务器上运行的程序可以发送网络包。这些包马上通过OUTPUT链。如果被允(ACCEPT),那么包继续向可以到达它的目的地的网络接口发送。

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

7. 使用iptables

iptables有着非常详尽的使用手册(man iptables),而且如果你需要某个选项更详细的介绍。看看“iptables和ipchains的差别”可能对你非常有用。

使用iptables你可以做很多不同的事。开始的内建的三个链INPUT、OUTPUT和FORWARD是不能被删除的。让我们看看整个链的管理。

1. 创建一个新的链 (-N)。

2. 删除一个空链(-X)。

3.修改内建链的原则(-P)。

4. 显示链中的规则(表)(-L)。

5. 清空一个链(-F)。

6. 将链中所有规则的包和字节计数器清零(-Z)。

有几种办法操作链中的规则:

1. 向链中添加一条新规则(-A)。

2. 在链中某个位置插入一条新规则(-I)。

3. 替换某个位置的规则(-R)。

4. 删除链中某个位置的规则,或者是第一个被匹配的。(-D)。

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

7.1. 当计算机启动后你会看到的

ptables可以作为模块,称为'iptables_filter.o,可以在第一次运行iptables时自动被装载。也可以永久性的编到内核中。

在所有iptables命令执行之前(当心:某些发布版会在初始化脚本中运行iptables),所有内建链中都没有任何规则('INPUT'、'FORWARD'和'OUTPUT'),所有链的原则都是ACCEPT。你可以在装载iptable_filter模块时,提供'forward=0'选项来修改FORWARD的默认原则。

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

7.2. 对单个规则的操作

这是基本的包过滤:管理规则,添加(-A)和删除(-D)命令可能是最常用的。其他的(-I插入和-R替换)只是简单的扩展而已。

每个规则都有一组条件来匹配包,和如果匹配了该如何做(target)。例如,你可能希望丢弃所有来自127.0.0.1的ICMP包。这样我们的条件就是协议必须是ICMP,而且源地址必须是127.0.0.1,我们的目标是丢弃(DROP)。127.0.0.1是一个回送接口,即使你没有真正的网络连接它也会存在。你可以用ping程序生成这样的包(它简单的发送ICMP 类型8(echo request),所有愿意响应的主机都会用ICMP 类型0(echo reply)来响应)。这对于测试非常有用。

ping -c 1 127.0.0.1

PING 127.0.0.1 (127.0.0.1): 56 data bytes

64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

--- 127.0.0.1 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.2/0.2/0.2 ms

iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

ping -c 1 127.0.0.1

PING 127.0.0.1 (127.0.0.1): 56 data bytes

--- 127.0.0.1 ping statistics ---

1 packets transmitted, 0 packets received, 100% packet loss

这里,第一个ping是成功的('-c 1'告诉ping只发送一个包)

然后我们可以向'INPUT'链中添加(-A)一个规则,制定来自127.0.0.1('-s 127.0.0.1')的ICMP协议('-p icmp')包都将被丢弃('-j DROP')。

然后我们测试我们的规则,用第二个ping。在程序放弃等待永远不可能的响应之前,会暂停一下。

我们可以用两种办法中的任一种删除规则。首先,因为知道这是INPUT链中唯一的规则,我们用编号删除:

iptables -D INPUT 1

删除INPUT链中的编号为1的规则

第二种办法是 -A 命令的映射,不过用-D替换-A。当你的链中规则很复杂,而你不想计算它们的编号的时候这就十分有用了。这样的话,我们可以使用:

iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP

-D的语法必须和-A(或者-I或者-R)一样精确。如果链中有多个相同的规则,只会删除第一个。

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

7.3 过滤规格

我们已经看了,用'-p'指定协议,用'-s'指定源地址,不过还有其他选项我们可以用来指定包的特征。下面是一个详细的手册。

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

7.3.1 指定源和目的IP地址

源('-s','--source'或'--src')和目的('-d','--destination'或'--dst')IP地址可以用四种办法指定。最常用的方法是使用全名,就像'localhost'或者'www.linuxhq.com'。第二种办法是指定IP地址,如'127.0.0.1'。

第三和第四种办法允许指定一组IP地址,就像'199.95.207.0/24'或者'199.95.207.0/255.255.255.0'。这指定了从199.95.207.0到199.95.207.255范围内的所有IP地址。'/'后面的数字说明哪部分IP地址是有效的。'32'或者'255.255.255.255‘为默认的(匹配整个IP地址)。用'/0'来指定任何IP地址,像这样:

'-s 0/0'在这里是多余的

iptables -A INPUT -s 0/0 -j DROP

这很少用到,这和上面出现过的不指定'-s'结果完全一样。

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

7.3.2 反向指定

很多标记,包括'-s'(或'--source')和'-d'('--destination')标记可以在前面加上'!'标志(读作'not'),来匹配所有和给出的 NOT 的地址。例如, '-s ! localhost'匹配所有不是来自本机的包。

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

7.3.3 协议指定

可以用'-p'(或'--protocol')指定协议。协议可以是数字(如果你知道IP的协议数值)或者像'TCP'、'UDP'或者'ICMP'这类的名称。大小写无所谓,所以'tcp'和'TCP'一样。

协议名称前可加上'!',以反向解释它,例如'-p ! TCP'将匹配所有不是TCP的包。

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

7.3.4 接口指定

'-i'(或'--in-interface')和'-o'(或'--out-interface')选项指定匹配的接口名。接口可以是包进入的('-i')或者送出('-o')的物理设备。你可以用ifconfig命令列出当前'up'的接口。(也就是说正在工作的)。

通过INPUT链的包不会有送出接口,所以在这个链中'-o'永远不会匹配。同样,通过OUTPUT链的包也没有进入接口,这个链中的'-i'也不会被匹配。

只有通过FORWARD链的包才有进入和送出两个接口。

可以指定一个当前不存在的接口。在这个接口可用之前,规则不能匹配任何东西。这对于拨号PPP连接及类似的非常有用(通常是ppp0接口)。

一个特殊情况,接口名后面是一个'+',那就会匹配以这个字符串开头的所有接口(无论当前是否存在)。例如,指定一个匹配所有ppp接口的规则,要用到-i ppp+选项。

接口名也可以在前面插入 '!',来匹配所有与指定接口不同的包,如-i ! ppp+。

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

7.3.5 分片指定

译者:为帮助大家理解,此处附上IP数据报的格式,摘自《Internetworking with TCP/IP》

0 4 8 16 19 24 31

版本号 首部长度 服务类型 总长度

标志符 标志 分片偏移量

寿命 协议 首部效验和

源IP地址

目的IP地址

IP选项 填充

数据

……

有时一个包太大,不可能适合所有线路。这样的话,包会被分成片,然后当作多个包发送。最终重组这些分片来重建整个包。

分片的问题是,被检查的初始片含有整个头部字段(IP+TCP,UDP和ICMP),但随后的包只有一部分头(没有附加协议字段的IP),因此,检查后面的分片的头部(就像有TCP、UDP和ICMP一样)是不可能的。

如果你在做NAT或连接追踪,那么所有分片在包过滤代码处理以前都会合并,所以你不需要为分片担心。

还请注意,到filter表中的INPUT链(或者任何由NF_IP_LOCAL_IN钩子程序钩入的表)的包实际上由核心IP栈片重组后到达。

否则,理解分片是如何被过滤规则处理的就非常重要了。任何过滤规则要求我们没有的信息,将被认为不匹配。这意味着(分片的)第一片像普通的包一样被处理。第二及后面的片则不会。因此,规则 -p TCP --sport www(指定源端口为'www')永远不会匹配一个分片(的包)(除了第一片),相反的规则 -p TCP --sport ! www也不会。

无论如何,你可以用'-f'(或'--fragment')标记指定专门处理第二及以后的分片的规则。当然也可以指定一个规则,让它不去匹配第二及以后的分片,在'-f'前加上'!'。

通常,让第二及以后的分片通过被认为是安全的,因为如果过滤处理了第一片,那么就无法在目标主机上进行重组。不过,已知的Bug是发送分片可能会轻易的让主机崩溃。你自己看着办吧。

网络高手注意:当这类检查进行时,畸形的包(防火墙读取的ICMP代码和类型过短的TCP、UDP和ICMP包)都将被丢弃。所以TCP分片从位置8开始。(译者:什么意思?大概是指IP包中的首部字段位置)

例如,下面的规则会丢弃任何发往192.168.1.1的分片。

iptables -A OUTPUT -f -d 192.168.1.1 -j DROP

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

7.3.6 iptables扩展:新的匹配

iptables是可扩展的,也就是包括内核和iptables工具都可以扩充新的特性。

下列部分扩展是标准的,其他的则是派生的。其他人可以做出扩展并发布给合适的人。

内核扩展一般位于内核模块子目录,诸如/lib/modules/2.4.0-test10/kernel/net/ipv4/netfilter。如果你使用了CONFIG_KMOD设置来编译内核,那么它们要求被装载,所以你不需要手工插入。

iptables程序扩展通常是位于/usr/local/lib/iptables/下的共享库,当然也可能在/lib/iptables或者/usr/lib/iptables,具体的要根据不同的发行版本来确定。

扩展有两种:新的目标,新的匹配(我们马上会谈到新的目标)。有些协议自动给出新的测试:如下所示,现有的包括TCP、UDP和ICMP。

这样,你可以在命令行中在 '-p'选项后指定新的测试,就可以载入扩展(模块)了。当允许扩展时,可以用'-m'选项装入扩展。

在选项后面('-p','-j'或者'-m')加上 '-h'或'--help'来获取扩展的帮助。

iptables -p tcp --help

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

7.3.6.1. TCP 扩展

如果指定了'-p tcp',那么TCP扩展将自动加载,并提供下列选项(不匹配分片)。

--tcp-flags

可附加一个'!'。有两个标志字串可以通过TCP标记来过滤。第一个标志字符串是mask:你想要测验的标志列表。第二个指出哪些将要被设置。例如:

iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP

意思是所有标志都将被测试('ALL'和'SYN, ACK,FIN,RST,URG,PSH'同义),不过只设置SYN和ACK。当然也可以用'NONE'表示无标志。

--syn

前面的'!'是可选的,是'--tcp-flags SYN, RST, ACK, SYN'的缩写

--source-port

后面可以跟一个'!',可以是单个TCP端口,或一段端口。可以是/etc/services中的端口名或者数字。端口范围格式是低端口名 : 高端口名,或者(指定大于或等于给出的端口)是端口名 + :,或者(指定小于或等于给出的端口)是: + 端口名。

--sport

就是 '--source-port'。

--destination-port

--dport

和上面类似,不过是指定匹配的目的端口(范围)。

--tcp-option

可以跟一个'!'和一个数字,匹配的是TCP选项和数字相等的包。如果试图用 这个TCP选项匹配一个没有完整的TCP包头的包,那么这个包会被自动丢弃。

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

7.3.6.1.1. TCP标志的解释

有时只允许单向的TCP连接会很有用。例如,你可能会允许连接到外部WWW服务器,但不会允许来自那个服务器的连接。

最简单的举动可能是阻止来自那个服务器的包,可惜,TCP连接需要包双向传送(才能正常工作)。

解决办法是,只阻挡那些用来请求连接的包。这些包称为SYN包(OK,从技术上说,它们的SYN标志被设置,而没有设置RST和ACK标志,不过我们简单的称为SYN包)。通过只阻止这种包,我们就可以阻止来自那些地方的连接企图。

'--syn'标志是这样用的:只对指定了TCP协议的规则有效。例如,指定来自192.168.1.1的连接请求。

-p TCP -s 192.168.1.1 --syn

当然也可以在前面加上'!',意即所有不是初始连接的包。

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

7.3.6.2 UDP 扩展

这些扩展在指定'-p udp'时自动加载。可以提供 '--source-port'、'--sport'、'--destination-port'和'--dport'等和TCP类似的选项。

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

7.3.6.3 ICMP扩展

这些扩展在指定'-p icmp'时自动加载。只提供一个新的选项:

--icmp-type

可以跟'!',icmp类型名称(如'host-unreachable')或者数值(如'3'),或者数值类型/代码(如'3/3')。用'-p icmp --help'可以列出可用的icmp类型名。

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

7.3.6.4 其他匹配的扩展

这些netfilter包中的其他扩展尚属于演示阶段,(如果安装了的话)可以用'-m'来启用。

mac

--mac-source

可以跟一个'!',后面是以太网地址,用冒号分隔的16近制表示,如`--mac-source 00:60:08:91:CC:B7'。

limit

此模块必须明确指定'-m limit'或'--match limit'。用来限制匹配的速率。就像抑制记录信息。只会匹配给定的数字/每秒(默认是每小时3个匹配,和5个触发)。可以有两个参数:

--limit

后面跟数字:指定每秒钟允许的匹配最大平均数。这个数字可以指定 明确的单位,使用'/second'、/minute'、/hour' 或者 `/day',或者 只写一部分(如'5/second'和'5/s'一样)。

--limit-burst

后面跟一个数字,指明在上面的limit起作用前最大的触发值。

这个匹配(项)通常和LOG目标结合起来使用,以对速率限制进行记录。 为了理解它是如何工作的,我们来看看下面这条规则,它使用默认限制参数 记录包。

iptables -A FORWARD -m limit -j LOG

当这条规则第一次启用时,包开始被记录。实际上,由于默认触发是5,前五个包会被记录。然后,每隔20分钟再记录一次包,无论这期间有多少包到达。而且,每个不匹配包的20分钟间隔里,会恢复一个触发(值)。如果100分钟都没有包到达这个规则,那么所有触发都会恢复,回到起点。

提示:你目前不能以大于59小时的时间来创建这种规则,所以如果你设置一个平均率为一天,那么你的触发率必须小于3。

你也可以将此模块用于避免使用快速响应速率的各类拒绝服务攻击(DoS,Denial of Server)。

(译者:以下是较著名的攻击)

Syn-flood protection:

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

Furtive port scanner:

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Ping of death:

iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

这个模块工作原理类似于“节流阀”,以下是图示。

rate (pkt/s)

^ .---.

| / DoS \

| / \

Edge of DoS -|.....:.........\....................... DoS的边界 =

= (limit * | /: \

limit-burst) | / : \ .-.

| / : \ / \

| / : \ / \

End of DoS -|/....:..............:.../.......\..../. DoS结束

= limit | : :-' --'

-------------+-----+--------------+------------------> time (s)

LOGIC => Match | Didn't Match | Match

我们匹配由五个包触发的每秒一个包,不过每秒钟第四个包才开始进入(这个规则),进行三秒钟,然后重新开始。

<--Flood 1--> <---Flood 2--->

Total ^ Line __-- YNNN

Packets| Rate __-- YNNN

| mum __-- YNNN

10 | Maxi __-- Y

| __-- Y

| __-- Y

| __-- YNNN

|- YNNN

5 | Y

| Y Key: Y -> Matched Rule

| Y N -> Didn't Match Rule

| Y

|Y

0 +--------------------------------------------------> Time (seconds)

0 1 2 3 4 5 6 7 8 9 10 11 12

你可以看见,前五个包是允许超过一个包/每秒(这个速率)的,然后就开始限制。 如果有一个暂停,那么另一个触发也是允许的,但不能超过规则设置的最大速率。

owner

--uid-owner userid

根据给出的有效的(数值)user id来匹配包的创建进程。

--gid-owner groupid

根据给出的有效的(数值)group id 来匹配包的创建进程。

--pid-owner processid

根据给出的process id 来匹配包的创建进程。

--sid-owner sessionid

根据给出的 session group 来匹配包的创建进程。

unclean

这是试验性模块,必须明确指定'-m unclean'或者'--match unclean'。 它对包进行各种随机判断。此模块还未通过审核,所以不要用在安全设施上。 (可能造成更糟糕的结果,它自己可能还有Bug)。没有提供选项。

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

7.3.6.5 状态匹配

最有用的匹配标准是'state'扩展。它负责解释'ip_conntrack'模块的connection-tracking分析。 这是推荐使用的(好东东)。

通过指定'-m state'来允许附加的'--state'选项,匹配用逗号分割的状态列表('!'标志表明不符合那些状态(的状态))。

NEW

由新连接创建的包

ESTABLISHED

属于已存在连接的包(也就是说,响应的包)

RELATED

和一个已存在连接有关,但不是它的一部分的包。如ICMP错误,或者(已加载FTP模块)一个建立FTP数据连接的包。

INVALID

由于以下原因而不能被识别的包:包括内存不足和不是相应当前任何连接的ICMP错误。通常这些包会被丢弃。

这个强大的匹配扩展的一个例子:

iptables -A FORWARD -i ppp0 -m state ! --state NEW -j DROP

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

7.4 目标规格

现在,我们知道了如何对包进行测试,但是我们还需要告诉那些匹配的包应该如何做。这被称作规则的目标。

有两个很简单的内建目标:DROP和ACCEPT。我们已经看过了。如果包匹配的规则,其目标是这二者中的一个,那么不再考虑更多的规则了:包的命运已经决定。

除此之外有两种目标:扩展的和用户定义的链。

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

7.4.1 用户定义链

iptables一个强大的特点是由ipchains继承来的可以让用户创建新的链,附加在三个内建的链上(INPUT、FORWARD和OUTPUT)。按照惯例,用户定义链使用小写以区分他们。(我们会在“Operations on an

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus