最近觉得QQ这个东西的确有些影响同事们工作,所以下决心摸索一下iptables,看看能不能提 供一下生产力。
我的网络情况:linux服务器既是上网的拨号服务器,同时也是公司的web server、mail server、ftp server等,域名动态解析,同时它与公司其它windows客户端构成了一个局域网,内网IP为192.168.0.1(eth1接口),外网网卡 (eth0接口),拨号接口为ppp0,网内其它计算机的IP也都是192.168.0网段。192.168.0.2到192.168.0.16为公司工 作人员(公司比较小,只有10来个人),192.168.0.240到192.168.0.243这几个IP是我和其它两个同事在用,需要实现的目标是外 网只能访问服务器的www、mail、ftp、tomcat这几个服务、内网192.168.0.2到192.168.0.16这个IP段的同事们上班时 间只能上外网的www、mail、ftp、tomcat并禁止使用QQ、192.168.0.240到192.168.0.243这个IP段的同事们可以 无限制上网。下面是我的脚本内容。
work_firewall.sh:
# Display start message
echo "Starting iptables rules..."
# 设置变量
IPT=/sbin/iptables
INTERNET_SERVER=192.168.0.1
IP_ME="127.0.0.1"
IP_SPEC_RANGE="192.168.0.240/30"
IP_WORK_RANGE="192.168.0.2/28"
IP_ALL="192.168.0.0/24"
# 清除所有规则
$IPT -F
$IPT -t nat -F
# 重置所有链默认设置
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
# 1. 限制internet对web服务器的访问
# (1) 允许自己无限制访问自己
$IPT -A INPUT -s $IP_ME -j ACCEPT
# (2) 允许访问www服务
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
# (3) 允许访问ftp服务
$IPT -A INPUT -p tcp --dport 20 -j ACCEPT
$IPT -A INPUT -p tcp --dport 21 -j ACCEPT
# (4) 允许访问mail服务
$IPT -A INPUT -p tcp --dport 110 -j ACCEPT
$IPT -A INPUT -p tcp --dport 143 -j ACCEPT
$IPT -A INPUT -p tcp --dport 25 -j ACCEPT
# (5) 允许访问tomcat服务
$IPT -A INPUT -p tcp --dport 8080 -j ACCEPT
# 2. 允许工作人员通过局域网访问服务器
$IPT -A INPUT -s $IP_SPEC_RANGE -j ACCEPT
$IPT -A INPUT -s $IP_WORK_RANGE -j ACCEPT
# 3. 允许特殊IP无限制上网
$IPT -t nat -A PREROUTING -s $IP_SPEC_RANGE -j ACCEPT
# 4. 对工作范围内IP限制部分上网功能
# (1) 允许访问DNS和ECHO
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p udp --dport 53 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p udp --dport 42 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p udp --dport 7 -j ACCEPT
# (2) 禁止QQ的TCP登录
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 219.133.38.5 -p tcp -j DROP
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 218.18.95.165 -p tcp -j DROP
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 218.17.209.23 -p tcp -j DROP
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 218.18.95.153 -p tcp -j DROP
# (3) 禁止MSN登录
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 207.46.104.20 -j DROP
# (4) 允许访问www
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 80 -j ACCEPT
# (5) 允许访问ftp
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 20 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 21 -j ACCEPT
# (6) 允许访问mail
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 110 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 143 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 25 -j ACCEPT
# (7) 允许访问tomcat
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 8080 -j ACCEPT
# (8) 禁止访问其它服务
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d ! $IP_ALL -j DROP
# 5. 共享上网
$IPT -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
# 显示结束信息
echo "Completed iptables rules."

网上讲解iptables命令如何使用的文章已经数不胜数了,但真正要理解它的工作原理还是不太容易,也许是自己太笨周六那天竟然午饭 都没吃苦苦思索了整整一天才慢慢有所领悟。netfilter/iptables共有三组规则表:filter、nat和mangle。filter表用 于一般的信息包过滤,如我的网络中192.168.0.1服务器自己访问internet资源时或者外网访问服务器本身时使用filter表规则;nat 表用于转发的信息包过滤,如我的局域网内客户端需要通过服务器访问外网时就需要用到nat表规则;mangle表用于高级路由,我此次没有用到,因此也没 有深究,有空了再看看^_^。filter表包括INPUT链、OUTPUT链和FORWARD链;nat表包括PREROUTING链、 POSTROUTING链和OUTPUT链;mangle表包括PREROUTING链和OUTPUT链。filter表为默认规则表。
表名 功能
 
filter 用于一般的信息包过滤,包括INPUT链、OUTPUT链和FORWARD链,如我的网络中192.168.0.1服务器自己访问internet资源时或者外网访问服务器本身时使用filter表规则
nat 用于转发的信息包过滤,包括PREROUTING链、POSTROUTING链和OUTPUT链,如我的局域网内客户端需要通过服务器访问外网时就需要用到nat表规则
mangle 用于高级路由,包括PREROUTING链和OUTPUT链

上面的脚本先清除了所有链的所有规则并重置了默认设置,其中INPUT链默认不接受外来访问服务器的任何数据包,接着第1步开放了服务器的 80、20、21、110、143、25和8080端口,第2步允许局域网内的192.168.0.2到192.168.0.16及 192.168.0.240到192.168.0.243的客户端访问服务器,第3步允许192.168.0.240及192.168.0.243无限制 访问外网,第4步允许192.168.0.2到192.168.0.16访问外网的80、20、21、110、143、25、8080及DNS和 echo,第5步局域网内客户端共享上网。