我们知道网上的访问通过tcp/ip封包来进入主机系统的。在linux中它一般要同过ip过滤机制来实现第一层防护,如果通过了这层防护还的通过下一关的检查 那就是TCP_Wrappers 的功能。
封包过滤( IP Filter ):
封 包过滤是 linux 提供的第一道防火墙呦!但是不同的核心版本会有不一样的封包过滤机制!以 2.2.xx 为核心的 Linux 主要以 ipchains 作为过滤机制,至于目前新版的 2.4.xx 则以 iptables 为机制!OK!既然我们的 Red Hat 7.1, 7.2, 7.3 为 kernel 2.4.xx ,所以用 iptables 来进行 IP 抵挡的工作啦!那么由于 TCP 封包里头有 IP 及 port ,所以要抵挡来源 IP 或者是自身的 port ,自然就很容易来进行啦!您目前只要知道 iptables 可以经由 TCP 的封包表投资料来进行分析的工作例如:和附规则的就通过,否则就把它丢弃 这样就防止不符合规则的人进入你的电脑。
至于抵挡封包的工作则可以让 TCP_Wrappers 来进行
要常常去看 /var/log/messages 与 /var/log/secure 这两个个档案!都是登陆登录记录等。
要做好主机的防护,第一步就是要建立完善的密码规则啦!因为这个咚咚常常是 cracker 尝试入侵的第一步!你必须要建立好主机的密码规则,可以尝试以 chattr 来将 /etc/passwd 及 /etc/shadow 做成不可变更的档案!较为安全啦!
做好安全的几个常见的工作
1.升级与修补套件漏洞、及移除危险套件:
2.每项系统服务的安全设定项目
3.TCP_Wrappers 的基础防火设定
4.iptables 的防火规则设定
5.主机资源侦测系统( MRTG )
6.登录档案分析系统:
iptables:
iptables 是 linux Kernel 2.4.xx 版本以上的主要 IP 过滤机制!他最大的功能就是可以过滤掉不要的 TCP 封包啦!当然功能还不止于此,他还可以用来进行 IP 伪装,以达成 NAT 的主机功能呢! iptables 的工作方向,必须要依规则的顺序来分析,底下我们简单的谈一谈 iptables 的几个概念吧:
有几个 tables :
跟之前 版本的 ipchains 不同的地方是, iptables 可以自行定义一些 tables 的新规定!将可以让防火墙规则变的更为便于管理呢!基本上,原本的 iptable 至少有两个 table ,一个是 filter ( 预设的,没有填写 tables 时,就是 filter 这个 table 啦 ),一个则是相当重要的 nat table 。其中, filter 可以用来管理主机的安全,至于 nat 则是用来处理 NAT 的功能啦!
清除规则:
iptables 的订定方法其实很简单,就是使用指令列的方式来订定而已,他的基础语法在清除规则时,是这样的:
[root @test /root]# /sbin/iptables [-FXZ]
参数说明:
-F :清除所有的已订定的规则;
-X :杀掉所有使用者建立的 chain (应该说的是 tables )��;
-Z :将所有的 chain 的计数与流量统计都归零
范例:
[root @test /root]# /sbin/iptables -F
[root @test /root]# /sbin/iptables -X
[root @test /root]# /sbin/iptables -Z
请注意,如果在远程联机的时候,『这三个指令必须要用 scripts 来连续执行』,不然肯定『会让你自己被主机挡在门外!』
定义政策( Policy ):
清 除规则之后,再接下来就是要设定规则的政策啦!这个所谓的政策指的是『当你的封包不在你的规则之内时,则该封包的通过与否,以 Policy 的设定为准』,例如:你设定了十条规则,但有一个封包来的时候,这十条规则都不适用,这个时候此一封包就会依据 Policy 的规定为准,来决定是否可以通过防火墙��。通常这个政策在 INPUT 方面可以定义的比较严格一点,而 FORWARD 与 OUTPUT 则可以订定的松一些!
[root @test /root]# /sbin/iptables [-t tables] [-P] [INPUT,OUTPUT,FORWARD| PREROUTING,OUTPUT,POSTROUTING] [ACCEPT,DROP]
参数说明:
-t :定义 table !
tables :table 的名称,例如 nat ��!
-P :定义政策( Policy )。
INPUT :封包为输入主机的方向;
OUTPUT :封包为输出主机的方向;
FORWARD:封包为不进入主机而向外再传输出去的方向;
PREROUTING :在进入路由之前进行的工作;
OUTPUT :封包为输出主机的方向;
POSTROUTING:在进入路由之后进行的工作。
范例:
[root @test /root]# /sbin/iptables -P INPUT ACCEPT
[root @test /root]# /sbin/iptables -P OUTPUT ACCEPT
[root @test /root]# /sbin/iptables -P FORWARD ACCEPT
[root @test /root]# /sbin/iptables -t nat -P PREROUTING ACCEPT
[root @test /root]# /sbin/iptables -t nat -P OUTPUT ACCEPT
[root @test /root]# /sbin/iptables -t nat -P POSTROUTING ACCEPT
将预设的政策都定义为接受��!
增加、插入规则:
接下来则要定义规则啦!我们底下先完全以主机的角度来观察!可以这样来设定啦!
[root @test /root]# /sbin/iptables [-AI] [INPUT,OUTPUT,FORWARD] [-io interface] [-p TCP,UDP] [-s IP/network] [--sport ports] [-d IP/network] [--dport ports] -j [ACCEPT,DROP]
参数说明:
-A :新增加一条规则,该规则增加在最后面一行;
-I :在第一条规则加入;
INPUT :封包为输入主机的方向;
OUTPUT :封包为输出主机的方向;
FORWARD:封包为不进入主机而向外再传输出去的方向;
-i :流入的网卡接口
-o :流出的网卡接口
interface :网络卡接口,例如 ppp0, eth0, eth1....
-p :请注意,这是小写呦!封包的协议啦!
TCP :封包为 TCP 协议的封包;
UDP :封包为 UDP 协议的封包;
-s :来源封包的 IP 或者是 Network ( 网域 );
--sport:来源封包的 port 号码;
-d :目标主机的 IP 或者是 Network ( 网域 );
--dport:目标主机的 port 号码;
-j :动作,可以接底下的动作;
ACCEPT :接受该封包
DROP :丢弃封包
范例:
[root @test /root]# /sbin/iptables -A INPUT -i lo -j ACCEPT
所有的来自 lo 这个接口的封包,都予以接受
[root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.0.1 -j ACCEPT
来自 192.168.0.1 这个 IP 的封包都予以接受
[root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.1.0/24 -j ACCEPT
来自 192.168.1.0 这个 C Class 的网域的任何一部计算机,就予以接受!
[root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.1.25 -j DROP
来自 192.168.1.25 的 IP 的封包,就直接全部给他丢弃!
[root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP --dport 21 -j DROP
只要想要进来 21 这个 port 的封包,就把他丢弃!
[root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.0.24 --dport 22 -j ACCEPT
来自 192.168.0.24 的主机,想要到我的 port 22 时,就予以接受!
请注意:防火墙的规则是『一行一行依序来检查的,若符合任何一条规则,则予以动作(接受或丢弃),否则继续往下检查到最后一条』上
TCP_Wrappers:
这 个 TCP_Wrappers 实在是很简单的一个设定工作,因为他只要设定 /etc/hosts.allow 及 /etc/hosts.deny 就可以啦!基本上,他是经由 /usr/sbin/tcpd 这个程序来进行 TCP 的检验工作!而检验的方式则是以 /etc/hosts.allow 及 /etc/hosts.deny 来设定的啦!检验的流程是先以 /etc/hosts.allow 这个档案,检验完之后,在到 /etc/hosts.deny 去搜寻!好了,那么 hosts.allow 要怎样设定呢?
<服务名称> : <IP/network> : <action>
特别注意, network 可以使用 192.168.0.0/255.255.255.0 ,但不可使用 192.168.0.0/24 !
[root @test /root]# vi /etc/hosts.allow
in.telnetd: 127.0.0.1 : allow
in.ftpd: 127.0.0.1 : allow
本机的 127.0.0.1 开放 telnet 及 ftp 哩!
[root @test /root]# vi /etc/hosts.deny
in.telnetd: 192.168.2.3 : deny
将 192.168.2.3 的 telnet 服务关掉!
ipchains 和 iptables 在语法上的主要的差异,注意如下∶
1. 在 ipchains 中,诸如 input 链,是使用小写的 chains 名,在 iptables 中,要改用大写 INPUT。
2. 在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设是作用在 filter 这个表。
3. 在 ipchains 中, -i 是指介面(interface),但在 iptables 中,-i 则是指进入的方向,且多了 -o,代表出去的方向。
4. 在 iptables 中,来源 port 要使用关键字 --sport 或 --source-port
5. 在 iptables 中,目的 port 要使用关键字 --dport 或 --destination-port
6. 在 iptables 中,"丢弃" 的处置动作,不再使用 DENY 这个 target,改用 DROP。
7. 在 ipchains 的记录档功能 -l,已改为目标 -j LOG,并可指定记录档的标题。
8. 在 ipchains 中的旗标 -y,在 iptables 中可用 --syn 或 --tcp-flag SYN,ACK,FIN SYN
9. 在 iptables 中,imcp messages 型态,要加上关键字 --icmp-type,如∶
iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT
iptables 使用时的样板
在设定 iptables 的封包过滤规则时,有几个样板的动作,若先熟に�们,往后就可自行套用,依此类推,很快地,您就可以进入这个天地之中�?/P>
观察目前的设定
作法如下∶
iptables -L -n
iptablse -t nat -L -n
定义变数
FW_IP="163.26.197.8"
打开核心 forward 功能
作法如下∶
###-----------------------------------------------------###
# 打开 forward 功能
###-----------------------------------------------------###
echo "1" > /proc/sys/net/ipv4/ip_forward
清除所有的规则
一开始要先清除所有的规则,重新开始,以免旧有的规则影响新的设定。作法如下∶
###-----------------------------------------------------###
# 清除先前的设定
###-----------------------------------------------------###
# 清除预设表 filter 中,所有规则链中的规则
iptables -F
# 清除预设表 filter 中,使用者自订链中的规则
iptables -X
# 清除mangle表中,所有规则链中的规则
iptables -F -t mangle
# 清除mangle表中,使用者自订链中的规则
iptables -t mangle -X
# 清除nat表中,所有规则链中的规则
iptables -F -t nat
# 清除nat表中,使用者自订链中的规则
iptables -t nat -X
选定预设的政策
接着,要选定各个不同的规则链,预设的政策为何。作法如下∶
预设全部丢弃∶
###-----------------------------------------------------###
# 设定 filter table 的预设政策
###-----------------------------------------------------###
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
或者预设全部接受∶
###-----------------------------------------------------###
# 设定 filter table 的预设政策
###-----------------------------------------------------###
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
各个规则链的预设政策可独立自主的设定,不必受其它链的影响。
以下练习,若目标为 DROP,则 policy 请设为 ACCEPT;若目标为 ACCEPT,则 policy 请设为 DROP,如此方可看出效果。
开放某一个介面
作法如下∶
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
注∶IPFW 或 Netfilter 的封包流向,local process 不会经过 FORWARD Chain,
因此 lo 只在 INPUT 及 OUTPUT 二个 chain 作用。
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
IP 伪装
使内部网路的封包经过伪装之后,使用对外的 eth0 网卡当作代表号,对外连线。作法如下∶
###-----------------------------------------------------###
# 启动内部对外转址
###-----------------------------------------------------###
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source $FW_IP
上述指令意指∶把 172.16.0.0/16 这个网段,伪装成 $FW_IP 出去。
虚拟主机
利用转址、转 port 的方式,使外部网路的封包,可以到达内部网路中的伺服主机,俗称虚拟主机。这种方式可保护伺服主机大部份的 port 不被外界存取,只开放公开服务的通道(如 Web Server port 80),因此安全性甚高。
作法如下∶
###-----------------------------------------------------###
# 启动外部对内部转址
###-----------------------------------------------------###
# 凡对 $FW_IP:80 连线者, 则转址至 172.16.255.2:80
iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.255.2:80
开放内部主机可以 telnet 至外部的主机
开放内部网路,可以 telnet 至外部主机。
作法如下∶(预设 policy 为 DROP)
###-----------------------------------------------------###
# open 外部主机 telnet port 23
###-----------------------------------------------------###
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT
开放邮包转递通道
开放任意的邮件主机送信包给你的 Mail Server,而你的 Mail Server 也可以送信包过去。
作法如下∶(预设 policy 为 DROP)
###-----------------------------------------------------###
# open SMTP port 25
###-----------------------------------------------------###
# 以下是∶别人可以送信给你
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT
# 以下是∶你可以送信给别人
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT