Iptables是管理Netfilter的唯一工具,Netfilter直接嵌入在Linux内核。他可以为个人工作站创建一个防火墙,也可以为一个子网创建防火墙,以保护其他的系统平台(市场上有很大一部分硬件防火墙也是使用iptables系统的)。
Netfilter在内核中过滤,没有守护进程,在OSI模型的第2、3、4层插入策略。过滤的速度非常快,因为他只读取数据包头,不会给信息流量增加负担,也无需进行验证。
Netfilter提供了一系列的表(tables),每个表由若干个链(chains)组成,而每条链可以由一条或若干条规则(rules)组成。
实际上netfilter 是表的容器,表是链的容器,而链又是规则的容器。
Netfilter表和Netfilter链:
表说明:
Filter:这个表主要执行数据包过滤。
Nat:主要进行网络地址转换。
Managle:用于修改一些特殊的规则。
链说明:
PREROUTING:路由之前,刚到达的数据包。(nat)
INPUT:通过路由,目的地为本机的数据包。(filter)
FORWARD:需要通过本地系统进行转发的数据包。(filter)
OUTPUT:由本机产生,向外转发,处于POSTROUTING之前的数据包。(nat和filter)
POSTROUTIONG:通过路由后,即将离开系统的数据包。(nat)
Netfilter的数据包流程:
Iptables 基本语法:
iptables 内置了filter、nat 和mangle 三张表,我们可以使用-t 参数来设置对哪张表生效,也可以省略-t 参数,则默认对filter 表进行操作。
图中:这句的意思就是:来自(源地址)192.168.0.1的INPUT链的数据包直接丢弃。
Iptables进程服务命令:
service iptables save 保存iptables设置,对iptables规则编辑后一定要保存。
service iptables restart 保存设置以后不重启则设置不生效,要设置生效请重启。
service iptables status 检查iptables的设置。类似于iptable –L命令。
Iptables基本的链操作命令:
-L 列出某个链或者表中的规则: service iptables status 把这个命令和-L比较下
iptables –L:显示filter表中的规则等同于iptables –t filter -L
iptables –t nat –L :显示nat表的中的设置:
-F 删除某个链或者表中的规则:
iptables –F (iptables –t filter –F) 删除filter表中的所有规则;
iptables –t nat –F 删除nat表中的所有规则;
iptables –t nat –F POSTROUTING 删除nat表中POSTROUTING链的所有规则;
-A添加一条规则(在当前的规则后添加,也就是排在所有规则后):
iptables -A INPUT –s 192.168.0.1 –j DROP
和实例图中的功能相同,丢弃来自192.168.0.1的数据包,这里省略了-t filter。
添加该语句后,保存设置并重新启动iptalbes 服务,并通过-L的命令查看,就会发现刚添加的这条规则排列在所有规则后。
-----------iptables的匹配规则是按顺序排列的。
-I在指定位置插入一条规则:
(如果有回环规则(iptables –A INPUT –I lo –j ACCEPT,则回环永远是第一条)
iptables –I <CHAIN> 作为第一条规则插入。
iptables <CHAIN> X 作为第X条规则插入,X这里代表规则顺序号。
iptables –A INPUT –p tcp –s 192.168.0.1/24 --dport 22 –j ACCEPT 大家把这条写法记住,以后经常会用到。
允许192.168.0.1 通过22端口访问该主机,把它作为第一条规则插入iptables规则列表。
-----------iptables的匹配规则是按顺序排列的。
-P <CHAIN TARGET> 分配连接策略。
iptables –P INPUT DROP 禁止任何输入的数据包。这句慎用。
iptables –P OUTPUT ACCEPT 允许所有输出的数据包。
-D删除某一条规则:
Iptables –D <CHAIN> X 删除某个链的第几条规则
iptables –D INPUT 3 删除INPUT链上的第3条规则。
iptables –P INPUT DROP 这个不能使用删除语句删除,只能到本机输入iptables –P INPUT ACCEPT
Iptables中的匹配:
iptables –A INPUT –p tcp –s 192.168.0.1 --dport 22 –j ACCEPT
这个命令我们在上面已经看过了,我们来看下其他的一些匹配参数。
-p protocol 匹配网络协议,例子中匹配tcp协议。
-s IP地址或者网段 匹配源IP地址或者网段
例子中匹配一个IP的,如果要匹配一个网段则如下
-s 192.168.0.0/24
如果是除这个网段之外的所有则为:! -s 192.168.0.1/24
如果是除这个IP之外的所有则为:! -s 192.168.0.1
--dport X 匹配目的端口号,X代表具体端口号。
--sport X 匹配源端口号,X代表具体端口号。
Iptables中的目的:
我们已经在前面看到过-j 后面跟的就是目的。
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包。
REJECT:丢弃数据包,同时发送响应报文通知对方。
设置Iptables预设规则(本地机防火墙):
1、清除iptables设置:iptables –F
2、设置回环允许规则,没有这个规则好多服务不能启动:
iptables –A INPUT –i lo –j ACCETP 允许本地回环接口
iptables –A INPUT –p tcp --dport 20:21 –j ACCEPT 开放FTP的20、21端口。还记得我们将FTP的时候,如果开启防火墙。注意!!
iptables –A INPUT –P tcp --dport 80 –j ACCEPT 开放http的80端口。
iptables –I INPUT –p tcp –dport 22 –j ACCEPT 开放SSH服务的22端口。
4、iptables -A INPUT –j REJECT 禁止进入数据包 ----慎用该句。
5、iptables -P FORWARD DROP 禁止转发数据包
6、iptables -P OUTPUT ACCEPT 允许外发数据包
设置Iptables FORWORD规则:
一般情况FORWORD链式DROP的,但是当用来做NAT的时候我们就需要设置他了。
首先要开启转发功能:编辑/etc/sysctl.conf文件
sysctl -p 来使修改生效
NAT服务
(一).什么是私有地址
私有地址(Private address)属于非注册地址,是专门为组织机构内部使用而划定的。使用私有IP地址是无法直接连接到Internet的,但是能够用在公司内部的 Intranet的IP地址上 。
(二).什么是NAT
NAT是将一个地址域(如专用Intranet)映射到另一个地址域(如Internet)的标准方法。它是一个根据RFC 1631开发的IETF标准,允许一个IP地址域以一个公有IP地址出现在Internet上。NAT可以将内部网络中的所有节点的地址转换成一个IP地 址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外部发现,使外部无法直接访问内部网络设备。
NAT的工作原理
1.静态网络地址转换
① 在NAT服务器上建立静态NAT映射表。
② 当内部主机(IP地址为192.168.16.10)需要建立一条到Internet的会话连接时,首先将请求发送到NAT服务器上。NAT服务器接收到请求后,会根据接收到的请求数据包检查NAT映射表。
③ 如果已经为该地址配置了静态地址转换,NAT服务器就使用相对应的公有IP地址,并转发数据包,否则NAT服务器不对地址进行转换,直接将数据包丢弃。 NAT服务器使用202.96.128.2来替换内部私有IP(192.168.16.10)
④ Internet上的主机接收到数据包后进行应答(这时主机接收到202.96.128.2的请求)。
⑤ 当NAT服务器接收到来自Internet上的主机的数据包后,检查NAT映射表。如果NAT映射表存在匹配的映射项,则使用内部私有IP替换数据包的目IP地址,并将数据包转发给内部主机。如果不存在匹配映射项则将数据包丢弃。
动态网络地址转换
① 当内部主机(IP地址为192.168.16.10)需要建立一条到Internet的会话连接时,首先将请求发送到NAT服务器上。NAT服务器接收到 请求后,根据接收到的请求数据包检查NAT映射表。
② 如果还没有为该内部主机建立地址转换映射项,NAT服务器就会决定对该地址进行转换(建立 192.168.16.10:2320←→202.96.128.2:2320的映射项,并记录会话状态)。如果已经存在该映射项,则NAT服务器使用该 记录进行地址转换,并记录会话状态。然后NAT服务器利用转换后的地址发送数据包到Internet主机上。
③ Internet主机接收到信息后,进行应答,并将应答信息回传给NAT服务器。
④ 当NAT服务器接收到应答信息后,检查NAT映射表。如果NAT映射表存在匹配的映射项,则使用内部公有IP替换数据包的目的IP地址,并将数据包转发给 内部主机。如果不存在匹配映射项则将数据包丢弃。
网络地址端口转换
① 当内部主机(IP地址为192.168.16.10,使用端口1235)需要与Internet上的某主机(IP地址为202.18.4.6,端口为 2350)建立连接时,首先将请求发送到NAPT服务器上。NAPT服务器接收到请求后,会根据接收到的请求数据包检查NAPT映射表。
②如果还没有为该内部主机建立地址转换映射项,NAPT服务器就会为这个传输创建一个Session,并且给这个Session分配一个端口3200,然 后改变这个数据包的源端口为3200。所以原来的192.168.16.10:1235→202.18.4.6:2350数据包经过转换后变为了 202.96.128.2:3200→202.18.4.6:2350。
③ Internet主机接收到信息后进行应答,并将应答信息回传给NAPT服务器。
④ 当NAPT服务器接收到应答信息后,检查NAPT映射表。如果NAPT映射表存在匹配的映射项,则使用内部公有IP替换数据包的目的IP地址,并将数据包 转发给内部主机。如果不存在匹配映射项则将数据包丢弃。
NAT网络地址转换:将一个IP转换成另一个 IP(输入和输出)
网络地址转换类型:
目的地 NAT(DNAT):DNAT修改包的目的地位址的时机,必须在包即将被送到本机行程之前,或是要被转送其它电脑之前;所以,使用DNAT为目标的规则,必须设置于nat表格的PREROUTING链结。
源 NAT(SNAT,MASQUERADE):SNAT必须在封包即将离开核心的前一刻,即时修改其来源位址(或通讯端口),所以SNAT规则的设置地点必须是在nat表格的POSTROUTING链结。
NAT实例:
1. 打开IP转发
现在我们的IP包已经可以出到广域网了,但是广域网上的路由器会丢弃我们内网的IP地址, 所以我们要做nat
好了,开始说到iptables了,要做nat就需要用到iptables的nat表
我们是从里面到外面的包,所以要修改源IP,就叫做源NAT
我们要出去,就是postrouting
首先需要打开ip_forward
现在我们来配置这条命令
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.8.0/24 -j MASQUERADE
或者直接定义到两个接口
/sbin/iptables -t nat -A POSTROUTING -o "外网卡" -s "内网卡" -j MASQUERADE
我们来讲解这条命令
iptables 是命令本身
-t 是执行表,iptables有两个表,一个是filter:过滤的表
一个是nat,就是NAT表,Network Address Translator
然后-A,-A的意思就是添加一条链
这里添加的链是POSTROUTING链,就是源NAT
-o 是出去的网卡设备,我们使用的是eth1网卡
-s 是源地址,我们设置内网的192.168.8.0/24网段
-j是动作,MASQUERADE 动态源地址转换(动态IP的情况下使用)
如果我们使用的静态外网地址,就可以这样写
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.1.1.1 把出去的地址都转换成1.1.1.1
好了,现在内网用户可以通过linux网关上网了
端口重定向
把要进入eth1(eth1连接外网)80端口的数据包,重新定向到192.168.1.3的8080端口。配置squid的时候用到。
iptables -t nat -A PREROUTING -i ethl -p tcp - -dport 80 -j DNAT - - to -destination 192.168.1.3:8080
端口映射
那么内网的WEB服务器如何将数据传出去呢?这个时候要通过SNAT来实现了。我们用端口映射来实现。
/sbin/iptables -t nat -A PREROUTING -p tcp -d 210.42.201.180 --dport 80 -j DNAT --to 192.168.1.181:80
/sbin/iptables -t nat -A POSTROUTING -d 192.168.1.181 -p tcp --dport 80 -j SNAT --to 192.168.1.1
或:
iptables –t nat –A PREROUTING –p tcp –i eth1 –dport 80 –j DNAT –to 192.168.1.181:80
iptables –t nat –A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE
注:210.42.201.180为公网IP地址。192.168.1.1是内网的网关。192.168.1.181是内网的web服务器
服务器iptabtles脚本设置:
vi /etc/rc.d/firewall
--------------------
#!/bin/bash
#清除规则
iptables -F
#允许127.0.0.1内部转发
iptables -A INPUT -i lo -j ACCEPT
#开放常用的端口
iptables -A INPUT -p TCP --dport 80 -j ACCEPT
iptables -A INPUT -p TCP --sport 80 -j ACCEPT
iptables -A INPUT -p TCP --dport 25 -j ACCEPT
iptables -A INPUT -p TCP --sport 25 -j ACCEPT
iptables -A INPUT -p TCP --dport 110 -j ACCEPT
iptables -A INPUT -p TCP --sport 110 -j ACCEPT
iptables -A INPUT -p TCP --dport 143 -j ACCEPT
iptables -A INPUT -p TCP --sport 143 -j ACCEPT
#SSH
iptables -A INPUT -p TCP --dport 59687 -j ACCEPT
iptables -A INPUT -p TCP --dport 9900 -j ACCEPT
iptables -A INPUT -p UDP --sport 53 -j ACCEPT
iptables -A INPUT -p TCP --sport 53 -j ACCEPT
#antispam
iptables -A INPUT -p TCP --sport 6220 -j ACCEPT
iptables -A INPUT -p TCP --sport 6610 -j ACCEPT
iptables -A INPUT -p TCP --sport 6611 -j ACCEPT
#SSL
iptables -A INPUT -p TCP --dport 995 -j ACCEPT
iptables -A INPUT -p TCP --dport 993 -j ACCEPT
iptables -A INPUT -p TCP --dport 465 -j ACCEPT
iptables -A INPUT -p TCP --dport 443 -j ACCEPT
#NTP date
iptables -A INPUT -p UDP --sport 123 -j ACCEPT
#snmp
iptables -A INPUT -i eth0 -p udp -s 125.76.229.215 --dport 161 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s 60.195.249.83 --dport 161 -j ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -j REJECT
iptables -P OUTPUT ACCEPT
#防止同步包洪水(Sync Flood)
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#防止各种端口扫描
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#Ping洪水攻击(Ping of Death)
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
#屏蔽 SYN_RECV 的连接
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
-----------------------------
写完后将 sh /etc/rc.d/firewall命令写入/etc/rc.local目录下即可实现开机自动运行脚本。