一、firewalld和netfilter
Selinux是Redhat/CentOS系统特有的安全机制。不过因为这个东西限制太多,配置也特别繁琐所以几乎没有人去真正应用它。所以装完系统,我们一般都要把selinux关闭,以免引起不必要的麻烦。关闭selinux的方法为,使 “SELINUX=disabled”, 默认为 enforcing。
保存该配置文件后,重启机器方可生效,临时关闭selinux的命令为:setenforce 0
获得当前selinux的状态:getenforce
默认会输出 “enforcing” , 当使用 setenforce 0 这个命令后,再 getenforce 会输出 “permissive”。
[root@han01 ~]# systemctl disable firewalld^C
[root@han01 ~]# systemctl stop firewalld^C
[root@han01 ~]# yum install -y iptables-services
systemctl disable firewalld禁止firewalld服务开机启动
systemctl stop firewalld关闭firewalld服务
yum install -y iptables-services 安装iptables-services,这样就可以使用之前版本的iptables了。
[root@han01 ~]# systemctl enable iptables #让它开机启动
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@han01 ~]# systemctl start iptables #启动iptables服务
centos默认设置有iptables规则,这个规则很安全,但没什么用,先清楚规则,然后把清除后的规则保存一下。
iptables –nvL,-nvL选项表示查看规则,-F选项表示清除当前规则,但清除知识临时的,重启系统或者重启iptables服务后还会加载已经保存的规则,所以需要使用service iptables save保存一下规则。
[root@han01 ~]# systemctl start iptables
[root@han01 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
31 2072 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, 1560 bytes)
pkts bytes target prot opt in out source destination
[root@han01 ~]# iptables -F;service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]
[root@han01 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Wed Jun 13 04:13:22 2018
*filter
:INPUT ACCEPT [1:40]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:156]
COMMIT
# Completed on Wed Jun 13 04:13:22 2018
二、netfilter5表5链介绍
Netfilter/iptables 架构
Netfilter是表的容器,表是链的容器,而链又是规则的容器,主要是2个表5个链若干规则组成。
表(tables)提供特定的功能,iptables内置了5个表,即filter表、nat表、mangle表和raw表,security表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
1)filter表(主要用于过滤包)三个链:
处理入站信息包的规则被添加到INPUT链中
处理出站信息包的规则被添加到OUTPUT链中
处理正在转发信息包的规则被添加到FORWARD链中
2)Nat表(主要用于网络地址转换)三个链:
SNAT的信息包被添加到POSTROUTIN链
DNAT的信息包被添加到PREROUTING链
直接从本地出站的信息包被添加到OUTPUT链
3).Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4).Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理
数据包流向与netfilter的5个链
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外发出
POSTROUTING:发送到网卡接口之前
三、iptables语法
iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。
iptables规则配置文件:/etc/sysconfig/iptables
语法: iptables [options] [参数]
Options:
-n:不针对IP反解析主机名
-v:显示更详细的信息
-t:指定表(iptables命令默认作用于filter表)
-L:显示信息
-F:清空所有规则
-A/D:=add/delete,添加/删除一条规则
-I:插入一条规则
-p:指定协议,可以是tcp,udp或icmp
–sport:跟-p一起使用,指定源端口
–dport:跟-p一起使用,指定目标端口
-s:指定源IP(可以是一个IP段)
-d:指定目的IP(可以是一个IP段)
-j:后面跟动作(ACCEPT表示允许包;DROP表示丢掉包;REJECT表示拒绝包)
-i:指定网卡
-Z:把包以及流量计数器清零
-P:=pre,预设策略
查看规则以及清除规则
-t 后面跟表名,-nvL 即查看该表的规则,其中-n表示不针对IP反解析主机名;-L表示列出的意思;而-v表示列出的信息更加详细。如果不加-t ,则打印filter表的相关信息:
[root@han01 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 152 packets, 10363 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 81 packets, 8544 bytes)
pkts bytes target prot opt in out source destination
清除规则
该命令不会清除配置文件内的规则!当更改规则后需要执行命令‘service iptables save’将其保存到配置文件
[root@han01 ~]# iptables -F
增加/删除一条规则:
增加一条规则,当IP~192.168.188.1、协议为tcp、端口为‘1234’的向IP~192.168.188.128、端口为80的机器发送包时执行操作:drop(丢掉包)
[root@han01 ~]# iptables -A INPUT -s 192.168.179.1 -p tcp --sport 1234 -d 192.168.179.131 --dport 80 -j DROP
忘记规则内容
查看规则序号
[root@han01 ~]# iptables -nvL --line-numbers
执行删除命令
[root@han01 ~]# iptables -D INPUT 1
iptables -I INPUT -s 1.1.1.1 -j DROP表示:插入一条规则,把来自1.1.1.1的所有数据包丢掉。
iptables -D INPUT -s 1.1.1.1 -j DROP删除刚刚插入的规则。注意要删除一条规则时,必须和插入的规则一致,也就是说,两条iptables命令,除了-I 和-D不一样外,其他地方都一样。
iptables -I INPUT -s 2.2.2.2 -p tcp –dport 80 -j DROP
表示把来自2.2.2.2 并且是tcp协议到本机的80端口的数据包丢掉。–dport/–sport 必须要和-p选项一起使用,否则会出错。
iptables -I OUTPUT -p tcp –dport 22 -d 10.0.1.14 -j DROP这条规则表示,把发送到10.0.2.34的22端口的数据包丢掉。
iptables -D INPUT 1
-D 后跟链名,然后是规则num,这个num就是查看iptables规则时第一列的值。
iptables -A INPUT -s 192.168.1.0/24 -i ens33 -j ACCEPT
把来自192.168.1.0/24这个网段的并且作用在eth0上的包放行。
- iptables -P INPUT DROP-P
后面跟链名,策略内容或者为DROP或者为ACCEPT,默认是ACCEPT
如果正在连接远程服务器,不要随便敲这个命令,因为一旦回车就会断掉。
四、iptables filter表案例
需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.137.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。这个需求不算复杂,但是因为有多条规则,所以最好写成脚本的形式。脚本内容如下:
!/bin/bash
ipt=”/usr/sbin/iptables”
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
$ipt -A INPUT -s 192.168.179.0/24 -p tcp –dport 22 -j ACCEPT
$ipt -A INPUT -p tcp –dport 80 -j ACCEPT
$ipt -A INPUT -p tcp –dport 21 -j ACCEPT
完成脚本的编写后,直接运行 sh /bin/usr/local/sbin/iptables.sh 即可。如果想开机启动时初始化防火墙规则,则需要在 /etc/rc.d/rc.local 中添加一行 “sh /bin /usr/local/sbin/iptables.sh”
关于icmp的包有一个比较常见的应用:
iptables -I INPUT -p icmp –icmp-type 8 -j DROP
–icmp-type 这个选项是要跟-p icmp 一起使用的,后面指定类型编号。这个8指的是能在本机ping通其他机器,而其他机器不能ping通本机。
五、iptables nat表应用
A机器两块网卡ens33(192.168.179.1)、ens37(192.168.100.1),ens33可以上外网,ens37仅仅是内部网络,B机器只有ens37(192.168.100.100),和A机器ens37可以通信互联。
2.1让B机器连接外网
1)两台机器先进行网卡配置
虚拟机greg02做同样的设置。
启动虚拟机
ifconfig ens37 192.168.100.1/24
greg02:ifdown ens33
ifconfig ens37 192.168.100.100/24
gregory和greg02能相互ping通。
而对这两个ip地址Windows是ping不通的:
greg02也ping不通gregory的ens33,更不能上网。
2)Linux内核转发设置ip_forward参数
出于安全考虑,Linux系统默认是禁止数据包转发的。
所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。
配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能
cat /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许。
gregory上执行 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
greg02上设置网关为route add default gw 192.168.100.1
设置DNS:vi /etc/resolv.conf
ping通外网
需求2:C机器只能和gregory通信,让C机器可以直接连通greg02机器的22端口。端口映射。
gregory上打开路由转发echo “1”>/ proc/sys/net/ipv4/ip_forward
把nat之前的设置去掉
执行iptables -t nat -A PREROUTING -d 192.168.179.130 -p tcp –dport 1122 -j DNAT –to 192.168.100.100:22
gregory上执行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT –to 192.168.179.130
greg02上设置网关为192.168.100.1
接受并保存,证明连接上了
扩展:
扩展(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