TCP/IP详解 第七章 防火墙和网络地址转换(1)
一、引言
1、Internet和协议发展初期,仅用于大学和科研机构。处于没人攻击状态。
2、20世纪80、90年代,成功的攻击成了家常便饭。为了解决这个问题,引入了防火墙。
二、包过滤防火墙
1. 包过滤防火墙
配置为丢失或者转发数据包头中符合(或不符合)特定标准的数据包,这些标准称为过滤器。
1.简单的过滤包括网络层或者传输层报头中各个部分的范围比较。
2.最流行的过滤器包含IP地址(选项),ICMP报文类型。
3.端口号确定的各种UDP或者TCP服务。
较新的防火墙能利用封包的多样属性来进行过滤,例如:来源 IP地址、来源端口号、目的 IP 地址或端口号、服务类型(如 HTTP 或是 FTP)。也能经由通信协议、TTL 值、来源的网域名称或网段...等属性来进行过滤
单独处理每一个数据报,极易被混淆
关联已经或者即将到达的数据包来推断流或者数据报的信息。IP分片(第10章),使得防火墙的工作变得更加复杂。
Demilitarized Zone即俗称的非军事区,与军事区和信任区相对应,作用是把WEB,E-mail,等允许外部访问的服务器单独接在该区端口,使整个需要保护的内部网络接在信任区端口后,不允许任何访问,实现内外网分离,达到用户需求。
DMZ可以理解为一个不同于外网或内网的特殊网络区域,DMZ内通常放置一些不含机密信息的公用服务器,比如Web、Mail、FTP等。这样来自外网的访问者可以访问DMZ中的服务,但不可能接触到存放在内网中的公司机密或私人信息等,即使DMZ中服务器受到破坏,也不会对内网中的机密信息造成影响。
2.TCP/IP参考模型中的防火墙位置
三、代理防火墙
运行一个或者多个引用层网关的主机(ALG),该主机拥有多个网络接口,能够在应用层中继两个连接/关联之间特定类型的流量。
比包过滤防火墙更安全
缺乏灵活性(为每个传输层服务设置一个代理)。每个服务需安装代理,通过代理发起连接。必须配置每个客户端以便找到代理。
提前确认的环境可以工作的很好,但是添加额外的服务需要ISP重大干预。
1. HTTP proxy firewall
Web代理,用于HTTP和HTTPS协议。内容过滤器&隧道代理服务器.对内是server,对外是client。也提供Web cache功能。
防火墙安全会话转换协议 (SOCKS: Protocol for sessions traversal across firewall securely) SOCKS 协议提供一个框架,为在 TCP 和 UDP 域中的客户机/服务器应用程序能更方便安全地使用网络防火墙所提供的服务。
协议工作在OSI参考模型的第5层(会话层),使用UDP协议传输数据,因而不提供如传递 ICMP 信息之类的网络层网关服务。
用于Web之外的其他服务。版本4和5.版本5增加了强大的认证,UDP传输和IPv6寻址。
Socks代理比其他应用层代理要快得多。它通常绑定在代理服务器的1080端口上。如果您在企业网或校园网上,需要透过防火墙或通过代理服务器访问Internet就可能需要使用 SOCKS。
注意,浏览网页时常用的代理服务器通常是专门的http代理,它和SOCKS是不同的。因此,您能浏览网页不等于您一定可以通过SOCKS访问Internet。常用的防火墙,或代理软件都支持SOCKS,但需要其管理员打开这一功能。
使用场景:电子邮件、新闻组软件、网络聊天MIRC和使用代理服务器上联众打游戏等等各种游戏应用软件当中。
四、传统的NAT
1、公有地址与私有地址
原则上,私有地址可以采用公有地址;但是当这样的公有地址也别不联网另外一个实体使用时,这样可能出现问题,是因为本地系统会屏蔽使用相同地址的远端系统(在互联网上不会被路由,出去要被丢掉。即使出去,数据无法回来)。
范围:0.0.0.0到127.255.255.255。 10.0.0.0到10.255.255.255是私有地址
第1字节为网络地址,其它3个字节为主机地址。另外第1个字节的最高位固定为0
范围:128.0.0.0到191.255.255.255. 172.16.0.0到172.31.255.255是私有地址
第1字节和第2字节为网络地址,其他2个字节为主机地址。另外1个字节的前2为固定为10
范围:192.0.0.0到223.255.255.255。192.168.0.0到192.168.255.255是私有地址
第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110/2、/2
2、网络地址转换(NAT)
允许在互联网的不同地方使用相同的IP地址集体。主要动机是正在急剧减少的有限的IP地址空间。解决两个问题:IP地址枯竭和关于路由可扩展性的担忧(CIDR的发展)。
NAT推出之初仅作为临时措施,但NAT是受欢迎的,因为减少了对全局路由的互联网地址需求,同时提供了一些防火墙功能,并且仅仅需要很少的配置。
注意:NAT工作在网络层,但是要结合传输层来共同实现。
3、NAT的分类和功能
1对1,私有地址转换,对特殊设备的访问。
从地址池中动态获取,比如easy_ip,还是1对1。
1对多。比如思科NAT服务器,一个公有IP可以映射4000个用户使用。公有IP使用率高。
节约IP地址,使用地址转换。仅仅是一个过滤,IPv6不用这个技术。
1)解决IP地址不足问题,1对多,还可以保护内部网络。
2)安全防护功能
3)负责均衡
3)不能处理加密的IP报头 4) 无法实现对IP端到端的跟踪。
4、NAT工作原理
重写通过路由器的数据包的识别信息。
1. 重写往一个方向传输的数据包的源IP地址。
2. 重写往另外一个方向传输的数据包的目的IP地址。
因此:在互联网上的主机,数据包是来自于具有全局路由IP的NAT路由器,而不是位于NAT内部的私有地址的主机。
5、NAT的发展历程
私有IP和NAT的公共IP之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到NAT的公共IP地址数量的限制。取决于ISP提供的地址池或公有地址范围,这种NAT不是最流行的,因为他无助于减少需要使用的IP地址数量。
为了克服这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术。
Easy IP 方式的实现原理与地址池NAPT 转换原理类似,可以算是NAPT的一种特例,不同的是Easy IP 方式可以实现自动根据路由器上WAN 接口的公网IP 地址实现与私网IP 地址之间的映射(无需创建公网地址池)。所以在配置上相对简单。
6、NAPT
使用传输层标识符(即TCP和UDP端口,ICMP查询标识符)来确定一个特定的数据包到底和NAT内部的哪一台主机关联。
这使得大量的内部主机(即使好几千台)能够同时访问互联网,而使用公有IP地址的数量确很少,通常只需要一个
通常我们所说的NAT将同时包括NAT和NAPT(除非进行区分)。
7、防火墙规则
包含过滤表格(table)和过滤连(chain)。table: filter,nat, mangle,
filter三条链: INPUT、FORWARD、OUTPUT
nat表三条链:PREROUTING、OUTPUT、POSTROUTING
mangle表有五条链,主要用于任意修改数据包。
raw表两条链: PREROUTING、OUTPUT
8、Iptables->table
我们把相同功能的规则的集合叫做“表”,所以说,不同功能的规则,放在不同的表中管理。每种表的作用(重要):
负责过滤功能,防火墙;内核模块:iptables_filter
网络地址转换功能;内核模块:iptabel_nat
拆解报文,做出修改,并重新封装。
关闭nat表, 启用的链追踪机制。
9、数据报过来策略
默认拒接所有消息
默认接收所有消息
10、iptables的数据包的流程是怎样的?
一个数据包到达时,是怎么依次穿过各个链和表的(图)。
基本步骤如下:
1. 数据包到达网络接口,比如 eth0。
2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
3. 如果进行了连接跟踪,在此处理。
4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
6. 决定路由,看是交给本地主机还是转发给其它主机。
到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:
7. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
8. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
9. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
10. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
11. 进入出去的网络接口。完毕。
另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
7. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
8. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
9. 交给本地主机的应用程序进行处理。
10. 处理完毕后进行路由决定,看该往那里发出。
11. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
12. 连接跟踪对本地的数据包进行处理。
13. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
14. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
15. 再次进行路由决定。
16. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
17. 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
18. 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。
19. 进入出去的网络接口。完毕。
11、iptables raw表的使用
增加raw表,在其他表处理之前,-j NOTRACK跳过其它表处理
状态除了以前的四个还增加了一个UNTRACKED
例如:
可以使用 “NOTRACK” target 允许规则指定80端口的包不进入链接跟踪/NAT子系统
iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -t raw -A PREROUTING -s 1.2.3.4 -p tcp --sport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
12、解决ip_conntrack: table full, dropping packet的问题
在启用了iptables web服务器上,流量高的时候经常会出现下面的错误:
ip_conntrack: table full, dropping packet
这个问题的原因是由于web服务器收到了大量的连接,在启用了iptables的情况下,iptables会把所有的连接都做链接跟踪处理,这样iptables就会有一个链接跟踪表,当这个表满的时候,就会出现上面的错误。
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。
所以解決方法一般有两个:
(1) 加大 ip_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
上面两种方法打个比喻就是烧水水开的时候,换一个大锅。一般情况下都可以解决问题,但是在极端情况下,还是不够用,怎么办?
这样就得反其道而行,用釜底抽薪的办法。iptables的raw表是不做数据包的链接跟踪处理的,我们就把那些连接量非常大的链接加入到iptables raw表。
如一台web服务器可以这样:
iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
五、与防火墙和NAT相关的攻击
隐藏攻击者的实际地址,从NAT来看是”正常”的
最简单的设置伪装的配置:
ipchains –P FORWARD MASQUERADE
六、IPv4/IPv6共存和过渡中的NAT
2011年最后一个顶层单播IPv4被分配出去,IPv6的过度开始加速。
但目前来看IPv4和IPv6将共存更长一段时间,甚至可能是无期限的。
DS-Lite(Dual Stack Lite) 一种希望在内部运行IPv6的服务提供者更容易过渡到IPv6(同时支持传统的IPv4)的方法。利用隧道和SPNAT
感谢hebh