- 学习一个服务的过程:
- 1此服务器的概述:名字,功能,特点,端口号 2安装 3配置文件的位置 4服务启动关闭脚本,查看端口 5此服务的使用方法 6修改配置文件,实战举例 7排错(从下到上,从内到外)
10.12 firewalld和netfilter
1. 临时关闭selinux(防火墙) : setenforce 0
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
2. 永久关闭selinux(防火墙),编辑...config配置文件 :(好多服务,受限于selinux,关闭selinux也不会有太大的安全问题)
[root@localhost ~]# vi /etc/selinux/config #更改:SELINUX=disabled
3. 禁止开机启动firewalld服务(centos7默认防火墙) ,firewalld(关闭centos7默认防火墙):
(firewalld默认是centos7的防火墙,可以关闭掉这个,用centos6上的防火墙netfilter)
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
4. 关掉(停止)firewalld服务(centos7默认防火墙) :
[root@localhost ~]# systemctl stop firewalld
5. 安装netfilter服务(centos6或centos5默认防火墙) :netfilter(开启centos6默认防火墙) 注意:(iptables是netfiltel防火墙的工具)
[root@localhost ~]# yum install -y iptables
[root@localhost ~]# yum install-y iptables-services
6. 启用iptables服务 :
[root@localhost ~]# systemctl enable iptables
7. 开启iptables服务 :
[root@localhost ~]# systemctl start iptables #/etc/init.d/iptables start #启动iptables #service iptables start #同左
8. 查看iptables默认规则 :
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
22 1636 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.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
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 17 packets, 1632 bytes)
pkts bytes target prot opt in out source destination
9.开机启动
chkconfig --list iptables #查询iptables 开机启动状态
chkconfig iptables on #启用iptables开机启动
10.13 netfilter 5表5链介绍
数据包流向与netfilter的5个链:其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。
- netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
- iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
- netfilter/iptables 后期简称为:iptables。 iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表。
Linux防火墙-netfilter:netfilter的5个表
• filter表用于过滤包,最常用的表,有INPUT、FORWARD、OUTPUT三个链
• nat表用于网络地址转换,有PREROUTING、OUTPUT、POSTROUTING三个链
• managle表用于给数据包做标记,几乎用不到
• raw表可以实现不追踪某些数据包,阿铭从来不用
• security表在Centos6中并没有,用于强制访问控制(MAC)的网络规则,阿铭老师没用过
- 参考文章 http://www.cnblogs.com/metoy/p/4320813.html https://www.cnblogs.com/xiaogan/p/5944310.html 学神 哔哩哔哩
• PREROUTING:数据包进入路由表之前
• INPUT:通过路由表后目的地为本机
• FORWARD:通过路由表后,目的地不为本机
• OUTPUT:由本机产生,向外发出
• POSTROUTING:发送到网卡接口之前
表间优先顺序 raw > mangle > nat > filter
总结:
整体数据包分两类: 1、发给防火墙本身的数据包 ;2、需要经过防火墙的数据包注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
10.14 iptables语法:
iptables命令的管理控制选项 表--> 链 --> 规则 ###一般企业中多用物理防火墙 思科华为等等等 # 软件防火墙主要用来内网上网
-P 设置指定链的默认策略(policy) #默认不写入,优先级最低???
-F 清空(flush)临时清空
-X 删除指定表中用户自定义的规则链(delete-chain)
-N 新建(new-chain)一条用户自己定义的规则链
-E 重命名用户定义的链,不改变链本身
-Z 将所有表的所有链的字节和数据包计数器清零
-A 在指定链的末尾添加(append)一条新的规则
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-L 列出(list)指定链中所有的规则进行查看
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)
-p 指定协议为tcp / udp
-s 指定来源ip
--sport 指定来源端口
-d 指定目标ip
--dport 指定目标端口
-i 指定网卡
-t nat 指定表 nat表 ;不加-t : 默认指定filter表
-j DROP 扔掉;
防火墙处理数据包的四种方式
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
REDIRECT 与DROP基本一样,区别在于它除了阻塞包之外
SNAT 源地址转换,即改变数据包的源地址
DNAT 目标地址转换,即改变数据包的目标地址
iptables [-t 表名] 管理选项 [链名] 匹配条件 [-j 动作或跳转]
- # 不指定表名时,默认是filter
- # 不指定链名时,默认表内所有链
- # 除非设置规则链的缺省策略,否则需要指定匹配条件
1. 查看iptables默认规则配置文件,查看iptables默认规则:
[root@localhost ~]# cat /etc/sysconfig/iptables
[root@localhost ~]# iptables -nvL #查看iptables默认规则
[root@localhost ~]# iptables -nvL --line-number
num pkts bytes target prot opt in out source destination
1 1161 101K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ...
[root@localhost ~]# iptables -t nat -nvL #查看指定表
[root@localhost ~]# iptables -t filter -nvL #查看指定表
2. 保存iptables规则(当前规则,保存到配置文件):
[root@localhost ~]# service iptables save
3. 清空iptables规则:
[root@localhost ~]# iptables -F #临时清空
[root@localhost ~]# service iptables save #执行一下为完全清空
4. 重启iptables规则:
[root@localhost ~]# service iptables restart
8. 把表的计数器清零:(因为每时每刻都是在通信,数据清零一会又会有数据)
[root@localhost ~]# iptables -Z ; iptables -nvL
9. 增加规则,增加到最后面:-A 增加一条规则,添加在最后;-I 插入一条规则,添加在最前;(排在最前的规则,优先过滤前面的,再过滤下面的规则)
iptables -A(增加一条规则) INPUT(链) -s 来源ip -p tcp(协议) --sport 来源端口 -d 目标ip --dport 目标端口 -j DROP(扔掉)
[root@localhost ~]# iptables -A INPUT -s 192.168.223.1 -p tcp --sport 1234 -d 192.168.223.128 --dport 80 -j DROP
10. 删掉规则:
iptables -D(删除一条规则) INPUT(链) -s 来源ip -p tcp(协议) --sport 来源端口 -d 目标ip --dport 目标端口 -j DROP(扔掉)
[root@localhost ~]# iptables -D INPUT -s 192.168.223.1 -p tcp --sport 1234 -d 192.168.223.128 --dport 80 -j DROP
11. 插入规则,添加在最前面:
iptables -I(插入一条规则) INPUT(链) -p tcp(协议) --dport 目标端口 -j DROP(扔掉)
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j DROP;iptables -nvL
12. 插入规则,添加在最前面,并指定网卡:-i 指定网卡
iptables -I(插入一条规则) INPUT(链) -s 来源IP/24 -i 网卡名称 -j ACCEPT(扔掉)
[root@localhost ~]# iptables -I INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT
13. 删掉 设定的规则(自己记得规则怎么写的,要不没法指定删除哦):
[root@localhost ~]# iptables -D INPUT -p tcp --dport 80 -j DROP
14. 打印出规则的序列号编号:
[root@localhost ~]# iptables -nvL --line-number
15. 删除指定规则:iptables -D INPUT 规则序列号编号
[root@localhost ~]# iptables -D INPUT 2
16.更改默认规则(不常用慎用):iptables -P OUTPUT DROP
如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
动作前面不能加 –j,这也是唯一一种匹配动作前面不加 –j 的情况。
17.恢复默认规则:iptables -P OUTPUT ACCEPT #默认规则优先级最低
18.技巧注意:
1、-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则。
2、-P 设置了 DROP 后,使用 -F 一定要小心!!!
##在生产环境中,使用-P DROP 这条规则,一定要小心,设置之前最好配置下面两个任务计划,否则容易把自己drop掉,链接不上远程主机。配置crontab -e:
*/15 * * * * iptables -P INPUT ACCEPT
*/15 * * * * iptables –F
3、如果不写链名,默认清空某表里所有链里的所有规则
匹配条件
£流入、流出接口(-i、-o)£来源、目的地址(-s、-d)£协议类型(-p)£来源、目的端口(--sport、--dport)
动作(处理方式)-j
£ACCEPT # 通过 £DROP # 丢弃 £SNAT # 源地址转换 £DNAT # 目的地址转换 £MASQUERADE
- 内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
- 当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
- -j MASQUERADE # 动态源地址转换(动态 IP 的情况下使用)
附加模块
£按包状态匹配 (state)£按来源 MAC 匹配(mac)£按包速率匹配(limit)£多端口匹配 (multiport)
状态:NEW、RELATED、ESTABLISHED、INVALID
- NEW:有别于 tcp 的 syn /ESTABLISHED:连接态 /RELATED:衍生态,与 conntrack 关联(FTP) /INVALID:不能被识别属于哪个连接或没有任何状态
- -s 192.168.0.1 # 匹配来自 192.168.0.1 的数据包
- -s 192.168.1.0/24 # 匹配来自 192.168.1.0/24 网络的数据包
- -s 192.168.0.0/16 # 匹配来自 192.168.0.0/16 网络的数据包
- -d 202.106.0.20 # 匹配去往 202.106.0.20 的数据包
- -d 202.106.0.0/16 # 匹配去往 202.106.0.0/16 网络的数据包
- -d www.abc.com # 匹配去往域名 www.abc.com 的数据包
- -p tcp / -p udp / -p icmp --icmp-type 类型
- ping: type 8 pong: type 0
- --sport 1000 # 匹配源端口是 1000 的数据包
- --sport 1000:3000 # 匹配源端口是 1000-3000 的数据包(含1000、3000)
- --sport :3000 # 匹配源端口是 3000 以下的数据包(含 3000)
- --sport 1000: # 匹配源端口是 1000 以上的数据包(含 1000)
- --dport 80 # 匹配目的端口是 80 的数据包
- --dport 6000:8000 # 匹配目的端口是 6000-8000 的数据包(含6000、8000)
- --dport :3000 # 匹配目的端口是 3000 以下的数据包(含 3000)
- --dport 1000: # 匹配目的端口是 1000 以上的数据包(含 1000)
- 注意:--sport 和 --dport 必须配合 -p 参数使用
- -p udp --dport 53 # 匹配网络中目的端口是 53 的 UDP 协议数据包
- -s 10.1.0.0/24 -d 172.17.0.0/16 # 匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包
- -s 192.168.0.1 -d www.abc.com -p tcp --dport 80 # 匹配来自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 协议数据包
- iptables -A INPUT -j ACCEPT # 允许所有访问本机 IP 的数据包通过
- iptables -A FORWARD -s 192.168.80.39 -j DROP # 阻止来源地址为 192.168.80.39 的数据包通过本机
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1# 将内网 192.168.0.0/24 的原地址修改为 1.1.1.1,用于 NAT
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10 # 同上,只不过修改成一个地址池里的 IP
- iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1 #把从 eth0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1
- iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80 #把从 eth0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1
- iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10#把从eth0进来的要访问TCP/80的数据包目的地址改为192.168.0.1-192.169.1.10
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE#将源地址192.168.0.0/24的数据包进行地址伪装,转换成eth0的IP地址.eth0为路由器外网出口IP地址
- iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables -A INPUT -p tcp --dport 21 -j ACCEPT # iptables -A INPUT -p tcp --dport 20 -j ACCEPT #开放20、21端口
- iptables -A INPUT -i lo -j ACCEPT #放行本地回环网络
- iptables -A INPUT -p tcp -m multiport --dports 21,22,80 -j ACCEPT #放行21,22.80端口
- iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #放行已连接的网络状态
- iptables -A INPUT -p icmp -j ACCEPT #放行icmp协议
- iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP #阻断来自某 MAC 地址的数据包,通过本机
- iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT #50/s表示1秒中转发50个数据包
- iptables -A FORWARD -d 192.168.0.1 -j DROP #以上两条一起用一定速率去匹配数据包
- iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT #一次性匹配多个端口,可以区分源端口,目的端口,必须与 -p 参数一起使用
10.15 iptables filter表小案例
例0:iptables表小案例需求
对filter表开放22端口、80端口、 21端口;
INPUT链:DROP;
OUTPUT链和FORWARD链:ACCEPT;
22端口只针对192.168.136.0/24开通;
所有网段开放80端口、 21端口。
1. 创建iptables.sh脚本:
[root@localhost ~]# vim /usr/local/sbin/iptables.sh
脚本内容添加:
#! /bin/bash
ipt="/usr/sbin/iptables" #定义变量iptables
$ipt -F #清空规则,(没有-t,默认是执行的filter)
$ipt -P INPUT DROP #进来数据默认策略
$ipt -P OUTPUT ACCEPT #出去数据默认策略
$ipt -P FORWARD ACCEPT #转发数据默认策略
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #允许所有已经建立的连接,表现为本机可以ping其他主机,但是其他主机无法ping本机
$ipt -A INPUT -s 192.168.223.0/24 -p tcp --dport 22 -j ACCEPT #增加规则(192.168.223网段访问22端口的数据包放行)
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT #增加规则(80端口数据包方行)
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT #增加规则(21端口数据包放行)
2. 执行iptables.sh脚本:[root@localhost ~]# sh /usr/local/sbin/iptables.sh
3. 查看iptables.sh规则:[root@localhost ~]# iptables -nvL
4. 恢复默认规则(重启了iptables服务,因为刚刚设定的规则没有保存到配置文件!):[root@localhost ~]# service iptables restart
filter表小案例
1. 本机可以ping通外网,别人ping不通本机(禁ping) :[root@localhost ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
2. 删除禁ping的规则:[root@localhost ~]# iptables -D INPUT -p icmp --icmp-type 8 -j DROP
例1:使用iptables防火墙保护公司web服务器
- 1.1 本地回环网络放行 iptables -A INPUT -i lo -j ACCEPT
- 1.2 放行ssh和web端口 iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
- 1.3 放行已建立连接 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
- #允许已经建立tcp连接的包以及该连接相关的包通过。状态防火墙能识别TCP或者UDP会话。非状态防火墙只能根据端口识别,不能识别会话
- 1.4 设置默认禁止 iptables -P INPUT DROP
- 注:一般iptables,OUTPUT出口一般都放行,不需要在出口上做限制。这样允许服务器主动访问外网所有数据。
- 1.5 启动httpd服务器 service httpd start
- 1.6 启动vsftpd服务 /etc/init.d/vsftpd start #very secure FTP deamon
- 2 客户端测试 2.1 安装 elinks和 lftp并测试服务器yum -y install elinks
- 测试web访问80端口elinks 192.168.247.64→ yum -y install lftp 测试vsftpd访问→ lftp 192.168.31.64 → # 执行ls 说明禁止访问
例2:使用iptables搭建路由器,通过SNAT使用内网机器上网
分析: 内网机器,通过iptables服务器,访问互联网。内网机器与iptables服务器通信。iptables服务器将内网机器请求转发到外网网卡,实现内网机器上网。故,iptables服务器,开启内核路由转发功能
- 1.echo 1 > /proc/sys/net/ipv4/ip_forward→vim /etc/sysctl.conf→修改net.ipv4.ip_forward = 0 为→net.ipv4.ip_forward = 1→将修改应用到系统sysctl -p 开启转发
- 2. 在配置iptables之前,需将iptables清空,以免上面的实验影响→在清空iptables 之前,首先将例1中INPUT的默认值改回来,不然会断掉
- iptables -P INPUT ACCEPT→iptables -F
- 3.设置eth0,为桥接模式,eth1 vmnet6模式→添加网卡eth1,并设置eth1使用vmnet6网络环境后,设置IP
- 设置iptables转发规则:(由于转发是不经过本机的,须在nat表的POSTROUTING链中修改) eno33为外网网卡
- iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.63 / iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eno33 -j MASQUERADE
- 4.在客户端xiaogan63中 →设置eth0 vmnet6模式
- 并修改eth0 IP:192.168.2.63 GATEWAY=192.168.2.1(服务器eth1地址) NETMASK=255.255.255.0
- ping 192.168.2.1→ping 192.168.1.1→ping www.baidu.com
例3:拒绝访问服务器本身和拒绝通过服务器访问别的机器。
- 禁止访问服务器本身 iptables -A INPUT -s 192.168.2.2 -j DROP / iptables -A OUTPUT -d 192.168.2.2 -j DROP / iptables -A INPUT -s 192.168.2.0/24 -j DROP
- 禁止通过服务器访问其他主机(上网) iptables -A FORWARD -d 192.168.2.2 -j DROP / iptables -A FORWARD -d 192.168.2.0/24 -j DROP
- 限制某个mac地址访问服务器 iptables -A INPUT --mac-source XX:XX:XX:XX:XX:XX -j DROP
- 限制某个IP访问服务器 iptables -A INPUT -s XXX.XXX.XXX.XXX -j DROP
例4:使用DNAT功能把内网web服务器端口映射到路由器外网
- 端口映射方法一:
- iptables -t nat -A PREROUTING -d 192.168.77.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22 #发送过来的包
- iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.77.130 #反馈回去的包
- 端口映射方法二:分析:把内网web服务器的80端口映射到iptables服务器的80端口,让外网通过访问iptables的80端口,实现访问内网的web服务器
- iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.2.63:80
- iptables -t nat -A PREROUTING -d 192.168.31.64 -j DNAT --to 192.168.2.63 或
- iptables -t nat -A PREROUTING -d 192.168.31.64 -t tcp --dport 80 -j DNAT --to 192.168.2.63:80 或
- 如果是ADSL则为:iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.2.63:80 #清空iptables -t nat -F
- 测试:宿主机浏览器访问:192.168.0.63:80 即可访问到64的内容 #家里路由器左右DNAT、SNAT、DHCP
10.16 17 18 iptables nat表应用(上)(中)(下)
10.19 iptables规则备份和恢复
Linux防火墙—netfilter
1. 保存 iptables规则 :
(默认规则保存到:/etc/sysconfig/iptables文件中。)
[root@hostname ~]# service iptables save
2. 备份 iptables规则,重定向(保存)到指定路径 :
[root@hostname ~]# iptables-save > /tmp/ipt.txt
[root@hostname ~]# cat /tmp/ipt.txt #查看保存的iptables规则
3. 清空 iptables规则 :
[root@hostname ~]# iptables -t nat -F
4. 恢复 iptables规则(刚刚备份的) :
[root@hostname ~]# iptables-restore < /tmp/ipt.txt