## 9.4 单机防火墙的一个实例
介绍了这么多的防火墙语法与相关的注意事项后,终于要来架设防火墙了。鸟哥还是比较偏好使用脚本来撰写防火墙, 然后透过最终的 /etc/init.d/iptables save 来将结果储存到 /etc/sysconfig/iptables 去! 而且此一特色还可以用在呼叫其他的 scripts ,可以让防火墙规则具有较为灵活的使用方式。 好了,那就来谈谈如何设定咱们的防火墙规则吧!
* * *
### 9.4.1 规则草拟
鸟哥底下介绍的这个防火墙,其实可以用来作为路由器上的防火墙,也可以用来作为本机的防火墙。 假设硬件联机如同下图所示, Linux 主机本身也是内部 LAN 的路由器!亦即是一个简单的 IP 分享器的功能啦!依据第三章的[图 3.2-1](http://linux.vbird.org/linux_server/0120intranet.php#fig3.2-1) 假设鸟哥网络接口有底下这些:
* 外部网络使用 eth0 (如果是拨接,有可能是 ppp0,请针对你的环境来设定);
* 内部网络使用 eth1 ,且内部使用 192.168.100.0/24 这个 Class ;
* 主机默认开放的服务有 WWW, SSH, https 等等;
![](https://box.kancloud.cn/2016-05-13_5735da52646d7.gif)
图 9.4-1、一个局域网络的路由器架构示意图
由于希望将信任网域 (LAN) 与不信任网域 (Internet) 整个分开的完整一点, 所以希望你可以在 Linux 上面安装两块以上的实体网卡,将两块网卡接在不同的网域,这样可以避免很多问题。 至于最重要的防火墙政策是:『关闭所有的联机,仅开放特定的服务』模式。 而且假设内部使用者已经受过良好的训练,因此在 filter table 的三条链个预设政策是:
* INPUT 为 DROP
* OUTPUT 及 FORWARD 为 ACCEPT
鸟哥底下预计提供的防火墙流程是这样的:
![](https://box.kancloud.cn/2016-05-13_5735da5279ae3.png)
图 9.4-2、本机的防火墙规则流程示意图
原则上,内部 LAN 主机与主机本身的开放度很高,因为 Output 与 Forward 是完全开放不理的!对于小家庭的主机是可以接受的,因为我们内部的计算机数量不多,而且人员都是熟悉的, 所以不需要特别加以控管!但是:『在大企业的内部,这样的规划是很不合格的, 因为你不能保证内部所有的人都可以按照你的规定来使用 Network !』也就是说『家贼难防』呀! 因此,那样的环境连 Output 与 Forward 都需要特别加以管理才行!
* * *
### 9.4.2 实际设定
事实上,我们在设定防火墙的时候,不太可能会一个一个指令的输入,通常是利用 shell scripts 来帮我们达成这样的功能吶!底下是利用上面的流程图所规划出来的防火墙脚本,你可以参考看看, 但是你需要将环境修改成适合你自己的环境才行喔!此外,为了未来修改维护的方便,鸟哥将整个 script 拆成三部分,分别是:
* iptables.rule:设定最基本的规则,包括清除防火墙规则、加载模块、设定服务可接受等;
* iptables.deny:设定抵挡某些恶意主机的进入;
* iptables.allow:设定允许某些自定义的后门来源主机!
鸟哥个人习惯是将这个脚本放置到 /usr/local/virus/iptables 目录下,你也可以自行放置到自己习惯的位置去。 那底下就来瞧瞧这支脚本是怎么写的吧!
```
[root@www ~]# mkdir -p /usr/local/virus/iptables
[root@www ~]# cd /usr/local/virus/iptables
[root@www iptables]# vim iptables.rule
#!/bin/bash
# 请先输入您的相关参数,不要输入错误了!
EXTIF="eth0" # 这个是可以连上 Public IP 的网络接口
INIF="eth1" # 内部 LAN 的连接接口;若无则写成 INIF=""
INNET="192.168.100.0/24" # 若无内部网域接口,请填写成 INNET=""
export EXTIF INIF INNET
# 第一部份,针对本机的防火墙设定!##########################################
# 1\. 先设定好核心的网络功能:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,\
send_redirects}; do
echo "0" > $i
done
# 2\. 清除规则、设定默认政策及开放 lo 与相关的设定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 3\. 启动额外的防火墙 script 模块
if [ -f /usr/local/virus/iptables/iptables.deny ]; then
sh /usr/local/virus/iptables/iptables.deny
fi
if [ -f /usr/local/virus/iptables/iptables.allow ]; then
sh /usr/local/virus/iptables/iptables.allow
fi
if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
sh /usr/local/virus/httpd-err/iptables.http
fi
# 4\. 允许某些类型的 ICMP 封包进入
AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done
# 5\. 允许某些服务的进入,请依照你自己的环境开启
# iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # FTP
# iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS
# 第二部份,针对后端主机的防火墙设定!###############################
# 1\. 先加载一些有用的模块
modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack
ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
if [ "$testmod" == "" ]; then
modprobe $mod
fi
done
# 2\. 清除 NAT table 的规则吧!
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
# 3\. 若有内部接口的存在 (双网卡) 开放成为路由器,且为 IP 分享器!
if [ "$INIF" != "" ]; then
iptables -A INPUT -i $INIF -j ACCEPT
echo "1" > /proc/sys/net/ipv4/ip_forward
if [ "$INNET" != "" ]; then
for innet in $INNET
do
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
done
fi
fi
# 如果你的 MSN 一直无法联机,或者是某些网站 OK 某些网站不 OK,
# 可能是 MTU 的问题,那你可以将底下这一行给他取消批注来启动 MTU 限制范围
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss \
# --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
# 4\. NAT 服务器后端的 LAN 内对外之服务器设定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 \
# -j DNAT --to-destination 192.168.1.210:80 # WWW
# 5\. 特殊的功能,包括 Windows 远程桌面所产生的规则,假设桌面主机为 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000 \
# -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389 \
# -j DNAT --to-destination 192.168.100.20
# 6\. 最终将这些功能储存下来吧!
/etc/init.d/iptables save
```
特别留意上面程序代码的特殊字体部分,基本上,你只要修改一下最上方的接口部分, 应该就能够运作这个防火墙了。不过因为每个人的环境都不相同, 因此你在设定完成后,依旧需要测试一下才行喔!不然,出了问题不要怪我啊!.... 再来看一下关于 iptables.allow 的内容是如何?假如我要让一个 140.116.44.0/24 这个网域的所有主机来源可以进入我的主机的话,那么这个档案的内容可以写成这样:
```
[root@www iptables]# vim iptables.allow
#!/bin/bash
# 底下则填写你允许进入本机的其他网域或主机啊!
iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT
# 底下则是关于抵挡的档案设定法!
[root@www iptables]# vim iptables.deny
#!/bin/bash
# 底下填写的是『你要抵挡的那个咚咚!』
iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP
[root@www iptables]# chmod 700 iptables.*
```
将这三个档案的权限设定为 700 且只属于 root 的权限后,就能够直接执行 iptables.rule 啰! 不过要注意的是,在上面的案例当中,鸟哥预设将所有的服务的通道都是关闭的! 所以你必须要到[本机防火墙的第 5 步骤](#script_daemon)处将一些批注符号 (#) 解开才行。 同样的,如果有其他更多的 port 想要开启时,一样需要增加额外的规则才行喔!
不过,还是如同前面我们所说的,这个 firewall 仅能提供基本的安全防护,其他的相关问题还需要再测试测试呢! 此外,如果你希望一开机就自动执行这个 script 的话,请将这个档案的完整档名写入 /etc/rc.d/rc.local 当中,有点像底下这样:
```
[root@www ~]# vim /etc/rc.d/rc.local
....(其他省略)....
# 1\. Firewall
/usr/local/virus/iptables/iptables.rule
```
事实上,这个脚本的最底下已经加入写入防火墙默认规则文件的功能,所以你只要执行一次,就拥有最正确的规则了! 上述的 rc.local 仅是预防万一而已。 ^_^!上述三个档案请你不要在 Windows 系统上面编辑后才传送到 Linux 上运作,因为 Windows 系统的断行字符问题,将可能导致该档案无法执行。建议你直接到底下去下载,传送到 Linux 后可以利用 [dos2unix](http://linux.vbird.org/linux_basic/0310vi.php#dos2unix) 指令去转换断行字符!就不会有问题!
* [http://linux.vbird.org/download/index.php?action=detail&fileid=43](http://linux.vbird.org/download/index.php?action=detail&fileid=43)
这就是一个最简单、阳春的防火墙。同时,这个防火墙还可以具有最阳春的 IP 分享器的功能呢! 也就是在 [iptables.rule](#iptables.rule) 这个档案当中的第二部分了。 这部分我们在下一节会再继续介绍的。
* * *
- 鸟哥的Linux私房菜:服务器架设篇 第三版
- 第一部份:架站前的进修专区
- 作者序
- 第一章、架设服务器前的准备工作
- 1.1 前言: Linux 有啥功能
- 1.2 基本架设服务器流程
- 1.3 自我评估是否已经具有架站的能力
- 1.4 本章习题
- 第二章、基础网络概念
- 2.1 网络是个什么玩意儿
- 2.2 TCP/IP 的链结层相关协议
- 2.3 TCP/IP 的网络层相关封包与数据
- 2.4 TCP/IP 的传输层相关封包与数据
- 2.5 连上 Internet 前的准备事项
- 2.6 重点回顾:
- 2.7 本章习题
- 2.8 参考数据与延伸阅读
- 第三章、局域网络架构简介
- 3.1 局域网络的联机
- 3.2 本书使用的内部联机网络参数与通讯协议
- 第四章、连上 Internet
- 4.1 Linux 连上 Internet 前的注意事项
- 4.2 连上 Internet 的设定方法
- 4.3 无线网络--以笔记本电脑为例
- 4.4 常见问题说明
- 4.5 重点回顾
- 4.6 本章习题
- 4.7 参考数据与延伸阅读
- 第五章、 Linux 常用网络指令
- 5.1 网络参数设定使用的指令
- 5.2 网络侦错与观察指令
- 5.3 远程联机指令与实时通讯软件
- 5.4 文字接口网页浏览
- 5.5 封包撷取功能
- 5.6 重点回顾
- 5.7 本章习题
- 5.8 参考数据与延伸阅读
- 第六章、 Linux 网络侦错
- 6.1 无法联机原因分析
- 6.2 处理流程
- 6.3 本章习题
- 6.4 参考数据与延伸阅读
- 第二部分:主机的简易资安防护措施
- 第七章、网络安全与主机基本防护:限制端口, 网络升级与 SELinux
- 7.1 网络封包联机进入主机的流程
- 7.2 网络自动升级软件
- 7.3 限制联机埠口 (port)
- 7.4 SELinux 管理原则
- 7.5 被攻击后的主机修复工作
- 7.6 重点回顾
- 7.7 课后练习
- 7.8 参考数据与延伸阅读
- 第八章、路由观念与路由器设定
- 8.1 路由
- 8.2 路由器架设
- 8.3 动态路由器架设:quagga (zebra + ripd)
- 8.4 特殊状况:路由器两边界面是同一个 IP 网段: ARP Proxy
- 8.5 重点回顾
- 8.6 本章习题
- 8.7 参考数据与延伸阅读
- 第九章、防火墙与 NAT 服务器
- 9.1 认识防火墙
- 9.2 TCP Wrappers
- 9.3 Linux 的封包过滤软件:iptables
- 9.4 单机防火墙的一个实例
- 9.5 NAT 服务器的设定
- 9.6 重点回顾
- 9.7 本章习题
- 9.8 参考数据与延伸阅读
- 第十章、申请合法的主机名
- 10.1 为何需要主机名
- 10.2 注册一个合法的主机名
- 10.3 重点回顾
- 10.4 本章习题
- 10.5 参考数据与延伸阅读
- 第三部分:局域网络内常见的服务器架设
- 第十一章、远程联机服务器SSH / XDMCP / VNC / RDP
- 11.1 远程联机服务器
- 11.2 文字接口联机服务器: SSH 服务器
- 11.3 最原始图形接口: Xdmcp 服务的启用
- 11.4 华丽的图形接口: VNC 服务器
- 11.5 仿真的远程桌面系统: XRDP 服务器
- 11.6 SSH 服务器的进阶应用
- 11.7 重点回顾
- 11.8 本章习题
- 11.9 参考数据与延伸阅读
- 第十二章、网络参数控管者: DHCP 服务器
- 12.1 DHCP 运作的原理
- 12.2 DHCP 服务器端的设定
- 12.3 DHCP 客户端的设定
- 12.4 DHCP 服务器端进阶观察与使用
- 12.5 重点回顾
- 12.6 本章习题
- 12.7 参考数据与延伸阅读
- 第十三章、文件服务器之一:NFS 服务器
- 13.1 NFS 的由来与其功能
- 13.2 NFS Server 端的设定
- 13.3 NFS 客户端的设定
- 13.4 案例演练
- 13.5 重点回顾
- 13.6 本章习题
- 13.7 参考数据与延伸阅读
- 第十四章、账号控管: NIS 服务器
- 14.1 NIS 的由来与功能
- 14.2 NIS Server 端的设定
- 14.3 NIS Client 端的设定
- 14.4 NIS 搭配 NFS 的设定在丛集计算机上的应用
- 14.5 重点回顾
- 14.6 本章习题
- 14.7 参考数据与延伸阅读
- 第十五章、时间服务器: NTP 服务器
- 15.1 关于时区与网络校时的通讯协议
- 15.2 NTP 服务器的安装与设定
- 15.3 客户端的时间更新方式
- 15.4 重点回顾
- 15.5 本章习题
- 15.6 参考数据与延伸阅读
- 第十六章、文件服务器之二: SAMBA 服务器
- 16.1 什么是 SAMBA
- 16.2 SAMBA 服务器的基础设定
- 16.3 Samba 客户端软件功能
- 16.4 以 PDC 服务器提供账号管理
- 16.5 服务器简单维护与管理
- 16.6 重点回顾
- 16.7 本章习题
- 16.8 参考数据与延伸阅读
- 第十七章、区网控制者: Proxy 服务器
- 17.1 什么是代理服务器 (Proxy)
- 17.2 Proxy 服务器的基础设定
- 17.3 客户端的使用与测试
- 17.4 服务器的其他应用设定
- 17.5 重点回顾
- 17.6 本章习题
- 17.7 参考数据与延伸阅读
- 第十八章、网络驱动器装置: iSCSI 服务器
- 18.1 网络文件系统还是网络驱动器
- 18.2 iSCSI target 的设定
- 18.3 iSCSI initiator 的设定
- 18.4 重点回顾
- 18.5 本章习题
- 18.6 参考数据与延伸阅读
- 第四部分:常见因特网服务器架设
- 第十九章、主机名控制者: DNS 服务器
- 19.1 什么是 DNS
- 19.2 Client 端的设定
- 19.3 DNS 服务器的软件、种类与 cache only DNS 服务器设定
- 19.4 DNS 服务器的详细设定
- 19.5 协同工作的 DNS: Slave DNS 及子域授权设定
- 19.6 DNS 服务器的进阶设定
- 19.7 重点回顾
- 19.8 本章习题
- 19.9 参考数据与延伸阅读
- 第二十章、WWW 伺服器
- 20.1 WWW 的簡史、資源以及伺服器軟體
- 20.2 WWW (LAMP) 伺服器基本設定
- 20.3 Apache 伺服器的進階設定
- 20.4 登錄檔分析以及 PHP 強化模組
- 20.5 建立連線加密網站 (https) 及防砍站腳本
- 20.6 重點回顧
- 20.7 本章習題
- 20.8 參考資料與延伸閱讀
- 第二十一章、文件服务器之三: FTP 服务器
- 21.1 FTP 的数据链路原理
- 21.2 vsftpd 服务器基础设定
- 21.3 客户端的图形接口 FTP 联机软件
- 21.4 让 vsftpd 增加 SSL 的加密功能
- 21.5 重点回顾
- 21.6 本章习题
- 21.7 参考数据与延伸阅读
- 第二十二章、邮件服务器: Postfix
- 22.1 邮件服务器的功能与运作原理
- 22.2 MTA 服务器: Postfix 基础设定
- 22.3 MRA 服务器: dovecot 设定
- 22.4 MUA 软件:客户端的收发信软件
- 22.5 邮件服务器的进阶设定
- 22.6 重点回顾
- 22.7 本章习题
- 22.8 参考数据与延伸阅读