在谈完了基本的网络安全观念之后,这个章节主要就要针对『防火墙』来进行介绍了!目前的防火墙机制主要是以 Linux Kernel 2.4 版的 iptables 为主的,而 iptables 可以使用指令来下达,也可以透过编写 shell script 来进行指令的整合。鸟哥本人比较习惯使用 scripts 来进行 iptables 的机制规划呢!除了 iptables 之外,事实上,比较简单的还有 TCP Wrappers 这个玩意儿,他则主要是针对某些服务来进行管理的吶!本章的内容主要就是在介绍这两个重要的防火墙软件了! |
[root@test
root]# lsmod
# 若有发现 ipchains 的字样,表示系统不小心加载了 ipchains 了,请使用: [root@test root]# rmmod ipchains # 这样就能够移除 ipchains 了!然后加载 iptables 吧! [root@test root]# modprobe ip_tables |
[root@test
root]# iptables [-t tables] [-L] [-n]
参数说明: -t:后面接 iptables 的 table ,例如 nat 或 filter ,如果没有 -t table 的话,那么预设就是 -t filter 这个 table 喔! -L:列出目前的 table 的规则 -n:不进行 IP 与 HOSTNAME 的转换,屏幕显示讯息的速度会快很多! 范例: [root@test root]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 仔细看到上面,因为没有加上 -t 的参数,所以预设就是 filter 这个表格, # 在这个表格当中有三条链,分别是 INPUT, OUTPUT 与 FORWARD ,而且因为 # 没有规则,所以规则里面都是空的!同时注意一下,在每个 chain 的后面 () # 里面,会发现有 policy 对吧!那就是『预设动作(政策)』咯!以上面来看, # 虽然我们启动了 iptables ,但是我们没有设定规则,然后政策又是 ACCEPT, # 所以『任何封包都会接受』的意思喔! [root@test root]# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING
(policy ACCEPT)
Chain OUTPUT
(policy ACCEPT)
|
[root@test
root]# /sbin/iptables [-t tables] [-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 [root@test root]# /sbin/iptables -t nat -F # 请注意,如果在远程联机的时候,『这三个指令必须要用 scripts 来连续执行』, # 不然肯定『会让您自己被主机挡在门外!』 |
[root@test
root]# /sbin/iptables [-t tables] [-P] [INPUT,OUTPUT,FORWARD|
PREROUTING,OUTPUT,POSTROUTING] [ACCEPT,DROP]
参数说明: -P :定义政策( Policy )。注意,这个 P 为大写啊! INPUT :封包为输入主机的方向; OUTPUT :封包为输出主机的方向; FORWARD:封包为不进入主机而向外再传输出去的方向; PREROUTING :在进入路由之前进行的工作; OUTPUT :封包为输出主机的方向; POSTROUTING:在进入路由之后进行的工作。 范例: [root@test root]# /sbin/iptables -P INPUT DROP [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 # 除了 INPUT 之外,其它都给他设定为接受啰!在上面的设定之后, # 我们的主机发出的封包可以出去,但是任何封包都无法进入, # 包括回应给我们送出封包的响应封包(ACK)也无法进入喔! ^_^ |
[root@test
root]# iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD]
\
> [-io interface] [-p tcp,udp,icmp,all] [-s IP/network] [--sport ports] \ > [-d IP/network] [--dport ports] -j [ACCEPT,DROP] 参数说明: -A :新增加一条规则,该规则增加在最后面,例如原本已经有四条规则, 使用 -A 就可以加上第五条规则! -I :插入一条规则,如果没有设定规则顺序,预设是插入变成第一条规则, 例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 INPUT :规则设定为 filter table 的 INPUT 链 OUTPUT :规则设定为 filter table 的 OUTPUT 链 FORWARD:规则设定为 filter table 的 FORWARD 链 -i :设定『封包进入』的网络卡接口 -o :设定『封包流出』的网络卡接口 interface :网络卡接口,例如 ppp0, eth0, eth1.... -p :请注意,这是小写呦!封包的协定啦! tcp :封包为 TCP 协定的封包; upd :封包为 UDP 协定的封包; icmp:封包为 ICMP 协定、 all :表示为所有的封包! -s :来源封包的 IP 或者是 Network ( 网域 ); --sport:来源封包的 port 号码,也可以使用 port1:port2 如 21:23 同时通过 21,22,23 的意思 -d :目标主机的 IP 或者是 Network ( 网域 ); --dport:目标主机的 port 号码; -j :动作,可以接底下的动作; ACCEPT :接受该封包 DROP :丢弃封包 LOG :将该封包的信息记录下来 (预设记录到 /var/log/messages 档案) 范例: 范例一:所有的来自 lo 这个界面的封包,都予以接受 [root@test root]# iptables -A INPUT -i lo -j ACCEPT # 注意一下,因为 -d, --dport, -s, --sport 等等参数都没有设定,这表示: # 不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受! # 这个观念挺重要的,就是『没有设定的规定,则表示该规定完全接受』的意思! # 例如这个案例当中,关于 -s, -d...等等的参数没有规定时! 范例二:来自 192.168.0.1 这个 IP 的封包都予以接受: [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.1 -j ACCEPT # 新增一条规则,只要是来自于 192.168.0.1 的封包,不论他要去哪里, # 使用的是那个协议 (port) 主机都会予以接受的意思~ 范例三:来自 192.168.1.0 这个 C Class 的网域的任何一部计算机,就予以接受! [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -j ACCEPT # 这个是网域的写法喔!稍微注意一下的是,在范例二当中我们仅针对一个 IP , # 至于这个范例当中,则是针对整个网域来开放吶!而网域的写法可以是: # 192.168.1.0/24 也可以是 192.168.1.0/255.255.255.0 都能够接受喔! 范例四:来自 192.168.1.25 的封包都给他丢弃去! [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.25 -j DROP 范例五:只要是想进入本机的 port 21 的封包就给他丢弃 [root@test root]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP 范例六:来自 192.168.0.24 这个 IP 的封包,想要到我的 137,138,139 埠口时,都接受 [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.24 \ > --dport 137:139 -j ACCEPT 范例七:只要是接触到我主机的 port 25 就将该封包记录 (LOG) 下来 [root@test root]# iptables -A INPUT -p tcp --dport 25 -j LOG # 还是请特别注意到『规则的顺序排列』的问题喔! |
iptables 的其它相关参数说明:
[!] --syn :这个设定仅能用于 -p tcp 的规则中,因为 TCP 封包有 syn 的旗标存 在啊!当 TCP 封包存有 syn 旗标,表示这个联机是对方『主动』连过来的! 若于 --syn 之前加上 ! 表示该封包不带有 syn 的意思~(刚好相反之意!) 范例一:将来自 192.168.100.200 的主动联机封包丢弃: [root@test root]# iptables -A INPUT -p tcp -i eth0 -s 192.168.1.235 \ > --syn -j DROP --icmp-type:可以管制 ICMP 封包的某些类型!还记得我们在 网络基础 里面 谈到的 ICMP 的某些类型吧!对啦!如果您不想要让对方 ping 到您的机器, 就是利用这个项目啦! 范例二:别的主机 ping 我们主机时,我们主机不予以响应 [root@test root]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP # 当您下达这样的指令后,就表示未来别人对您使用 ping 的时候, # 我们的主机将不会响应,所以对方主机就会显示我们主机『无法连接』的状态! -m :表示封包的状态,状态有底下数种: -m mac --mac-source aa:bb:cc:dd:ee:ff 这个就是我们上面提到的可以控制『网络卡卡号, MAC』的设定方法啰! 那个 aa:bb:cc:dd:ee:ff 就是网络卡的 MAC ! -m state --state <状态> 有数种状态,状态有: INVALID:无效的封包,例如数据破损的封包状态 ESTABLISHED:已经联机成功的联机状态; NEW:想要新建立联机的封包状态; RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定, 因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定 封包的 INPUT 规则,该有关的封包还是可以进入我们主机喔! 可以简化相当多的设定规则啦! 范例三:让 bb:cc:dd:aa:ee:ff 网络卡无法使用我们主机的资源 [root@test root]# iptables -A INPUT -p all -m mac --mac-source \ > 01:01:01:01:02:01 -j DROP # 这种方式可以用来管制网络卡卡号喔!就不怕别人使用 IP 搞怪了! 范例四:让已经建立或者是与我们主机有关的响应封包通过,但是让不合法的, 以及想要尝试新建立的封包被抵挡在外! [root@test root]# iptables -A INPUT -p tcp -m state \ > --state ESTABLISHED,RELATED -j ACCEPT [root@test root]# iptables -A INPUT -p tcp -m state \ > --state INVALID,NEW -j DROP # 需要设定两条喔!至于封包状态则可以使用逗号隔开!逗号两边不要有空格 -j <动作>:除了比较常见的 ACCEPT 与 DROP 之外,还有哪些动作? REDIRECT --to-ports <port number> 这个也挺常见的,基本上,就是进行本机上面 port 的转换就是了! 不过,特别留意的是,这个动作仅能够在 nat table 的 PREROUTING 以及 OUTPUT 链上面实行而已喔!(关于联机流程,请参考图八) MASQUERADE:封包伪装 这个就是 NAT 主机最重要的一个机制啦!进行封包的伪装! 范例五:将要求与 80 联机的封包转递到 8080 这个 port [root@test root]# iptables -t nat -A PREROUTING -p tcp --dport 80 \ > -j REDIRECT --to-ports 8080 # 这玩意最容易在您使用了非正规的 port 来进行某些 well known 的协议, # 例如使用 8080 这个 port 来启动 WWW ,但是别人都以 port 80 来联机, # 所以,您就可以使用上面的方式来将对方对您主机的联机传递到 8080 啰! 范例六:进行封包的伪装,将来自 192.168.0.0/24 的封包的来源 IP 伪装成为 本机的 ppp0 那个界面的 IP [root@test root]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \ > -o ppp0 -j MASQUERADE |
[root@test
root]# iptables-save > filename
# 将目前的防火墙机制储存成 filename 那个档案!该档案为 ASCII 格式, # 您可以进入查阅一下喔! [root@test root]# iptables-restore < filename # 将 filename 那个防火墙档案 (注意!并不是 shell scripts 的格式) 的规则 # 读入目前的 Linux 主机环境中! |
[root@test
root]# mkdir -p /usr/local/virus/iptables
[root@test root]# cd /usr/local/virus/iptables [root@test iptables]# vi iptables.rule #!/bin/bash # # ======================================================== # 程序说明: # 欢迎使用 iptables.rule 这个 script 来建立您的防火墙! # 这支 script 还需要您的额外设定方可适合您的主机环境! # 基本规则定义为『拒绝所有,开放特定』的模式! # # 使用说明: # 请先将这个 scripts 的权限更改为可执行: # chmod 755 iptables.rule # 在将这个程序放置在 /usr/local/virus/iptables 目录下: # mkdir -p /usr/local/virus/iptables # mv /完整的路径/iptables.rule /usr/local/virus/iptables # 执行测试: # /usr/local/virus/iptables/iptables.rule # iptables -L -n (这个动作在检查防火墙规则) # 将底下这一行加入 /etc/rc.d/rc.local 当中 # /usr/local/virus/iptables/iptables.rule # 取消防火墙: # iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # # ======================================================== # 版权宣告: # 这支程序为 GPL 授权,任何人皆可使用, # 然,若使用本 scripts 发生问题时, # 本人不负任何责任 # VBird <vbird@tsai.adsldns.org> # ======================================================== # 历史纪录: # 2002/08/20 VBird 首次释出 # 2003/04/26 VBird 加入砍站软件的相关执行档案! # 2003/08/25 VBird 修改 INPUT 的 Policy 成为 DROP # ======================================================== # 0.0 Please
key in your parameters
# 底下这个 INIF
为对内的网络卡接口,
# 1.0 测试您的核心版本与防火墙模块
# 2.0 加载适当的模块
# 3.0 先清除所有的防火墙规则
# 4.0 先允许信任网域,这包含
lo 这个内部循环接口,
# 5.0 开始加载信任与拒绝的网域设定的档案,
# 6.0 底下这个档案若存在,则执行!请注意,
# 7.0 允许 ICMP
封包与允许已建立的联机通过!
# 8.0 Allow
services特别留意底下的服务,将您主机没有开放的服务关闭吧!
|
[root@test
iptables]# vi iptables.allow
#!/bin/bash # # This program is used to allow some IP or hosts to access your Server # # HISTORY # 2002/08/20 first release by VBird /sbin/iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT [root@test iptables]#
vi
iptables.deny
/sbin/iptables
-A INPUT -i $EXTIF -s 140.115.236.8 -j DROP
|
[root@test
/root]# vi /etc/rc.d/rc.local
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local #1. adsl connectting.
2002/04/06 VBird
|
上面的三个档案可以在底下的网站上取得下载:
http://linux.vbird.org/download/index.php#firewall_iptables
旧版的使用
tcpd 程序的语法
<服务名称> : <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.telnetd: 192.168.1.0/255.255.255.0 : allow in.telnetd: .ncku.edu.tw : allow in.ftpd: 127.0.0.1 : allow # 允许的 127.0.0.1 这个 IP 使用本机的 telnet 及 ftp 这两个服务! # 请特别注意,那个『服务名称』其实就是『程序文件名』喔! [root@test root]# vi /etc/hosts.deny in.telnetd: 192.168.2.3 : deny # 将来自 192.168.2.3 对于使用本机 telnet 的权限关掉! # 特别注意,这个语法在 xinetd 里面时,<action> 已经被拿掉了! # 所以,目前您可以使用这样的格式: [root@test root]# vi /etc/hosts.allow in.telnetd: 127.0.0.1 in.telnetd: 192.168.1.0/255.255.255.0 in.telnetd: .ncku.edu.tw # 事实上,这也是 TCP Wrappers 支持的格式,所以建议您直接使用此格式即可, # 亦即不需要加上 allow 或者是 deny 的动作,因为在 hosts.allow 里面的 # 规则就是 allow 而在 hosts.deny 里面的规则就是 deny 的意思! |
[root@test
root]# vi /etc/hosts.allow
# 先写关于 telnet, ftp 及 sshd 开放的资料 in.telnetd: 192.168.1.2, 192.168.1.10, 192.168.1.20 in.ftpd: 192.168.1.2, 192.168.1.10, 102.168.1.20 sshd: 192.168.1.0/255.255.255.0, xxx.yyy.zzz.qqq # 每个 IP 或者主机之间,可以利用逗号或空格来隔开! [root@test root]# vi /etc/hosts.deny # 将上面的三个服务都关掉啦! in.telnetd: ALL in.ftpd: ALL sshd: ALL # 特别注意,很多朋友喜欢在 /etc/hosts.deny 里面加入这一行: ALL: ALL # 来抵挡所有的服务与所有的来源!不过,我个人是不太建议这样做的! # 因为很多时候,当您架设好网站之后,却发现老是无法让 Client 联机成功, # 很多经验告诉我们,最大的问题就是出现在 ALL : ALL 这一行! |
[root@test
root]# vi /etc/hosts.deny
in.telnetd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \ /bin/echo; /usr/sbin/safe_finger @%h ) | \ /bin/mail -s "%d -%h security" root@localhost & \ : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". ) in.ftpd : ALL
: spawn (/bin/echo Security notice from host `/bin/hostname`; \
sshd : ALL :
spawn (/bin/echo Security notice from host `/bin/hostname`; \
|
虽然这样一来就稍微建置好了您的防火墙了!但是谁都不知道到底这样的防火墙效果如何?所以,您需要花费更多的时间来进行测试呢!测试的步骤可以是:一步一步作下来,看看问题出在哪里,然后多多的去改进、改良!!基本上,网络上目前很多的资料可以提供您不错的参考了!这一篇的设定写的是很简 单,大部分都还在介绍阶段而已!希望对大家有帮助!我在参考资料当中列出几个有用的防火墙网页,希望大家有空真的要多多的去看看!会很有帮助的!
- 先由主机向外面主动联机试看看;
- 再由私有网域内的 PC 向外面主动联机试看看;
- 最后,由 Internet 上面的主机,主动联机到您的 Linux 主机试看看;
我们来考虑一个比较有趣的问题,那就是如同图四的情况,事实上,主机是架设在防火墙后端的!在这样的情况下,我们要怎么将来自 Internet 的封包,经由 firewall 转递到后端的主机上面呢?!我们可以参考一下封包的流程,如同上面图九的说明,因为来自 Internet 的封包要丢给防火墙后端的主机,所以在『路由之前就需要先设定好转换路由』的状态了!因此在 nat table 的 PREROUTING 的链上面来进行所谓的『 Destination NAT, DNAT 』的动作才行啦!您需要在防火墙的 iptables 机制上面,在 nat table 上面新增一条规则才行!语法如下:
iptables 的其它相关参数说明:
-j <动作>:除了比较常见的 ACCEPT 与 DROP 之外,还有哪些动作?
DNAT --to IP[:port]
常用在防火墙后端的主机之封包转递上面!
范例:将来自 Internet 的 port 80 联机的封包转递到 192.168.10.10 这个主机上
[root@test root]# iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 \
> -j DNAT --to 192.168.10.10:80
上面的范例是很简单的一个例子,在比较简易的环境下是可以成功的帮您进行 WWW 或者是 Mail 的服务的!不过,如果用在 FTP 上面可就很麻烦了~因为 FTP 除了正规的 21 这个命令通道端口口外,还有数据传送的主动性与被动性!设定上很是困扰~有兴趣的话,可以参考底下列出的几个 iptables 的网站喔!这里不再说明了!