Linux运维:Iptables防火墙
Ago linux运维群: 93324526 矮哥个人QQ:578843228
前言:
安全的重要性,不是简单的防火墙就能解决的。但是,防火墙的重要性又是不能忽视的。
第1章 介绍
1.1 iptables防火墙
关闭两项功能:
1.selinux(生产中也是关闭的),ids入侵监测。
2.iptables(生产中看情况,内网关闭,外网开启)
大并发的情况,不能开iptables,影响性能(用硬件防火墙)
安全优化:
- 尽可能不给服务器配置外网IP,可以通过代理转发或者通过防火墙映射。
- 并发不是特别大情况在外网IP的情况,开启防火墙
如果并发很大,不能开启iptables,影响性能,硬件防火墙。
1.2 Itables
是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,
它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。
Iptables主要工作在OSI七层的二,三,四层,如果重新编译内核,Iptables也可以支持7层控制(squid代理+iptables)
1.3 Iptables企业应用场景
- 主机防火墙(filter表的INPUT链)
- 局域网共享上网(nat表的POSTROUTING链),半个路由器,NAT功能
- 端口及IP(一对一)映射(nat表的PRETOUTING链),硬件防火墙的NAT功能。
Iptables工作流程
iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
1.4 iptables工作流程小结:
- 防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
- 如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不能向下匹配新规则了。
- 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
- 防火墙的默认规则是对应链的所有的规则执行完才会执行的,(最后执行的规则)
提示:
Iptables防火墙规则的执行循序默认从前到后(从上到下)依次2执行,遇到匹配的规则就不再继续向下检查,只有遇到不匹配的规则才会继续向下进行匹配。
商用防火墙
华为、深信服、思科、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链)
filter:
强调:主要和主机自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包。)filter表iptables默认使用的表。这个表轻易了三个链(chains)
企业工作场景:主机防火墙
INPUT:负责过滤所有目标地址是本机地址的数据包,通俗的讲,就是过滤进入主机的数据包
FORWARD:负责转发流经主机的数据包。起转发的作用,和nat关系很大,
OUTPUT:处理所有源地址是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包
强调:对于filter表的控制是实现本机防火墙功能的重要手段,特别是对INPUT链的控制
nat表:
负责网络地址转换,即来源与目的ip地址的port的转换,应用:和主机本身无关。一般用于局域网共享上网或特殊的端口转换服务相关。
NAT功能一般企业工作场景
1.用于做企业路由(zebra)或网关(iptables),共享上网(postrouting)
2.做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(prerouting)
3.web,单个端口的映射。直接映射80端口(prerouting)
这个表定义了三个链(chains),nat功能就相当于网络的acl控制。和网络交换机类似
OUTPUT:和主机发出去的数据包有关,改变主机发出数据包的目标地址。
PREROUTING:在数据包到达防火墙时进行路由判断之前执行的规则。作用时改变数据包的目的地址,目的端口等。(通俗比 喻:就是收信时,根据规则重写收件人的地址)例如:把公网IP:124.42.60.113映射到局域网的192.168.1.155服务器上。如果时web服务,可以把80转为局域网的服务器上的9000端口。
POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。(通俗比喻,就是寄信时,写好发件人的地址,要让人家回信时能够有地址可回)。例如:笔记本和虚拟机都是192.168.1.0/24,就是出网的时候被我们企业路由器把源地址改成了公网地址了。生产应用:局域网共享上网。
Mangle:
主要负责修改数据包中特殊的路由标记,如TTL,TOS,MARK等。这个表定义了5个链(chains):
INPUT
FORWARD
OUUTPUT
PREROUTING
POSTROUTING
第2章 实战
2.1 查看
2.1.1 启动并查看默认规则,默认查看filter表里的链
[root@iptables ~]# /etc/init.d/iptables start
iptables: Applying firewall rules: [ OK ]
[root@iptables ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.1.2 查看顺序
iptables -nL --line-number
[root@iptables ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
2.1.3 查看nat表
[root@iptables ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.1.4 查看启动状态命令:
iptables -nL --line-number
-n #<==以数字的形式显示规则
-L #<==列表链里的所有规则
--line-number #<==打印规则序号
-t 指定表(default: `filter')
2.2 命令:参数 -I -D -A
iptables [-t table] -A chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -D chain rulenum #<==根据规则号删除。
iptables [-t table] -D chain rule-specification
注释:
-t 指定表d(efault: `filter')
-A #<==把规则添加到指定的链上,默认添加到最后一行。
-I #<==插入规则,默认插入到第一行。
-D #<==删除链上的规则
2.2.1 根据规则号删除:
iptables -D INPUT 4 #<==4是规则号。
-F #<==清除一个链或所有链上的规则
-Z #<==链的记数器清零
-X #<==删除用户自定义的链。
清除规则
[root@iptables ~]# iptables -F
[root@iptables ~]# iptables -Z
[root@iptables ~]# iptables -X
2.3 关闭22端口,拒绝用户访问
[root@iptables ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
封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 #<==指定源端口。
2.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)。
2.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 #<==最佳
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp --dport 18:80 -j DROP
2.6 禁ping
[root@iptables ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP
[root@iptables ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j ACCEPT
[root@iptables ~]# iptables -t filter -I INPUT -p icmp --icmp-type 8 -j ACCEPT
匹配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
2.7 匹配网络状态
-m state --state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
2.7.1 #允许关联的状态包 ftp协议
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2.7.2 限制指定时间包的允许通过数量及并发数
-m limit --limit n/{second/minute/hour}:
2.7.3 指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/min -j DROP
--limit-burst [n]
在同一时间内允许通过的请求"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
2.8 实战部署
[root@iptables ~]# iptables -F
[root@iptables ~]# iptables -Z
[root@iptables ~]# iptables -X
[root@iptables ~]# iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT # 允许自己登录/
[root@iptables ~]#
[root@iptables ~]#
[root@iptables ~]# iptables -P INPUT DROP # 修改默认input drop
[root@iptables ~]# 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
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@iptables ~]# iptables -P OUTPUT ACCEPT # 修改默认output ccept
[root@iptables ~]# iptables -P FORWARD DROP # 修改默认 forward drop
[root@iptables ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT # 开启端口对外服务
[root@iptables ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT # 局域网打开
[root@iptables ~]# iptables -A INPUT -i lo -j ACCEPT # 回询都照顾打开
[root@iptables ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2.8.1 查看最终
[root@iptables ~]# 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
2.8.2 生效
以上都是内存生效。永久生效。
[root@iptables ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@iptables ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Mon Apr 17 12:04:18 2017
*nat
:PREROUTING ACCEPT [13:702]
:POSTROUTING ACCEPT [57:4118]
:OUTPUT ACCEPT [57:4118]
COMMIT
# Completed on Mon Apr 17 12:04:18 2017
# Generated by iptables-save v1.4.7 on Mon Apr 17 12:04:18 2017
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [67:6732]
-A INPUT -s 10.0.0.0/24 -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 Mon Apr 17 12:04:18 2017
2.8.3 nmap扫描测试
扫描测试:使用云主机部署,用笔记本虚拟机扫描
[root@ iptables ~]# 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
2.9 生产维护iptables:
2.9.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.9.2 临时封Ip(-I)
iptables -I INPUT -s 203.71.78.10 -j DROP
2.9.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
2.9.4 以上的脚本
#!/bin/bash
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
2.9.5 局域网共享的两条命令方法:
方法1:适合于有固定外网地址的:
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
(1)-s 172.16.1.0/24 办公室或IDC内网网段。
(2)-o eth0 为网关的外网卡接口。
(3)-j SNAT --to-source 10.0.0.8 是网关外网卡IP地址。
方法2:适合变化外网地址(ADSL):
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE ç伪装。
映射端口10.0.0.8的9000映射到172.16.1.51的22
iptables -t nat -A PREROUTING -d 10.0.0.8 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.51:22
2.10 生产案例:
2.10.1 局域网共享上网项目案例
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.7
2.10.2 端口映射 10.0.0.8:9000 -->172.16.1.51:22
实现命令:
iptables -t nat -A PREROUTING -d 10.0.0.8 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.51:22
2.10.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
2.10.4 检查:
ping 10.0.0.81
tcpdump|grep -i icmp(两台机器上分别监测)
telnet 10.0.0.81 873(51上提前配好)
2.11内核优化详解
vi /etc/sysctl.conf
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.tcp_syncookies = 1
#→表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_keepalive_time = 1200
#→表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 4000 65000
#→表示用于向外连接的端口范围。缺省情况下很小。
net.ipv4.tcp_max_syn_backlog = 8192
#→表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 30000
#→表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为 180000,对于Apache、Nginx等服务器来说可以调 整低一点,如:改为5000-30000,不同业务的服务器也可以给大一点,比如lvs,squid。
#上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。
#此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
网站摘要,解决了 8888端口可以被访问,但是主机不能访问外面的任意端口
iptables -F # 清楚规则
iptables -X
iptables -P INPUT DROP # 全部丢弃
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 打开端口
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT # 打开端口
iptables -A INPUT -p tcp --dport 8888 -j ACCEPT # 打开端口
iptables -A OUTPUT -p tcp --sport 8888 -j ACCEPT # 打开端口
iptables -A INPUT -i lo -p all -j ACCEPT # 打开lo网卡的使用
iptables -A OUTPUT -o lo -p all -j ACCEPT
iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP # 丢弃坏的TCP包
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT # 处理IP碎片数量,防止攻击,允许每秒100个
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT # 设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开启对指定网站的访问
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp -d www.baidu.com -j ACCEPT # 这句话有问题 需要打开53端口,获取DNS