iptables防火墙工做原理html
简介:iptables防火墙工做在网络层,针对TCP/IP数据包实施过滤和限制,iptables防火墙基于内核编码实现,具备很是稳定的性能和高效率;linux
iptables属于“用户态”的防火墙管理体系。web
规则表 shell
filter表:filter表用来对数据包进行过滤,根据具体的规则要就决定如何处理一个数据包。对应内核模块:iptable_fileter。共包含三个链。vim
nat表:nat(Network Address Translation,网络地址转换)表主要用于修改数据包 ip地址,端口号等信息。对应的内核模块为iptable_nat,共包含三个链。后端
mangle表:mangle表用来修改数据包的TOS(Type Of Service,服务类型),TTL(Time To Live,生存周期)值,或者为数据包设置Mark标记,以实现流量整形,策略路由等高级应用。对应的内核模块为 iptable_mangle,共包含五个链。安全
raw表:raw表示自1.2.9之后版本的iptables新增的表,主要来决定是否对数据包进行状态跟踪。对应的内核模块为iptable_raw,共包含两个链。服务器
规则链 网络
INPUT链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。并发
OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD链:当接收到须要经过防火墙中转发送给其余地址的数据包(转发)是,应用测链中的规则。
PREROUTING链:在对数据包作路由选择以前,应用测链中的规则。
POSTROUTING链:在对数据包作路由选择以后,应用此链中的规则。
简要说明:其中INPUT,OUTPUT链主要用在“主机防火墙”中。即主要针对服务器本机惊醒保护的防火墙;而FORWARD,PREROUTING,POSTROUTING链多用在“网络型防火墙”中,例如使用Linux防火墙做为网关 服务器在公司与Inetnet之间进行安全控制。
数据包过滤工做流程
规则表应用优先级:raw→mangle→nat→filter
各条规则的应用顺序:链内部的过滤遵循“匹配即中止”的原则,若是对比完整个链也没有找到和数据包匹配的规则,则会按照链的默认策略进行处理。
入站数据流向:数据包到达防火墙后首先被PREROUTING链处理(是否修改数据包地址等),而后进行路由选择(判断数据包发往何处),若是数据包的目标地址是防火墙本机(如:Internet用户访问网关的Web服务端口),那么内核将其传递给INPUT链进行处理(决定是否容许经过等)。
转发数据流向:来自外界的数据包到达防火墙后首先被PREROUTTING链处理,而后再进行路由选择;若是数据包的目标地址是其余的外部地址(如局域网用户经过网关访问QQ服务器),则内核将其传递给FORWARD链进行处理(容许转发,拦截,丢弃),最后交给POSTROUTING链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT链处理,而后进行路由选择,再交给POSTROUTING链(是否修改数据包的地址等)进行处理。
命令实战
语法:
iptables [ - t 表名 ] 管理选项 [链名] [匹配条件] [-j 控制类型]
未指定表名时将默认使用filter表。
控制类型:
ACCEPT:容许数据包经过。
DROP:直接丢弃数据包,不给出任何回应信息。
REJECT:拒绝数据包经过,会给数据发送端一个响应信息。
拒绝发给本机使用ICMP协议的数据包:iptable -t filter -I INPUT -p icmp -j REJECT
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样就能够写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起做用.
[root@tp ~]# service iptables restart
别忘了保存,不行就写一部保存一次.你能够一边保存,一边作实验,看看是否达到你的要求,
iptables经常使用命令
iptables -nv -L 查看iptables列表
iptables -F 清空iptables规则
iptables-save > /etc/sysconfig/iptables 保存iptables规则到文件
service iptables restart 重启iptables
如下是我服务器的iptables配置
# Generated by iptables-save v1.4.7 on Tue Jul 5 12:06:29 2016 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [4:4940] -A INPUT -i lo -j ACCEPT #容许本地回环 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #容许服务器访问外网,例如curl,wget -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #容许全部IP访问网站 -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #容许ping请求 -A INPUT -s 61.149.47.34/32 -p tcp -m tcp --dport 3306 -j ACCEPT #容许公司IP访问MySQL -A INPUT -s 61.149.47.34/32 -p tcp -m tcp --dport 6379 -j ACCEPT #容许公司IP访问Redis -A INPUT -p tcp -m multiport --dports 8081,10050,65008 -j ACCEPT #容许全部IP访问8081,10050,65008端口,ps:65008是个人ssh端口 -A INPUT -j REJECT --reject-with icmp-port-unreachable #拒绝全部的IP访问全部的端口 COMMIT # Completed on Tue Jul 5 12:06:29 2016
防止攻击
防范DDOS攻击脚本 #防止DOS太多链接进来,能够容许外网网卡每一个IP最多15个初始链接,超过的丢弃 iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT 防范CC攻击 (1)控制单个IP的最大并发链接数 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT #容许单个IP的最大链接数为 30 (2)控制单个IP的某段时间的链接数 iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j REJECT iptables -A INPUT -p icmp -j DROP
如下转载
防火墙之地址转换SNAT DNAT
1、SNAT源地址转换。
一、原理:在路由器后(PSOTROUTING)将内网的ip地址修改成外网网卡的ip地址。
二、应用场景:共享内部主机上网。
三、设置SNAT:网关主机进行设置。
(1)设置ip地址等基本信息。
(2)开启路由功能:
sed -i '/ip-forward/s/0/1/g'
sysctl -p
(3)编写规则:
iptables -t nat -I POSTROUTING -o 外网网卡 -s 内网网段 -j SNAT --to-source 外网ip地址 #适用于外网ip地址固定场景
iptables -t nat -I POSTROUTING -o 外网网卡 -s 内网网段 -j MASQUERADE #适用于共享动态ip地址上网(如adsl拨号,dhcp获取外网ip)
(4)作好安全控制:使用FORWARD时机进行控制,严格设置INPUT规则。
2、DNAT目的地址转换:
一、原理:在路由前(PREROUTING)未来自外网访问网关公网ip及对应端口的目的ip及端口修改成内部服务器的ip及端口,实现发布内部服务器。
二、应用场景:发布内部主机服务。
三、设置DNAT:网关主机上设置。
(1)设置ip、开启路由、设置SNAT
(2)编写防火墙规则:
iptables -t nat -I PREROUTING -i 外网网卡 -d 外网ip tcp --dport 发布的端口 -j DNAT --to-destination 内网服务ip:端口
NAT network address translation
仅从报文请求来看,能够分为:
SNAT 源地址转换
DNAT 目标地址转换
PNAT 端口转换
NAT server:能根据须要实现SNAT DNAT PNAT
并不是是用户空间的进程完成转换功能,靠的是内核中的地址转换规则
私有IP客户端访问互联网的方法
SNAT 、PROXY
SNAT:主要用于实现内网客户端访问外部主机时使用(局域网上网用)
定义在POSTROUTING链上
iptables -t nat -A postrouting -s 内部网络地址或主机地址 -j SNAT --to-source NAT服务器上的某外部地址
另一个target
MASQUERADE地址假装(适用于PPPOE拨号上网,假设eth1是出口)
iptables -t nat -A postrouting -s 内部网络或主机地址 -o eth1 -j MASQUERADE
DNAT:主要用于内部服务器被外网访问(发布服务)
定义在PREROUTING
iptables -t nat -A PREROUTING -d NAT服务器的某外部地址 -p 某协议 --dport 某端口 -j DNAT --to-destination 内网服务器地址[:port]
注意:NAT服务器须要打开数据转发
echo 1 > /proc/sys/net/ipv4/ip_forward
或者修改/etc/sysctl.conf net.ipv4.ip_forward = 1
实验操做
SNAT、DNAT
实验一:
SNAT
规划主机A 做为SNAT server
eth0 ip地址172.20.1.10(外部地址),eth1 192.168.1.1(内部地址)
主机B当作局域网内主机
eth0 ip地址192.168.1.2 默认路由要指向192.168.1.1
SNAT server:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.20.1.10
#上面和咱们实例操做相同
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
主机B ping外部的其它主机(172.20.1.20模拟互联网上的主机)
DNAT
[root@nat ~]# iptables -t filter -F
[root@nat ~]# iptables -t nat -F
[root@nat ~]# iptables -t nat -A PREROUTING -d 10.1.249.125 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.1.249.125 tcp dpt:80 to:192.168.2.4
[root@nat ~]# netstat -tln | grep "\<80\>" 此时本机上并无开放80端口
[root@wai ~]# curl http://10.1.249.125
hello --> 此时咱们访问为 nat 主机上的80端口 由上面可知,此服务器上并无开放80,而是将请求送往 后端服务器
实体案例
咱们有一台机器A能够上外网,配置eth0=192.168.1.1,eth1=222.13.56.192
有6台机器只有内网IP ,分别是192.168.1.102~192.168.1.108,想让这6台机器经过机器A上网
在机器A 防火墙上配置以下便可
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.101 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.102 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.103 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.104 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.105 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.108 -j SNAT --to-source 222.13.56.192
在 6台机器上路由显示
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 em1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 em1
iptables中DNAT转发的配置方法
1.一对一流量彻底DNAT
首先说一下网络环境,普通主机一台作防火墙用,网卡两块
eth0 192.168.0.1 内网
eth1 202.202.202.1 外网
内网中一台主机 192.168.0.101
如今要把外网访问202.202.202.1的全部流量映射到192.168.0.101上
命令以下:
#将防火墙改成转发模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1
2.多对多流量彻底DNAT
说是多对多,实际上这里的配置是指定了多个一对一
环境:
eth0 192.168.0.1 内网
eth1 202.202.202.1 、202.202.202.2 外网
内网中2台主机 192.168.0.10一、192.168.0.102
如今要把外网访问202.202.202.1的全部流量映射到192.168.0.101上,同时把把外网访问202.202.202.2的全部流量映射到192.168.0.102上
这里顺便提一下如何为网卡配置多个IP
ifconfig eth1:1 202.202.202.2 netmask 255.255.255.0 up
#将防火墙改成转发模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
3.一对多根据协议DNAT
这个最经常使用,通常是内网或DMZ区内有多个应用服务器,能够将不一样的应用流量映射到不一样的服务器上
环境:
eth0 192.168.0.1 内网
eth1 202.202.202.1 外网
内网中2台主机 192.168.0.101(Web服务器)、192.168.0.102(邮件服务器)
如今要把外网访问202.202.202.1的Web流量映射到192.168.0.101上,同时把把外网访问202.202.202.1的邮件访问流量映射到192.168.0.102上
命令以下:
#将防火墙改成转发模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#Web访问设置
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.101:80
iptables -t nat -A POSTROUTING -d 192.168.0.101 -p tcp --dport 80 -j SNAT --to 192.168.0.1
#邮件访问设置
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.102:25
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 25 -j SNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.102:110
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 110 -j SNAT --to 192.168.0.1
SNAT:源地址转换,代理内部客户端访问外部网络
目标地址不变,从新改写源地址,并在本机创建NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机,目前基本都是解决内网用户用同一个公网IP地址上网的状况。
DNAT:目标地址转换,将内部服务器发布至外部网络
和SNAT相反,源地址不变,从新修改目标地址,在本机创建NAT表项,当数据返回时,根据NAT表将源地址修改成数据发送过来时的目标地址,并发给远程主机在DNAT的基础上,能够根据请求数据包的端口作PNAT(端口转换,也称为端口映射),能够根据请求数据包不一样的端口改写不一样的目标地址,从而发送给不一样的主机这在用一个公网地址作不一样服务时用的比较多,并且相对来讲,用NAT的方式能够隐藏后端服务器的真实地址,比较安全。
SNAT的数据流向过程
首先进入PREROUTING,发现不是本网段的地址,然后开始查找路由表(查找路由的过程在PREROUTING和FORWARD之间),因而通过FORWARD链进行转发,在经过POSTROUTING时进行NAT转换。在这个流程中,NAT转换的步骤在POSTROUTING链上实现,之因此再也不PREROUTING上作NAT是由于数据包在进来以前,还不知道是本网段地址仍是外网地址。
DNAT的数据流向过程
在DNAT中,NAT要在PREROUTING链上作。在数据进入主机后,路由选择过程是在PREROUTING和FORWARD之间的,因此应该先作地址转换以后再进行路由选择,然后通过FORWARD链,最后从POSTROUTING链出去。
PC1地址:172.16.251.185 网关指向:172.16.251.186
route add default gw 172.16.251.186
route
NAT服务器地址:172.16.251.185
PC2地址:
2、SNAT的实现:
一、在咱们作NAT以前,首先要把NAT服务器的路由功能打开,否则数据包过不了FORWARD链
sysctl -w net.ipv4.ip_forward=1
######也可使用文件永久生效,下面值改成1便可
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
######执行以下命令让其生效
sysctl -p
二、在NAT服务器添加iptables规则如:
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.254.61
#在POSTROUTING链上面,未来自源地址为172.16.0.0/16网段的数据包的源地址都转换为192.168.254.61
查看iptables规则:
iptables -t nat -L -n -v
三、下面咱们在PC1上作测试,PC1如今就能够Ping通PC2主机了,以下图:
四、PC1 ping PC2,在PC1主机上抓包来测试:
tcpdump -i eth0 -v | grep 192
3、DNAT的实现:
一、在NAT服务器添加iptables规则如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -j DNAT --to-destination 172.16.251.185
#在PREROUTING链上面,将请求地址NAT服务器 eth1 192.168.1.254的数据包所有转发到PC1 172.16.251.185主机上
查看iptables规则:
iptables -t nat -L -n -v
测试:PC1上面作了WEB服务,咱们在PC2上看是否能请求到WEB页面:
请求防火墙eth1地址,192.168.254.61
二、在NAT服务器添加iptables规则如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.251.185:8080
#此条规则是将全部请求NAT服务器eth1 192.168.254.61地址的80号端口都转发到172.16.251.185主机上8080端口,固然前提必须在PC1上面监听8080端口
查看iptables规则:
基于动态IP地址来作NAT代理内部客户端来上网
若是IP地址是动态获取的ADSL宽带来作NAT代理上网实现方式
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE
注释:这里最好使用"-o"选项来指定出口,MASQUEREADE会自动调用该接口的地址做为源地址出去。
2. 先说收DNAT
DNAT目标地址转换在PREROUTING链上作;能够将虚拟机的服务映射到宿主机的ip上,达到访问宿主的 ip就等于访问虚拟机的效果;
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.2:80
-d 物理机的ip --dport 端口 DNAT 被映射的内网主机ip:端口
应用场景:
这样主要是为了 能让内网的主机可以对外提供服务:数据包的第一站 PREROUTING ,匹配到规则就执行规则进行DNAT转发,通过FORWARD ,到达POSTROUTING出站。没有匹配到就进入INPUT,进行匹配
3.再说SNAT
SNAT源地址转换在POSTROUTING链上作; 能够为局域网提供上网服务
iptables -t nat -A PORTROUTING -o br0 -j MASQUERADE
应用场景:
主机上的NAT 虚拟机须要访问物理网路,虚拟机直接经过先 通过FORWARD,而后经过POSTROUTING 将源地址转换
4. 再说说不须要通过转换的数据包,如图示绿色的部分,直接到达INPUT-->OUTPUT-->POSTROUTING出来了,好比说我要ssh远程这个主机,走的就是这个流向;
A. 若是想让相对的局域网内服务器对外提供web服务,须要作DNAT规则:
iptables -t nat -A PREROUTING -d 公网IP -p tcp –m tcp --dport 公网端口 -j DNAT --to-destination 内网IP:80
我将外网IP 的80,8080 端口都映射到了内网IP的80端口:
通过PREROUTING 链后还须要通过FORWARD 链,须要在FORWARD这开放提供web服务的80 端口:
iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT
理论上还须要开放一下--sport 80 , 可是若是已经有下面这个规则了,就不须要了:
这个规则是容许已有链接直接经过;但有大量数据包通过时,能够提升速度!
iptables - I FORWARD –p tcp -m state -- state RELADE,RSTABLISHED - j
ACCEPT
看看实际的效果:
B. 固然FORWARD链处,能够对转发进行数据包的过滤,好比我想经过公网服务器的ip,远程ssh链接局域
网内的服务器,就可使用DNAT进行转换内网主机的22端口,可是为了安全,我想限制能够远程的IP地
址:我只想让我一我的能够 远程,个人ip是192.168.1.154,内网网段是192.168.122.0/24
DNAT:
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22
FORWARD:
iptables -A FORWARD -s 192.168.1.154 -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
个人ip地址
在192.168.1.154上 ssh远程一下看看
再到其余的主机上ssh试试看,这个主机ip是192.168.1.20
看的出来FORWARD 上的那个规则生效了。
C. 当内网的主机或本地的虚拟机须要经过本机上网时,须要作SNAT规则:个人环境是虚拟机要经过宿主
机上网,虚拟机以宿主机为网关,虚拟机的网段是192.168.122.0/24,宿主机的网段是
192.168.1.0/24,相对来讲宿主机网段就是外网,虚拟机就是内网。
-j MASQUERADE 是当外网ip不固定时,这个配置 I 能够自动获取外网ip。
iptables -t nat -A POSTROUTING -o br0 -s 内网段/24 -j MASQUERADE
-s配置不是必须的,在真实局域网环境中,也许会有多个局域网段,这时就能够经过-s 配置,指定那个网段能够上网