4.16任务
10.12 firewalld和netfilter
10.13 netfilter5表5链介绍
10.14 iptables语法
10.15 iptables filter表案例
10.16/10.17/10.18 iptables nat表应用
扩展(selinux了解即可)
selinux教程 http://os.51cto.com/art/201209/355490.htm
selinux pdf电子书 http://pan.baidu.com/s/1jGGdExK
iptables应用在一个网段 http://www.aminglinux.com/bbs/thread-177-1-1.html
sant,dnat,masquerade http://www.aminglinux.com/bbs/thread-7255-1-1.html
iptables限制syn速率 http://www.aminglinux.com/bbs/thread-985-1-1.html http://jamyy.us.to/blog/2006/03/206.html
1 针对网段
iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP
192.168.1.0/24
iptables -I INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
-m 后面跟模块名字,iprange是一个模块名字,用来支持一个网段
--src-range 指定来源的ip范围
--dst-range 指定目标ip范围
2、iptables中DNAT、SNAT和MASQUERADE的理解 http://ask.apelearn.com/question/7255
3、在iptables上一共有四种状态,分别被称为NEW、ESTABLISHED、INVALID、RELATED
NEW:NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接的第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。
ESTABLISHED: ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。
RELATED: RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是 RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有关联的,如果没有在iptables的策略中配置RELATED状态,FTP-data的连接是无法正确建立的,还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID:INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西,因为防火墙认为这是不安全的东西。
4、限速
iptables限制syn速度 http://ask.apelearn.com/question/985%20;
iptables -N syn-flood
iptables -A syn-flood -m limit --limit 5/s --limit-burst 500 -j RETURN
iptables -A syn-flood -j DROP
iptables -I INPUT -j syn-flood
iptables 的limit模块 https://www.centos.bz/2018/10/iptables-%E7%9A%84limit%E6%A8%A1%E5%9D%97/
1、SELINUX
安全增强型Linux (SecurityEnhanced Linux)简称SELinux,它是一个Linux内核模块,也是Linux的一个安全子系 统。SELinux主要由美国国家安全局开发。2.6及以上版本的Linux内核都已经集成了 SELinux模块。SELinux的结构及 配置非常复杂,而且大量概念性的东西,要学精难度较大。很多Linux系统管理员嫌麻烦都把SELinux关闭了。
临时关闭SELINUX setenforce 0
查看状态 getenforce
selinux永久关闭 设置配置文件 vi /etc/selinux/config
三个状态:
1)enforcing 开启
2)permissive 开启状态,但是不生效,只记录日志。临时关闭,会调整到这个状态。
3)disabled 关闭
更改完配置后,需要重启系统,方可生效。
2、firewalld和netfilter
centos7默认使用的firewalld防火墙,netfilter是不开启的
Linux防火墙-netfilter
开启centos6上的防火墙netfilter,netfilter才是防火墙的名字,iptables只是netfilter的工具
禁止firewalld开机启动 systemctl disable firewalld
关掉firewalld服务 systemctl stop firewalld
开启netfilter之前,需要安装 yum install -y iptables-services
安装完成后产生iptables服务 systemctl enable iptables
开启iptables 服务 systemctl start iptables
查看默认规则 iptables -nvL,服务启动后,自带的规则
3、netfilter5表5链介绍
netfilter的5个表
man iptables 可以查看
iptables详解 http://www.cnblogs.com/metoy/p/4320813.html
1)filter表
三个链:有 INPUT、 FORWARD、 OUTPUT
作用:过滤数据包
2)nat表
三个链: PREROUTING、 OUTPUT、 POSTROUTING
作用:用于网络地址转换(IP、端口)
3)mangle表
五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:用于给数据包做标记,修改数据包的服务类型、TTL、并且可以配置路由实现QOS,几乎用不到
4)raw表
两个链: OUTPUT、PREROUTING
作用:可以实现不追踪某些数据包,决定数据包是否被状态跟踪机制处理,几乎不用
5)security表
三个链:INPUT、OUTPUT和FORWARD
作用:security表在centos6中并没有,用于强制访问控制(MAC)的网络规则,几乎不用
数据包流向与netfilter的5个内置的链
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外发出
POSTROUTING:发送到网卡接口之前
iptables 相关的命令应用及语法
iptables [-t table]命令[chain] [rules] [j target]
格式说明:
table:指定表名,iptables内置包括filter表、nat表、mangle、raw表和security表。
命令:对链的操作命令
chain:链名
rules:匹配规则
target:动作如何进行
操作命令选项说明:
-P或--policy <链名>:定义默认策略
-L或--list <链名> :查看iptables规则列表
-A或--append <链名>:在规则列表的最后增加1条规则
-I或--insert <链名>:在指定的位置插入1条规则
-D或--delete <链名>:从规则列表中删除1条规则
-R或--replace <链名>:替换规则列表中的某条规则
-F或--flush <链名>:删除表中所有规则(临时删除,重启iptables后复原)
-Z或--zero <链名>:将表中数据包计数器和流量计数器归零
规则选项说明:
-i或--in-interface<网络接口名>:指定数据包从哪个网络接口进入,如ppp0、eth0和ethl等 -o或--out-interface <网络接口名>:指定数据包从哪块网络接口输出,如ppp0、eth0和ethl等
-p或--proto协议类型 <协议类型>:指定数据包匹配的协议,如TCP、UDP和ICMP等 -s或--source<源地址或子网>:指定数据包匹配的源地址
--sport<源端口号>:指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
-d或--destination <目标地址或子网>:指定数据包匹配的目标地址
--dport<目标端口号>:指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
动作选项说明:
ACCEPT:接受数据包
DROP:丢弃数据包
REDIRECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息。
SNAT:源地址转换,即改变数据包的源地址
DNAT:目标地址转换,即改变数据包的目的地址
MASQUERADE:IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT
查看iptables规则 iptables -nvL
规则保存位置cat /etc/sysconfig/iptables
选项说明:
n:数字输出。IP地址和端口会以数字的形式打印
v:详细输出。这个选项让list命令显示接口地址、规则选项等信息
L -list:显示所选链的所有规则。如果没有选择链,则会显示所有链的所有规则
2)iptables -F 清空iptables规则,清空后/etc/sysconfig/iptables文件中还是有的
这里清空的只是当前iptables中设置的规则,不会清空以及保存的规则。重启iptables服务后还会去加载/etc/sysconfig/iptables配置文件中的规则,即可恢复保存过的规则
service iptables restart iptables服务重启后,规则恢复
service iptables save 保存规则,重启后依然生效,执行此命令会把当前iptables的所有规则保存到/etc/sysconfig/iptables文件中
iptables -Z 可以把计数器清零
iptables -t nat -nvL 查看nat表的规则, -t指定表,不加-t 默认filter表
增加一条规则 : iptables -A INPUT -s 192.168.86.3 -p tcp --sport 1234 -d 192.168.86.31 --dport 80 -j DROP
-A前不加-t默认filter表,-A(add)增加一条规则,针对INPUT链,指定来源IP :-s,-p指定协议,--sport来源端口,-d目标ip,--dport 目标端口,-j DROP把数据扔掉/REJECT(拒绝),DROP和REJECT效果一样,都是让数据包过不来,封掉ip
iptables -I INPUT -p tcp --dport 80 -j DROP 可以不写目标ip只写目标端口,-p tcp一定要写,使用dport前面一定要指定协议
-I(把规则放在最前面,插入)和-A (把规则放在最后面,添加),谁在前面谁就会被先匹配和加载
iptables -D INPUT -p tcp --dport 80 -j DROP 删除一条规则
iptables -D INPUT -s 192.168.86.3 -p tcp --sport 1234 -d 192.168.86.31 --dport 80 -j DROP 删除一条规则
iptables -nvL --line-numbers 把规则中的序列号打印出来
iptables -D INPUT 5 根据编号来删除规则
iptables -I INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT
添加默认规则
默认策略是ACCEPT
更改默认策略为DROP iptables -P OUTPUT DROP 此处执行后会让远程连接断开再也连不上
需要再服务器上 iptables -P OUTPUT ACCEPT 默认允许所有OUTPUT链的数据包通过,放行
默认允许所有FORWARD链的数据包通过 iptables -P FORWARD ACCEPT
默认丟弃INPUT链的数据包 iptables -P INPUT DROP
iptables filter表小案例
案例1:放行端口
只放行80、21、22三个端口的数据包,且22端口只有指定的IP段才能通过 这个案例可以编写一个shell脚本来实现。
vi /usr/local/sbin/iptables.sh 加入如下内容
案例1:放行端口
只放行80、21、22三个端口的数据包,且22端口只有指定的IP段才能通过 这个案例可以编写一个shell脚本来实现。
vi /usr/local/sbin/iptables.sh 加入如下内容
#! /bin/bash 定义执行脚本的shell
ipt="/usr/sbin/iptables" 定义一个变量,绝对路径
$ipt -F 清空iptables规则
$ipt -P INPUT DROP 默认规则,INPUT策略DROP,丢弃所有数据包
$ipt -P OUTPUT ACCEPT 默认规则,放行所有OUTPUT链的数据包
$ipt -P FORWARD ACCEPT 默认规则,放行所有FORWARD链的数据包
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 这条规则允许RELATED和ESTABLISHED状态的数据包给放行,这条规则必加,否则可能导致某些服务连不上
$ipt -A INPUT -s 192.168.86.0/24 -p tcp --dport 22 -j ACCEPT 仅允许192.168.86.0/24网段链接22端口
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT 允许通过所有80端口的数据包
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT 允许通过所有21端口的数据包
禁ping
让本机可以ping通别的机器,但是别的机器ping不通本机
icmp示例
service iptables restart 先把规则恢复成默认状态
此时在windows可以ping通本机
丟弃icmp包类型为8的数据包。icmp类型为8的数据包是icmp请求,类型为0的是应答包
iptables -I INPUT -p icmp --icmp-type 8 -j DROP 添加完此规则后,windows无法ping通本机,本机可以ping外网,不影响连接使用,只禁听
iptables nat表应用
需求1:可以让B机器连接外网
A机器两块网卡ens33(192.168.159.3)、ens37(192.168.100.1),ens33可以上外网,ens37仅仅是内部网络,
B机器只有ens37(192.168.100.100),和A机器ens37可以通信互联
步骤1:在虚拟机。A机器添加一个内网网卡,B机器也添加内网网卡。网卡模式并设置为LAN区段,自定义名字一样。
按下图:添加网络适配器
选择新添加的网卡,选择LAN区段,相当于给网卡连到了一个内网的交换机上,让两台电脑都连接这个交换机进行通信
A机器设置完成
设置B机器的网卡
禁掉B机器的启动时连接,同样按之前设置,添加新的网卡,选择相同LAN区段,目的是保证A、B机器的处于同一网段
设置完成,启动两台机器
查看A机器的网卡,可以远程连接,B机器因为没有windows可以连接的ip,无法远程连接
给ens37设置IP
ifconfig ens37 192.168.100.1/24 24网段,此ip重启后就没有了,永久生效需要更改配置文件
查看B机器,end33虽然存在,但是已经给关掉了,保险起见可以使用ifdown ens33 禁掉
给B机器的ens37设置IP : 192.168.100.100
可以使用mii-tool ens37的网络状态。
此时两台机器可以互联
但是两台机器都无法连接外网
设置方法
A机器上打开路由转发 echo "1">/proc/sys/net/ipv4/ip_forward 修改内核参数为1
ip_forward默认为0,表示没有开启端口转发(nat的应用),然后执行命令打开
增加规则:
A机器上执行 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE 目的是让100.0网段能够上网
B上设置网关为192.168.100.1
route add default gw 192.168.100.1
设置完成后可以ping通 A机器 192.168.159.3
给B机器设置DNS,公共的DNS119.29.29.29,vi /etc/resolv.conf
需求2:C机器和B机器连接
C机器只能和A通信,让C机器可以直接连通B机器的22端口
192.168.86.31的端口22映射到端口1122,连接B机器的192.168.100.100
B机器的192.168.100.100的端口22,映射为1122的端口,用192.168.86.31连接1122端口,也就是连接192.168.100.100的22端口
1、A上打开路由转发 echo "1">/proc/sys/net/ipv4/ip_forward
2、A上添加规则
添加之前要把之前的规则删掉:
iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
然后添加规则: iptables -t nat -A PREROUTING -d 192.168.86.31 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22 , 端口转发,转发到100.100的22端口
A上执行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.86.31
B上设置网关为192.168.100.1,设置网关才能联网
此时使用客户端链接即可
w查看负载,看到来源自192.168.86.1就是C机器
这说明机器C:192.168.86.1已经和机器B:192.168.100.100相连,机器C和机器A能够通信,而通过机器A来连接机器B的映射端口1122,达到了C和B通信,而且B机器也通过映射端口1122能够连接外网。