一、关于SELINUX
二、firewalld、iptables和netfilter之间的关系
三、netfilter5表5链介绍
四、iptables语法
五、iptables filter表案例
六、iptables nat表案例
一、关于SELINUX
1.1简介:
安全增强型 Linux(SecurityEnhancedLinux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。
1.2如何关闭SELinux
1.2.1临时关闭SELINUX的方式:
1.2.2关于SELINUX的运行状态
1.2.3永久关闭SELINUX:(关闭后不能远程登录)
永久关闭SELINUX需要修改SELINUX的配置文件/etc/selinux/config
修改方法1:
vim /etc/selinux/config #使用vim编辑器编辑/etc/selinux/config文件。
将文件中的SELINUX=enforcing修改为SELINUX=disabled后,保存退出。
修改方法2:执行下面这条命令:
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
检查修改结果:
# grep -i"selinux=disabled" /etc/selinux/config
SELINUX=disabled
grep能过滤出结果,表示修改正确。然后重启系统就能完全关闭SELINUX了。
# getenforce
Disabled
二、firewalld、iptables和netfilter之间的关系
2.1在centos6上,我们用的是iptables服务,而在centos7上,我们用的是firewalld服务。同样的,centos6上安装的是iptables包,而centos7上安装的是firewalld包。不管是centos6还是centos7,核心其实都是netfilter,netfilter是linux的一个内核模块,iptables命令是linux内核自带的。
centos6上的iptables服务和centos7上的firewalld服务,其实都是用来定义防火墙规则功能的防火墙管理工具。
它们都是将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能,所以其实在配置规则的思路上是完全一致的。
注:
netfilter才是防火墙;
firewalld和iptables是两种不同的防火墙管理工具,其底层都是iptables命令。
三者关系图:
2.2 iptables
2.2.1 CentOS7默认使用的时Firewalld工具,学些iptables前需要将Firewalld关闭并设置开机不启动
# systemctl disable firewalld #先禁止firewalld开机自启动
# systemctl stop firewalld #再关闭firewalld服务
2.2.2 CentOS7默认是没有安装iptables服务的。需要安装iptables服务才能使用iptables。
# yum install -y iptables-services
# systemctl enable iptables && systemctl start iptables #设置开机自启动iptables服务,并启动iptables服务
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
2.2.3 查看iptables服务是否正常开启。
# systemctl status iptables
三、netfilter5表5链介绍
3.1 5表
①filter表——三个链:INPUT、FORWARD、OUTPUT
②Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
③Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
④Raw表——两个链:OUTPUT、PREROUTING
⑤Security表——三个链:INPUT、OUTPUT和FORWARD
3.2 5链
netfilter的5个链:
3.3数据包的传输过程:
3.4 参考文章:http://www.cnblogs.com/metoy/p/4320813.html
四、iptables语法
4.1 iptables一般语法格式:
iptables的命令格式较为复杂,一般的格式如下:
iptables [-t table] 命令 [chain] [rules] [-j target]
格式说明:
4.2操作命令选项说明
4.2.1命令 说明
4.2.2规则选项说明
4.2.3动作选项说明
4.3 iptables常用操作示例:
4.3.1 查看iptables规则:
命令:iptables -nvL
选项说明:
n:数字输出。IP地址和端口会以数字的形式打印
v:详细输出。这个选项让list命令显示接口地址、规则选项等信息
L list:显示所选链的所有规则。如果没有选择链,则会显示所有链的所有规则
4.3.2 清空iptables规则:
命令:iptables -F
选项说明:
F:清空iptables的规则。
注:这里清空的只是当前内存中设置的iptables规则,不会清空已经保存的规则。
重启iptables服务即可恢复保存过的规则。
# systemctl restart iptables #重启iptables服务。
4.3.3 保存iptables规则:
命令:service iptables save
说明:执行这条命令会把当前iptables的所有规则保存到/etc/sysconfig/iptables文件中。
4.3.4 数据包计数器清零
命令:iptables -Z
选项说明:
-Z选项可以清空所有规则相关的数据包数量
4.3.5 追加一条规则:
##丢弃来自192.168.1.130的tcp协议数据包。可以使192.168.1.130这台主机ping不通这台服务器。
# iptables F //先清空iptables的规则。
# iptables -A INPUT -s 192.168.1.130 -p tcp -j DROP
# iptables -nvL INPUT //查看INPUT链的规则
验证:ping 主机IP
4.3.6 删除一条规则
方法1:
##删除刚才添加的那一条规则
#iptables -D INPUT -s 192.168.1.130 -p tcp -j DROP
# iptables -nvL INPUT
这样删除需要知道添加这一条规则的完整命令,非常不方便。
方法2:
第二种方法是通过规则编号来删除规则。
查看规则编号的选项是 --line-numbers
# iptables -A INPUT -s 192.168.239.130-p tcp -j DROP
# iptables -nvL INPUT --line-numbers
#第一列的 num便是规则编号了。
##下面通过规则编号删除规则就方便多了
# iptables -D INPUT 1 //D选项 跟上链名,和规则编号即可删除指定的规则
# iptables -nvL INPUT --line-numbers
4.3.7添加默认规则:
说明:默认规则就是除了可以匹配iptables规则的数据包以外的所有数据包都交给默认规则来处理。
例:#iptables -P INPUT DORP
五、iptables filter表案例
案例需求1:放行端口
只放行80、21、22三个端口的数据包,并且22端口只有指定的IP段才能通过。
这个案例我们可以编写一个shell脚本来实现。
vim /usr/local/sbin/iptables.sh ##编辑脚本文件
加入以下内容
#! /bin/bash //定义执行脚本的shell
IPT="/usr/sbin/iptables" //定义变量,iptables命令的绝对路径。
$IPT -F //清空iptables规则
$IPT -P INPUT DROP //默认规则,丢弃所有数据包。
$IPT -P OUTPUT ACCEPT //默认规则,放行所有OUTPUT链的数据包
$IPT -P FORWARD ACCEPT //默认规则,放行所有FORWARD链的数据包
##下面这条规则允许通过RELATED和ESTABLISHED状态的数据包,这条规则必加,否则
可能导致某些服务连不上。
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -s 10.1.1.0/24 -p tcp --dport 22 -j ACCEPT //仅允许10.1.1.0/24网段链接22端口
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT //允许通过所有80端口的数据包
$IPT -A INPUT -p tcp --dport 21 -j ACCEPT //允许通过所有21端口的数据包
# vi /usr/local/sbin/iptables.sh
# cat /usr/local/sbin/iptables.sh
执行这个脚本后查看添加的规则。
# bash /usr/local/sbin/iptables.sh
# iptables -nvL
案例需求2:禁ping
让本机可以ping通别的机器,但是别的机器ping不通本机。
#iptables -I INPUT -p icmp --icmp-type 8 -j DROP
#首先清空之前的规则,并且允许所有数据包通过INPUT链,必须一条命令执行,否则远程连接会断开
# iptables -F; iptables -P INPUT -j ACCEPT
#丢弃icmp包类型为8的数据包。icmp类型为8的数据包是icmp请求,类型为0的是应答包。
##添加这条规则后,可以本机可以ping通其他ip,但是其他机器ping不通本机了。
六、iptables nat表案例
6.1 A机器两块网卡ens33(192.168.133.130)、ens37(192.168.100.1),ens33可以上外网,ens37仅仅是内部网络,B机器只有ens37(192.168.100.100),和A机器ens37可以通信互联。
需求1:可以让B机器连接外网
A机器上打开路由转发 echo "1">/proc/sys/net/ipv4/ip_forward
A上执行 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
B上设置网关为192.168.100.1
6.2 需求2:C机器只能和A通信,让C机器可以直接连通B机器的22端口(端口映射)
A上打开路由转发echo "1">/ proc/sys/net/ipv4/ip_forward
A上执行iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
A上执行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
B上设置网关为192.168.100.1