Iptables防火墙
1.1Iptables是什么?
开源的基于数据包过滤的防火墙工具。
还可以做NAT映射:1)网关:局域网共享上网。2)IP或端口映射。
Iptables主要工作在OSI七层的二三四层,若果重新编译内核。
Iptables也可以支持7层(squid代理+iptables).
1.2Iptables企业应用场景
1、主机防火墙(filter表的INPUT链)。
2、局域网共享上网(nat表的POSTROUTING链)。半个路由器,NAT功能。
3、端口及IP(一对一)映射(nat表的PREROUTING链),硬防的NAT功能。
1.3Iptables工作流程
前面介绍已经提到,iptable是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
1.3.1iptables工作流程小结:
1、防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2、如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
3、如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4、防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。
1.4 商用防火墙
华为 深信服 思科 H3C Juniper天融信 飞塔 网康 绿盟科技 金盾
1.5 iptables表(tables)和链(chains)
iptables==>4个表(tables)===>5个链=(chains)==>规则(policy)
4表
filter(主机防火墙)
nat(端口或IP映射或共享上网)
mangle(配置路由标记 ttl tos mark)
raw
表:
filter:INPUT,OUTPUT,FORWARD
NAT :POSTROUTING,PREROUTING,OUTPUT
mangle:INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING
raw
链:
*INPUT:进入主机的数据包。主机防火墙(filter表的INPUT链)
OUTPUT:流出主机的数据包。
FORWARD:流经主机的数据包。
*PREROUTING:进入服务器最先经过的链,NAT端口或IP映射。(nat表的PREROUTING链)
*POSTROUTING:在流出服务器最后经过的链,NAT共享上网。局域网共享上网(nat表的POSTROUTING链)
在默认情况下,Iptables术语后,相信大家对iptables的表和链有了初步的了解,默认情况下,Iptables根据功能和表的定义划分包含四个表,filter,nat,mangle,raw其每个表又包含不同的操作链(chains)
下面的表格展示了表和链的对应关系
表(tables) |
链(chains) |
||||
INPUT |
FORWARD |
OUTPUT |
PREROUTING |
POSTROUTING |
|
Filter |
有 |
有 |
有 |
无 |
无 |
Nat |
无 |
无 |
有 |
有 |
有 |
Mangle |
有 |
有 |
有 |
有 |
有 |
Filter表: |
Filter表是iptables默认使用的表,强调:主要和主机自身有关,真正负责主机防火墙功能的(过滤流入出主机的数据包)。这个表定义了三个链(chains);企业工作场景:主机访火墙功能。 |
|
INPUT |
负责过滤所有目标是本机地址的数据包,通俗的讲,就是过滤进入主机的数据包。 |
|
FORWARD |
负责转发流经主机的数据包,起转发作用,和Nat关系很大,后面会详细介绍,LVS NAT模式 net.ipv4_forward=0 |
|
OUTPUT |
处理所有源地址是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包。 |
1.6 iptables表和链
实战:
命令: 表上配置 链上 规则
Iptables [-t table] -A chain rule-specification
Iptables [-t table] -I chain rule-specification
Iptables [-t table] -D chain rulenum
Iptables [-t table] -D chain rule-specification
注释:
-t 指定表
-A 把规则添加到指定链上,默认插入到最后一行
-I 插入规则到第一行
-D 删除链上的规则
1.7启动iptables
1.7.1启动iptables
[root@web01 ~]# /etc/init.d/iptables start
iptables: Applying firewall rules: [ OK ]
1.7.2查看启动状态命令:
iptables -nL --line-number
-n #<==以数字的形式显示规则
-L #<==列表链里的所有规则
--line-number #<==打印规则序号
-t 指定表(default: `filter')
[root@web01 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 10.0.0.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
-iptables -D INPUT 4 #<==4是规则号。
-F #<==清除一个链或所有链上的规则
-Z #<==链的记数器清零
-X #<==删除用户自定义的链。
实践:
[root@web02 ~]# iptables -Z
[root@web02 ~]# iptables -X
[root@web02 ~]# iptables -F
[root@web02 ~]# iptables -nL
1.7.3 封22端口的方法
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
规则注释:
-p #<==指定过滤的协议-p(tcp,udp,icmp,all)
--dport #<==指定目标端口(用户请求的端口)。
-j #<==对规则的具体处理方法(ACCEPT,DROP,REJECT,SNAT/DNAT)
--sport #<==指定源端口。
1.7.4 禁止10.0.0.253访问
[root@web01 ~]# iptables -I INPUT -p tcp -s 10.0.0.253 -i eth0 -j DROP
[root@web02 ~]# iptables -A INPUT -p tcp ! -s 10.0.0.2 -i eth0 -j DROP
-s #<==指定源地址。 ! 取反。
-d #<==指定目的地址。
-i #<==进入的网络接口(eth0,eth1)。
-o #<==出去的网络接口(eth0,eth1)。
1.7.5匹配端口范围:
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP #<==最佳
1.7.3匹配ICMP类型
iptables -A INPUT -p icmp --icmp-type 8
例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
1.7.4匹配网络状态
-m state --state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
1.7.5允许关联的状态包 ftp协议
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
1.7.6限制指定时间包的允许通过数量及并发数
-m limit --limit n/{second/minute/hour}:
指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/min -j DROP
--limit-burst [n]
1.7.7在同一时间内允许通过的请求"n"为数字,不指定默认为5
iptables -I INPUT -s 10.0.0.0/24 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT
http://blog.csdn.net/gnicky/article/details/51334793
部署一个最安全的企业级防火墙(案例
两种思想:针对默认规则而言。
逛公园:
1、默认规则默认是允许的状态。
看电影:
2、默认规则默认是不允许的状态。更安全。
看电影的思想更安全。
实战部署:
[root@web02 ~]# iptables -F
[root@web02 ~]# iptables -X
[root@web02 ~]# iptables -Z
[root@web02 ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
[root@web02 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@web02 ~]# iptables -P INPUT DROP
[root@web02 ~]# iptables -P FORWARD DROP
[root@web02 ~]# iptables -P OUTPUT ACCEPT
[root@web02 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@web02 ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
[root@web02 ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
[root@web02 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@web02 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
命令都在内存中生效。
1.7.8扫描测试:使用云主机部署,用笔记本虚拟机扫描
[root@web02 ~]# nmap www.baidu.com
Starting Nmap 5.51 ( http://nmap.org ) at 2017-04-04 12:23 CST
Nmap scan report for www.baidu.com (119.75.217.109)
Host is up (0.020s latency).
Other addresses for www.baidu.com (not scanned): 119.75.218.70
Not shown: 998 filtered ports
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 13.60 seconds
永久生效:
[root@web02 ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@web02 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Tue Apr 4 12:24:43 2017
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [159:10664]
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Apr 4 12:24:43 2017
1.7.9生产维护iptables:
1、日常改/etc/sysconfig/iptables配置
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
生效:
1)/etc/init.d/iptables reload
2)iptables -I INPUT 3 -p tcp -m tcp --dport 3306 -j ACCEPT
2、临时封Ip(-I)
iptables -I INPUT -s 203.71.78.10 -j DROP
3、常用的规则放在前面生效
[root@web01 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Mon Apr 17 12:03:54 2017
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [371:25376]
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Mon Apr 17 12:03:54 2017
写成脚本:
#!/bin/bash
#this is a server firewall created by oldboy 17:03 2006-7-26
#updated by oldboy on 10:30 2009-6-23
#http://blog.etiantian.org
#qq:49000448
#define variable PATH
IPT=/sbin/iptables
#Remove any existing rules
$IPT -F
$IPT -X
$IPT -Z
#setting default firewall policy
$IPT --policy OUTPUT ACCEPT
$IPT --policy FORWARD DROP
$IPT -P INPUT DROP
#setting for loopback interface
$IPT -A INPUT -i lo -j ACCEPT
#setting access rules
#one,ip access rules,allow all the ips of
$IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT
$IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT
$IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
$IPT -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT
$IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT
#icmp
$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
#others RELATED
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/etc/init.d/iptables save
#iptables-save >/etc/sysconfig/iptables
生产案例:
1、局域网共享上网项目案例
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.7
2、端口映射 10.0.0.7:9000 -->172.16.1.51:22
实现命令:
iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.51:22
3、IP一对一映射(DMZ)
ip addr add 10.0.0.81/24 dev eth0 label eth0:0
iptables -t nat -I POSTROUTING -s 10.0.0.0/255.255.240.0 -d 10.0.0.81 -j SNAT --to-source 10.0.0.2
iptables -t nat -I PREROUTING -d 10.0.0.81 -j DNAT --to-destination 172.16.1.51
iptables -t nat -I POSTROUTING -s 172.16.1.51 -o eth0 -j SNAT --to-source 10.0.0.81
检查:
ping 10.0.0.81
tcpdump|grep -i icmp(两台机器上分别监测)
telnet 10.0.0.81 873(51上提前配好)
1.7.9映射多个外网IP上网
iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16
iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.11
iptables -t nat -A POSTROUTING -s 10.0.2.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.12