由于安装Linux系统的时候,选择了“无防火墙”这个选项,那么在/etc/sysconfig 下将没有iptables这个文件存在。还是让我们随心所欲的来定制防火墙访问策略吧。
在目录 /etc/rc.d 下创建脚本文件 myfirewall.sh,用命令 touch /etc/rc.d/myfirewall.sh并给文件执行权限 chmod 711 myfirewall。然后用 vi 编辑这个文件。
vi /etc/rc.d/myfirewall.sh
#Define string(定义变数)
IPT=/sbin/iptables
FW_IP="163.26.197.8"
 
#打开核心 forward 功能
作法如下∶
###-----------------------------------------------------###
echo "1" > /proc/sys/net/ipv4/ip_forward
 
#清除所有的规则
一开始要先清除先前所有的规则,重新开始,以免旧有的规则影响新的设定。作法如下∶
# 清除预设表 filter 中,所有规则链中的规则
$IPT -F [-t filter]
# 清除预设表 filter 中,使用者自订链中的规则
$IPT [-t filter] -X
 
 
# 清除mangle表中,所有规则链中的规则
$IPT -F  -t mangle
# 清除mangle表中,使用者自订链中的规则
$IPT -t mangle -X
 
 
# 清除nat表中,所有规则链中的规则
$IPT -F -t nat
# 清除nat表中,使用者自订链中的规则
$IPT -t nat -X
 
#Default policy(预设策略)

$IPT -P INPUT DROP

$IPT -P FORWARD DROP

$IPT -P OUTPUT ACCEPT
 
#Enable loopback

$IPT -A INPUT -i lo -p all -j ACCEPT
 
#Enable icmp

$IPT -A INPUT -p icmp –j ACCEPT
 
#Interface forward

$IPT -A FORWARD -s 192.168.1.0/24 -j ACCEPT

$IPT -A FORWARD -d 192.168.1.0/24 -j ACCEPT
 
 
IP 伪装
使内部网路的封包经过伪装之后,使用对外的 eth0 网卡当作代表号,对外连线。作法
如下∶
###-----------------------------------------------------###
# 启动内部对外转址
###-----------------------------------------------------###
$IPT -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
$IPT -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
###-----------------------------------------------------###
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 23 -j ACCEPT
$IPT -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
###-----------------------------------------------------###
# 以下是∶别人可以送信给你
$IPT -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP
--dport 25 -j ACCEPT
$IPT -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0
--dport 1024:65535 -j ACCEPT
# 以下是∶你可以送信给别人
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 25 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP
--dport 1024:65525 -j ACCEPT
 

开放对外离线下载信件的通道
开放内部网路可以对外部网路的 POP3 server 取信件。
作法如下∶(预设 policy 为 DROP)
###-----------------------------------------------------###
# open 对外部主机的 POP3 port 110
###-----------------------------------------------------###
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 110 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP
--dport 1024:65535 -j ACCEPT
 

开放观看网页的通道
开放内部网路可以观看外部网路的网站。
作法如下∶(预设 policy 为 DROP)
###-----------------------------------------------------###
# open 对外部主机的 HTTP port 80
###-----------------------------------------------------###
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 80 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP
--dport 1024:65535 -j ACCEPT
 

开放查询外部网路的 DNS 主机
开放内部网路,可以查询外部网路任何一台 DNS 主机。
作法如下∶(预设 policy 为 DROP)
###-----------------------------------------------------###
# open DNS port 53
###-----------------------------------------------------###
# 第一次会用 udp 封包来查询
$IPT -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0
--dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport
1024:65535 -j ACCEPT
# 若有错误,会改用 tcp 封包来查询
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP
--dport 1024:65535 -j ACCEPT
# 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 udp
$IPT -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j
ACCEPT
$IPT -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j
ACCEPT
# 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 tcp
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j
ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! -y -s any/0 --sport 53 -d $FW_IP --dport
53 -j ACCEPT
 

开放内部主机可以 ssh 至外部的主机
开放内部网路,可以 ssh 至外部主机。
作法如下∶(预设 policy 为 DROP)
###-----------------------------------------------------###
# open 外部主机 ssh port 22
###-----------------------------------------------------###
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 22 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP
--dport 1024:65535 -j ACCEPT
# 以下是 ssh protocol 比较不同的地方
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1020:1023 -d any/0
--dport 22 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP
--dport 1020:1023 -j ACCEPT
 

开放内部主机可以 ftp 至外部的主机
开放内部网路,可以 ftp 至外部主机。
作法如下∶(预设 policy 为 DROP)
###-----------------------------------------------------###
# open 对外部主机 ftp port 21
###-----------------------------------------------------###
# 以下是打开命令 channel 21
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 21 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP
--dport 1024:65535 -j ACCEPT
# 以下是打开资料 channel 20
$IPT -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport
1024:65535 -j ACCEPT
$IPT -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d
any/0 --dport 20 -j ACCEPT
# 以下是打开 passive mode FTP 资料通道
$IPT -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0
--dport 1024:65535 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d
$FW_IP --dport 1024:65535 -j ACCEPT
开放 ping
可以对外 ping 任何一台主机。
作法如下∶(预设 policy 为 DROP)
$IPT -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT
$IPT -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT
我写的这个规则只开放了较少的允许访问的策略(可以ping ,收发邮件,浏览网页,ssh,https,telnet,ftp,其它的访问则全部丢弃)。$IPT –A OUTPUT ACCEPT 没有设置成DROP的原因是由于大部分网络服务所使用的协议是tcp协议,众所周知,tcp协议是面向连接的,如果设置 $IPT –A OUTPUT DROP, 那么任何协议为tcp的连接就要写两条了。况且防火墙对外的访问总是允许的,因此这样做是为了简化规则。
修改完成后保存,然后在当前目录运行命令 ./myfirewall.sh,在上述脚本没有书写错误的情况下,规则生效,但它仅仅在内存里,用命令 service iptables save 将自动生成文件 /etc/sysconfig/iptables,前面设定的访问策略就被保存到硬盘,系统重启时,系统将自动地从文件 /etc/sysconfig/iptables 获得定制的访问策略。
到这里,一个透明的linux 防火墙就架设好了。更改计算机的BIOS设置,使它可以在没有键盘的情况下启动系统。启用ftp,以便可以在需要时可以向防火墙主机拷贝文件。把键盘和显示器拿掉,剩下的操作只是摁一下电源开关。
防火墙的管理
可能有时候我们需要更改防火墙的某些规则,或者做些别的管理,既然我们是系统管理员,再插上键盘和接上显示器坐在防火墙面前可能会被人耻笑,因此这些管理工作当然通过网络来进行。Ssh和webmin是我的偏好,ssh的协议端口是22,webmin的默认协议端口是10000。其中ssh是 linux系统的默认服务 ,只要安装客户端就可以(windows下的程序securecrt 是个不错的选择,据说ssh连接速度没有vnc 快)对防火墙进行所有的管理(和直接操作防火墙主机一样);webmin是基于web的图形界面管理方式,非常的方便和直观,尽管它不能象ssh那样对系统进行完全的管理,但是对于我们的工作需求还是可以满足,建议在防火墙系统安装webmin服务器程序。Ssh与webmin两者结合使用,可以帮助我们较快较深入地掌握Linux。
Ssh客户端安装较为简单,而webmin不需要安装客户端。这里介绍webmin 服务器的安装:把webmin-1.110. tar.gz 下载到另外一台windows的硬盘里,然后用ftp把它复制到防火墙主机的ftp目录(如果你是linux高手,并不需要如此,只须以ssh方式登录防火墙,用get/wget指令取得该文件),解开文件webmin-1.110.tar.gz tar –zxvf webmin-1.110.gz.tzr cd webmin-1.110 安装webmin ./setup.sh ,一路回车,创建一个webmin管理账户,安装完毕;在任何一台运行浏览器的地址栏输入防火墙的ip加上端口号10000就可以管理防火墙(http: //192.168.1.254:10000)。
以这种方式管理linux 网络的防火墙十分直观,并且选项十分详尽,就算不懂iptable语法的人也能容易的配置防火墙的访问规则。这里有一个技巧,假如你更改了某条访问规则导致网络不能向外访问,不要慌,到防火墙跟前重启一下系统即可。万一更改规则发生不测并且规则已经写入硬盘,那么请你直接删除文件 /etc/sysconfig/iptables,然后再运行脚本 sh /etc/rc.d/myfirewall 再次重写文件/etc/sysconfig/iptables service iptables save 。有的系统管理员倾向于直接编辑/etc/sysconfig/iptables 文件,但是这需要更多的耐心和勇气。如果你是新手,建议你跟我一样,先写脚本,再生成iptables。
特别关注:
最好把除路由器而外的整个网络放在防火墙的保护之中。如果象下图那样有同一
网段的主机放在防火墙的前面,将导致严重的网络故障。实践表明,这台windows主机的ip地址丢失了(网络属性的ip值还在,但用命令 ipconfig /all 则是 0.0.0.0),重启windows后提示ip地址冲突,更换同一网段内的任何一个未用的ip地址还是提示冲突。搞的我的两台邮件服务器和两台web服务器停火,我还以为是中了邪门的病毒,直到后来我把tcp/ip协议卸载再安装才解决问题。经分析,是防火墙的路由导致这样的故障。强烈建议把所有的主机放在防火墙的保护之下,以减少网络的复杂程度。另外,我们应该养成这样一种习惯—在系统正常的情况下,如果更改了配置,请一定要用笔记录所作的更改,以便在改出问题时我们能够快速准确的恢复,这种习惯更可运用到所有的IT管理工作,它是我的不传之密。
附:区分eth0与eth1的小技巧。把防火墙的一块网卡跟交换机相连,另外一块不做任何连接,即另外一块网卡的网络连接是断开的;使用命令 ifconfig eth0 down 关闭网络接口eth0;用网络中的另一台计算机 ping 192.168.1.254 ,如果ping 通了则表明连接交换机的网络接口为eth1,另一块为eth0,还可以把网线交换一下另一网络接口,确认判断的正确性。