现在防火墙主要分为三种:包过滤,应用代理,状态检查
Iptables:支持包过滤和状态检查
filter: 策略过滤 iptables 默认的表格 包含三个链 INPUT, OUTPUT, FORWARD 应该在此三道门中做过滤
nat: 地址转换啦 PREROUTING, POSTROUTING, OUTPUT
mangle: 作用是改变服务类型而使用的表 PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
其中nat 和filter 是配置和使用iptables中最常用的两个,务必要熟悉。
iptables做的反向代理与squid区别在于,squid能更好的做好访问的控制,并且可以缓存提高访问的速度,还可以做负载均衡。
iptables 反向代理:
现有三台pc:A,B,C
A:192.168.2.166(网关设置为192.168.2.105)web服务器
B:eth0:192.168.1.104(链接外网),eth1:192.168.2.105(内网)
C:192.168.1.164
目的:想让客户端C机通过代理机B访问到A机上web内容
在代理机上做
打开代理机的路由转发功能
做nat
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -d 192.168.1.104 -p tcp - -dport 80 -j SNAT --to-dest 192.168.2.166
这里做DNAT目的是简单,,
1.通用匹配:源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
-p icmp:icmp数据报文的扩展
--icmp-type:
echo-request(请求回显),一般用8来表示
所以--icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT (允许自己ping时的请求回显包出去)
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT(允许自己的响应包进来)
详解-j ACTION
常用的ACTION:
DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链
IPtables中可以灵活的做各种网络地址转换(NAT)
网络地址转换主要有两种:SNAT和DNAT
SNAT是source network address translation的缩写,即源地址目标转换
比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP
PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip
当外部网络的服务器比如网站web服务器接到访问请求的时候
他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip
这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了
所以叫做SNAT,基于源地址的地址转换
DNAT是destination network address translation的缩写
即目标网络地址转换
典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip
互联网上的访问者使用公网ip来访问这个网站
当访问的时候,客户端发出一个数据包
这个数据包的报头里边,目标地址写的是防火墙的公网ip
防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip
然后再把这个数据包发送到内网的web服务器上
这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了
即DNAT,基于目标的网络地址转换
MASQUERADE,地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别
但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:
如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址
但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip
假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变
而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址
这个时候如果按照现在的方式来配置iptables就会出现问题了
因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的
每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip
这样是非常不好用的
MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT
比如下边的命令:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的话,不用指定SNAT的目标ip了
不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去
这样就实现了很好的动态SNAT地址转换
案例:
A机ip 192.168.2.164(内网)B机有两块网卡(eth0:192.168.1.104链接外网,eth1:192.168.2.105链接内网,只设置了ip和子网掩码)
在B机上做nat
做之前执行iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 --source 192.168.2.0/24 -j MASQUERADE(表示动态的伪装)
如果不行再加上下面的
让外网消息到达内网
iptables -A FORWARD --source 192.168.1.0/24 -j ACCEPT
允许内网的消息转发出去
iptables -A FORWARD --source 192.168.2.0/24 -j ACCEPT
FTP的主动模式(active mode)和被动模式(passive mode):
大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但是,FTP协议却有所不同,它使用双向的多个连接,而且使用的端口很难预计。一般,FTP连接包括:
一个控制连接(control connection)
这个连接用于传递客户端的命令和服务器端对命令的响应。它使用服务器的21端口,生存期是整个FTP会话时间
一、FTP服务简介
FTP服务器有两种工作模式:主动模式和被动模式。这两种方式的特点如下:
(1)主动模式下:
tcp, 20(20号端口用于数据传输),21(21号端口用于控制连接)
(2)被动模式:
tcp,21(用于控制连接)>1023(端口号大于1023的随机端口用于数据传输)
所以如果FTP工作在被动模式下,无法指定数据传输的端口,于是引入了RELATED状态。RELATED主要用于 追踪与其相关的端口。注意:ftp工作在主动模式或者被动模式与客户端的请求有关。
二、开放被动模式下的FTP服务。
具体步骤如下:
1、先开放ssh:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -i lo -j ACCEPT(先开放本地连接)
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT(放行所有的ESTABLISHED连接)
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 3 -j ACCEPT (放行ssh连接,并将其最大连接数设为3)
iptables -P INPUT DROP
iptables -P OUTPUT DROP (将默认策略设置为禁止)
iptables -L -n -v (查看iptables详细信息)
2、开放ftp服务:
注意要开放被动模式下的服务需要用到,ftp的追踪模块:
#cat /etc/sysconfig/iptables-config(查看iptables需要的模块,主要是ip_nat_ftp模块,属于内核模块)
#lsmod | grep ftp (查看是否加载ftp模块)
#modprobe ip_nat_ftp(加载ftp模块)
#lsmod | grep ftp (查看模块是否被加载)
这样RELATED就可以被使用了:
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 21 -m state --state NEW -j ACCEPT(允许21号端口进入,即:开放控制连接)
iptables -A INPUT -m state --state RELATED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED -j ACCEPT