Linux的安全设置,网络防火墙

下面介绍的是Linux的安全设置,网络防火墙(iptables、NAT、layer7、diff、patch、SELinux)

一、防火墙

1、防火墙基础

(1)、防火墙

防火墙,是一种隔离工具,工作于主机和网络边缘。对于经过防火墙的报文,根据预先安排好的规则进行检测,如果能够匹配,则按照特定规进行处理。

(2)、防火墙分类

防火墙分为两类,软件防火墙、硬件防火墙。软件防火墙有iptables、netfilter,硬件防火墙有PIX、ASA。

同时,防火墙还可以按类别分,分为主机防火墙、网络防火墙。

(3)、iptables

iptables,是专门为netfilter编写规则的用户空间工具,非交互式命令工具。

iptables,包括chain和table两部分,具体解释如下:

chain:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING。----------5类

table:、filter、nat(修改源地址、目的地址、端口号)、mangle(修改封装格式)、raw

table表的优先级:raw(高)、mangle、nat、filter

raw表包含链:PREROUTING,OUTPUT ----------直入直出

mangle表包含链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING ---------经过主机、路由

nat表包含链:PREROUTING,OUTPUT,POSTROUTING,INPUT ----------------经过主机

filter表包含链:INPUT,FORWARD,OUTPUT ----------经过路由

iptables数据报文的流向:

流入本机访问某进程:PREROUTING --> INPUT ------------------入主机

本机进程发送出去:PREROUTING --> OUTPUT --> POSTROUTING ----------出主机

经由本机转发:PREROUTING --> FORWARD --> POSTROUTING -----------经过路由

2、iptables命令 -------------对于报文,判断匹配条件(基本匹配、扩展匹配),然后进行处理动作(ACCEPT、DROP、REJECT)

格式(规则):iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]

targetname:----------------目标

ACCEPT -------------接受,允许

DROP -------------丢弃,拒绝

REJECT ------------弹回,拒绝

LOG -----------仅仅是开启内核对匹配的数据包做额外的日志记录

SNAT

DNAT

MASQUERADE

MARK

常用选项:

-t table:指定选择功能表,可以选择的有raw、mangle、nat、filter,默认的是filter表。

--set -----------------记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

# iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

--update ------------------是指每次建立连接都更新列表

--seconds -----------------必须与--rcheck或者--update同时使用,几秒

--hitcount ----------------必须与--rcheck或者--update同时使用,几次

# iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

COMMAND:---------------链的操作命令、规则的操作命令、查看规则的命令

-P -------------定义指定链的【默认策略】(ACCEPT、DROP)

-N ------------【新建】一条自定义的规则链

-X ------------【删除】被内建链【引用次数为0】的自定义链

-F ------------【清除】指定链上的【所有规则】

-E ------------【重命名】被内建链引用次数为0的自定义链

-----------------------------------------------------------

-A -----------------追加,在指定的链的尾部追加一条规则

-I [#] -------------插入,在指定的位置插入一条规则,省略了数字表示将规则插入到链的第一条

-D [#] -------------删除,删除指定的规则

-R -----------------替换,用指定的规则去替换目标链中的原有规则

-Z -----------------重置规则计数器,将指定表指定链上的规则的计数器置0

-----------------------------------------------------------

-L -------------列出指定表指定链上的所有规则

-n -------------规则数字化(主机名、端口号)

-v -------------详细显示

-x -------------精确的显示计数器的结果

--line-numbers --------------------显示规则链中的规则编号

基本匹配条件:

-s -------------源IP地址,是否匹配

-d -------------目标IP地址,是否匹配

-p -------------封装报文协议,是否匹配(tcp、udp、ip、icmp、arp)

-i -------------数据报文【入站】的接口,是否匹配

-o -------------数据报文【出站】的接口,是否匹配

例:

# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.1,172.16.72.101 -j ACCEPT

# iptables -P INPUT DROP

# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.101 -j ACCEPT

# iptables -I INPUT -s 172.16.0.1 -d 172.16.72.1 -p tcp --dport 22 -j ACCEPT

# iptables -I INPUT -s 172.16.0.0/16 -d 172.16.72.101 -p tcp --dport 80 -j ACCEPT

# iptables -I INPUT 2 -s 172.16.69.1 -p icmp --icmp-type 8 -j ACCEPT

# iptables -I INPUT 3 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT

扩展匹配条件(7种)----------multiport扩展、iprange扩展、string扩展、time扩展、connlimit扩展、limit扩展、state扩展

(1)、multiport扩展 ----------离散或连续的方式【定义多个端口】匹配条件

常用选项:

-m multiport --sports port

-m multiport --dports port

-m multiport --ports port

端口如:21,22,23,80,1000:2000

例:

# iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT

(2)、iprange扩展 --------------以【连续的IP地址范围】指明连续的多个地址的匹配条件

-m iprange --src-range from[-to]

-m iprange --dst-range from[-to]

地址范围如:172.16.50.1-172.16.72.254

例:

# iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT

(3)、string扩展 -------------对报文中的应用层数据做【字符串匹配】检测

-m string --algo {bm|kmp} --------------选择处理字符串的算法

-m string --string pattern -------------指明要检查匹配的字符串

例:

# iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP

(4)、time扩展 ---------------根据报文【到达的时间】与指定的【时间范围】进行匹配度检测

-m time --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

-m time --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

-m time --timestart hh:mm[:ss] --------------------timestart 09:00:00

-m time --timestop hh:mm[:ss] ----------------------timestop 17:00:00

-m time --monthdays day[,day...]

-m time --weekdays day[,day...] ----------------------weekdays Sat,Sun

例:

# iptables -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT

(5)、connlimit扩展 --------------根据每个客户端【IP并发连接数】的匹配

-m connlimit --connlimit-upto n ------------------连接数数量小于等于n,此时规则应设置为允许

-m connlimit --connlimit-above n ---------------连接数数量大于n,此时规则应设置为拒绝

例:

# iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

(6)、limit扩展 -------------------基于【收发报文的速率】进行匹配

-m limit --limit rate[/second|/minute|/hour|/day]

-m limit --limit-burst number

例:

# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT

(7)、state扩展 --------------状态检测(基于连接追踪机制)

格式:-m state --state *

INVALID --------------无效状态(无法识别的状态)

ESTABLISHED --------------连接态(已建立连接的状态)

NEW ------------------新连接态(尚未建立连接的状态)

RELATED ------------关联态(与其他已建立的连接相关联的状态)

UNTRACKED -----------未追踪的连接

/proc/net/nf_conntrack ----------------追踪到的【连接保存】的位置,追踪FTP协议的模块

/proc/sys/net/nf_conntrack_max -------------------能够被追踪到的【最大连接数】

/proc/sys/net/netfilter/*timeout -------------不同协议的连接追踪的【超时时间】

例:

# iptables -I INPUT -d 172.16.72.1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# iptables -I INPUT 2 -d 172.16.72.1 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT

# iptables -A INPUT -j DROP --------------------默认的规则或最后一条规则拒绝所有主机访问

# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -j DROP --------------------默认的规则或最后一条规则拒绝所有主机访问

3、网络防火墙 -------------------filter表FORWARD链规则设置、nat表相关链规则设置

(1)、FORWARD链配置如下:

例:

# iptables -A FORWARD -j DROP

# iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# iptables -I FORWARD 2 -d 192.168.100.2 -p tcp -m multiport --dports 21:23,80,3306 -m state --state NEW -j ACCEPT

# iptables -I FORWARD 3 -d 192.168.100.2 -p udp --dport 53 -m state --state NEW -j ACCEPT

# iptables -I FORWARD 4 -s 192.168.100.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

(2)、自定义链:

自定义链的配置如下:

例:

# iptables -N udp_match -----------------新建一条自定义链

# iptables -A udp_match -j RETURN

# iptables -I udp_match -d 192.168.100.2 -p udp --dport 53 -j ACCEPT

# iptables -I udp_match 2 -d 192.168.100.2 -p udp --dport 137 -j ACCEPT

# iptables -I udp_match 3 -d 192.168.100.2 -p udp --dport 138 -j ACCEPT

在主链上【引用】自定义链:

# iptables -I FORWARD 4 -p udp -j udp_match

更改自定义链的名称:-----------自定义链不能被引用

# iptables -E old_chain_name new_chain_name

例:

# iptables -E udp_match udp

删除自定义链:---------------引用计数为0的链、自定义链上必须为空

# iptables -X udp

4、NAT表 -------------SNAT、DNAT

NAT表功能(两个):网络地址转换(NAT)、端口映射(NAPT)

网络地址转换NAT(两类):SNAT(内访外,静态地址转换、地址伪装)、DNAT(外访内,地址转换、端口映射)

(1)、SNAT ----------内访外,静态地址转换、地址伪装

格式:--to-source [ipaddr[-ipaddr]][:port[-port]]

例:

# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.50

(2)、MASQUERADE ------------相当于替代

格式:--to-ports port[-port]

例:

# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j MASQUERADE

(3)、DNAT ---------------------外访内,地址转换、端口映射

格式:--to-destination [ipaddr[-ipaddr]][:port[-port]]

例:

# iptables -t nat -A PREROUTING -d 172.16.72.50 -j DNAT --to-destination 192.168.100.2

# iptables -t nat -A PREROUTING -d 172.16.72.50 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:8077

注意:使用iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077 做端口重定向的时候,主机上的真正的80端口不能被httpd监听,否则就会有错误。

(4)、REDIRECT -------------端口重定向

格式:--to-ports port[-port]

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077

(5)、LOG -------------------仅仅是开启内核对匹配的数据包做额外的日志记录

格式:

--log-level level

--log-prefix prefix

--log-ip-options

5、NAT表中,规则的保存和重载

(1)、CentOS 7保存和重载

/etc/sysconfig/iptables -------------------规则保存位置

# iptables-save > /PATH/TO/SOME_RULE_FILE

# iptables-restore < /PATH/FROM/SOME_RULE_FILE

(2)、CentOS 6保存和重载

/etc/sysconfig/iptables -----------------默认规则保存位置

# iptables-save > /PATH/TO/SOME_RULE_FILE

# iptables-restore < /PATH/FROM/SOME_RULE_FILE

# service iptables save

# service iptables restore|restart

二、layer7扩展模块 ----------------------应用层,iptables实现七层访问过滤

文本操作工具:diff、patch

1、diff命令 -----------比较两个文本文件的差异

格式:diff <变动前的文件> <变动后的文件>

diff的三种格式:正常格式、上下文格式、合并格式

(1)、正常格式的diff

# diff file1 file2 --------------------结果 3 部分

显示结果中,【第一行】是一个提示,用来说明变动位置。

第一行分为三个部分:

#  ------------表示file1的第 # 行有变化

c -------------表示变动的模式是【内容改变change】

a -------------代表增加addition

d -------------代表删除deletion

(2)、上下文格式的diff

常用选项:

-c ---------------context

# diff -c f1 f2 --------------结果 4 部分

显示结果中的四部分如下:

第一部分:-----------两行,显示两个文件的基本情况,*表变动前,-表变动后。

第二部分:-----------15个星号,将文件的基本情况与变动内容分割开。

第三部分:-----------显示变动【前】的文件,即file1。

第四部分:-----------显示变动【后】的文件,即file2。

注:文件内容的每一行最前面,还有一个标记位。

空 ------------表示该行无变化

! -------------表示该行有改动

- -------------表示该行被删除

+ -------------表示该行为新增

(3)、合并格式的diff -----------------将f1和f2的上下文合并在一起显示

常用选项:

-u -------------unified(合并)

# diff -u f1 f2 -----------------上下文各显示3行

显示结果中的三部分如下:

第一部分: -----------文件的基本信息,-表变动前的文件,+表变动后的文件。

第二部分: -----------【变动】的位置用【两个@】作为起首和结束。

第三部分: -----------变动的具体内容。

注:文件内容的每一行最前面,还有一个标记位。

空 ------------表示该行无变化

! -------------表示该行有改动

- -------------表示该行被删除

+ -------------表示该行为新增

2、patch命令 --------------------支持多种diff输出文件格式,可以忽略文件中的冗余信息

格式:patch [options] [originalfile] [patchfile]

常用选项:

-p --------------使用源文件名的【前缀目录】信息

-p0/-p 0 -------------使用全部的路径信息

-p1 ----------------忽略第一个"/"以前的目录,其余类似。

例:

/usr/src/linux-2.4.15/Makefile文件,提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。

3、实现layer7操作步骤,如下:-------------------9步

(1)、获取并编译内核

# useradd mockbuild

# rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm

# cd rpmbuild/SOURCES

# tar linux-2.6.32-*.tar.gz -C /usr/src

# cd /usr/src

# ln -sv

(2)、给内核打补丁

# tar xf netfilter-layer7-v2.23.tar.bz2

# cd /usr/src/linux

# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch

# cp /boot/config-*  .config

# make menuconfig

启用layer7模块步骤:

Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration

 “layer7” match support

(3)、编译并安装内核

# make

# make modules_install

# make install

(4)、重启系统,启用新内核

(5)、编译iptables

# tar xf iptables-1.4.20.tar.gz

# cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/

# cp /etc/rc.d/init.d/iptales /root

# cp /etc/sysconfig/iptables-config /root

# rpm -e iptables iptables-ipv6 --nodeps

# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux

# make && make install

# cp /root/iptables /etc/rc.d/init.d

# cp /root/iptables-config /etc/sysconfig

(6)、为layer7模块提供其所识别的协议的【特征码】

# tar zxvf l7-protocols-2009-05-28.tar.gz

# cd l7-protocols-2009-05-28

# make install

(7)、使用layer7模块

设置ACCT参数,装载nf_conntrack模块。

net.netfilter.nf_conntrack_acct = 1

l7-filter uses the standard iptables extension syntax

(8)、编译内核:

# make menuconfig

# make -j #

# make modules_install

# make install

(9)、清理内核源码树

4、抵御对22端口发起的DOS攻击 -------------解决方法

利用iptables的【recent模块】来抵御对22端口发起的DOS攻击,建立一个列表,保存有所有访问过指定的服务的客户端IP。

# iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

# iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

# iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

注:SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

# iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

知识点:

(1)、利用connlimit模块将单IP的并发设置为3。会误杀使用NAT上网的用户,可以根据实际情况增大该值。

(2)、利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制【五分钟】后即可恢复访问。

(3)、--set --name SSH -----------------------记录访问tcp 22端口的新连接,记录名称为SSH

--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

(4)、记录日志:

使用:

# iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

也可使用:

# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"

(5)、iptables的记录:/proc/net/xt_recent/SSH

三、SELinux

1、操作系统的【安全级别】:(4个)

1、D ---------最低

2、C:C1、C2

3、B:B1、B2、B3(B3最高)

4、A:A1、A2

2、selinxu【访问控制机制】:

DAC ---------------自主访问控制(针对用户设定)

MAC ---------------强制访问控制(不针对用户)

3、selinux的两种【工作级别】:strict、targeted(默认)

strict ------------------每个文件都受selinux严格管控

targeted ----------------部分文件受selinux管控(默认级别)

4、selinux的【工作模式】:enforcing、permissive、disabled

# setenforce 0 ------------permissive

# setenforce 1 ------------enforcing

# getenforce -----------查看工作级别

使工作模式永久生效:修改配置文件/etc/sysconfig/selinux

SELINUX=enforcing

5、文件的安全标签

(1)、安全标签的查看

# ls --context|-Z [file...] -------------文件的

# ps auxZ -------------进程的

(2)、chcon命令 ----------------更改文件安全标签

格式:chcon [options]... CONTEXT FILE...

常用选项:

-t type ---------类型

-R ------------递归修改文件

--reference=FILE --------------设置相同的安全上下文

适用:目标页面文件的类型与httpd进程的域不相符合时

(3)、restorecon命令 -------------还原安全上下文默认值

常用选项:

-R -----------递归还原文件

6、Linux布尔型规则:

(1)、getsebool命令

常用选项:

-a -------------显示所有已经生效的布尔型规则

(2)、setsebool命令

常用选项:

-P --------写入策略文件,使更改永久生效

例1:

ftp的匿名用户【上传功能】:

# setsebool -P ftpd_full_access=1

# setsebool -P ftpd_anon_write=1

例2:

samba用户访问自己的家目录:

# setsebool -P samba_enable_home_dirs=1

(3)、semanage命令

# semanage port -a -t http_port_t -p tcp 8077

注:需安装policycoreutils-python

本文转自little_ding 51CTO博客,原文链接:http://blog.51cto.com/12496428/1968161,如需转载请自行联系原作者

上一篇:Linux系统管理初步(四)系统防火墙控制程序iptables
下一篇:Centos7系列(四)防火墙永久区域与富规则