LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3638|回复: 14

看我简释iptables防火墙!

[复制链接]
发表于 2005-1-10 13:15:05 | 显示全部楼层 |阅读模式
一般LINUX防火墙(iptalbes)的运用无非是用nat 表(PREROUTING、OUTPUT、POSTROUTING)和filter表(FORWARD、INPUT、OUTPUT)。我们只有知道了数据的流向才能正确的配置防火墙。现用一个相对比较直观的图形解释数据的走向。(此处只作最基本的iptables数据流走向说明。)

上图是你的家,蓝色的圈是你家院子,有两扇大门①⑥进出,你家有两个房间,分别为eth0和 eth1房间,每个房间有两个门可以进出②③④⑤。旁边是张三和李四的家,张三家和李四家之间的往返必须要过你家院子。
现假设,eth0网卡IP为:192.168.5.1链接内网,eth1网卡IP为:218.100.100.111链接互连网。
再假设,“张三家”为一个局域网,“李四家”为互连网。进我家院子用PREROUTING,出我家院子用FORWARD,进我家门用INPUT,出我家门用OUTPUT。(当我们的操作是征对服务器本身而言的话,如SSH操作,此时肯定会用到PREROUTING、INPUT和OUTPUT,当数据只是通过服务器去访问别的机器时会用到PREROUTING和FORWARD。)
又假设,默认这六个门都是关的。生成如下代码。
###########################################################################
*nat
################################
REROUTING    DROP  [0:0]
:OUTPUT         DROP  [0:0]
OSTROUTING   DROP  [0:0]
################################
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L –v
COMMIT
################################################
*filter
##############################
:INPUT          DROP  [0:0]
:FORWARD      DROP  [0:0]
:OUTPUT        DROP  [0:0]
##############################
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L –v
COMMIT
##########################################################################
1、    局域网用户通过服务器共享上网
(即从张三家到李四家)
1)首先进①号门,再从⑥号门走出。
-A  PREROUTING –p tcp --dport 80 –j ACCEPT #允许TCP 80端口通过服务器
-A  FORWARD –p tcp --dport 80 –j ACCEPT    #允许TCP80 端口转发
-A  FORWARD –p tcp --sport 80 –j ACCEPT    #允许接收对方为TCP80端口反回的信息
2)其次,由于我们上网打的是域名,为此有一个公网DNS服务器为我们服务,那当然也要允许内网机器与DNS服务器的数据转发。DNS用UDP 53或者 TCP 53端口。两者用其一个就行。
-A  PREROUTING –p udp  --dport 53 –j ACCEPT   
-A  FORWARD –p udp  --dport 53 –j ACCEPT      
-A  FORWARD –p udp  --sport 53 –j ACCEPT      
3)再次,由于局域网的地址在公网上是不被允许的,所以在出公网前应该把其地址转为服务器地址进行伪装。
-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111
2、    允许局域网和公网可以访问服务器的SSH
假设SSH采用默认端口TCP 22 。此要求相当于要进我的家的TCP 22号门,为此我们首先要进我家院子,然后再进我家门,最后走出我家门这样的过程。此操作是征对服务器本身的操作。
-A  PREROUTING –p tcp --dport 22 –j ACCEPT
-A  INPUT –p tcp --dport 22 –j ACCEPT
-A  OUTPUT –p tcp --sport 22 –j ACCEPT
3、    允许内网机器可以登录MSN和QQ。
(MSN和QQ默认是不允许登录的)QQ一般来说可以从TCP 80、8000、443及UDP 8000、4000登录,而MSN可以从TCP 1863、443登录。我们登录MSN和QQ的过程就象上网一样,也是去访问远程服务器的指定端口,故而我们只用数据转发即可。
-A  PREROUTING –p tcp --dport 1863 –j ACCEPT
-A  PREROUTING –p tcp --dport 443 –j ACCEPT
-A  PREROUTING –p tcp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p tcp --dport 1863 –j ACCEPT
-A  FORWARD –p tcp --sport 1863 –j ACCEPT
-A  FORWARD –p tcp --dport 443 –j ACCEPT
-A  FORWARD –p tcp --sport 443 –j ACCEPT
-A  FORWARD –p tcp --dport 8000 –j ACCEPT
-A  FORWARD –p tcp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 8000 –j ACCEPT
-A  FORWARD –p udp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p udp --sport 4000 –j ACCEPT
4、    让内网机器可以收发邮件。
接收邮件是访问远程服务器的TCP 110端口,发送邮件是访问TCP25端口。用数据转发即可。
-A  PREROUTING –p tcp --dport 110 –j ACCEPT
-A  PREROUTING –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --dport 110 –j ACCEPT
-A  FORWARD –p tcp --sport 110 –j ACCEPT
-A  FORWARD –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --sport 25 –j ACCEPT
5、    内部机器对外发布WEB。
要把内网机器192.168.5.179的WEB对外发布的话,相当于是从外网访问内网。与第1步操作的局域网共享上网相同,只是访问的方向改变了。不是从内网访问外网,而是从外网访问内网。
当公网访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。当内网机器访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。
-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80
-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 –dport 80 –j DNAT –to-destination 192.168.5.179:80
(以上两句必须写在 –A PREROUTING –p tcp --dport 80 –j ACCEPT 前面。)
  TCP 80端口的转发在第1步就已做过,此处就不用重复制作了。另外在
-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111 之后加上一句:
-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT
为什么要加这句话呢,我的理解是这样的,
公网访问 http://218.100.100.111时:(假设公网上用户的IP为199.199.199.199,端口12345为随机的产生的。)
数据源 :   ip:199.199.199.199   sport:12345
数据目标:  ip:218.100.100.111   dport 80
此时,通过-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 告诉199.199.199.199,您要访问的真正地址应该是192.168.5.179:80,然后我们通过-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT 目标地址218.100.100.111:80伪装成 192.168.5.179:80 。
数据源 :   ip:199.199.199.199   sport:12345
数据目标:  ip:192.168.5.179     dport 80

当192.168.5.179返回数据时:
数据源 :   ip:192.168.5.179     sport:80
数据目标:  ip:199.199.199.199   dport 12345
数据经过 -A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111 后,
数据源 :   ip:218.100.100.111   sport:80
数据目标:  ip:199.199.199.199   dport 12345

6、    完整的iptables配置
###########################################################################
*nat
################################
REROUTING    DROP  [0:0]
:OUTPUT         DROP  [0:0]
OSTROUTING   DROP  [0:0]
################################
-F
-Z
-X
-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80
-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 --dport 80 –j DNAT –to-destination 192.168.5.179:80
-A  PREROUTING –p tcp --dport 80 –j ACCEPT
-A  PREROUTING –p udp  --dport 53 –j ACCEPT   
-A  PREROUTING –p tcp --dport 22 –j ACCEPT
-A  PREROUTING –p tcp --dport 1863 –j ACCEPT
-A  PREROUTING –p tcp --dport 443 –j ACCEPT
-A  PREROUTING –p tcp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 4000 –j ACCEPT
-A  PREROUTING –p tcp --dport 110 –j ACCEPT
-A  PREROUTING –p tcp --dport 25 –j ACCEPT
-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111
-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT
-L –v
COMMIT
################################################
*filter
##############################
:INPUT          DROP  [0:0]
:FORWARD      DROP  [0:0]
:OUTPUT        DROP  [0:0]
##############################
-F
-Z
-X
-A  INPUT –p tcp --dport 22 –j ACCEPT
-A  OUTPUT –p tcp --sport 22 –j ACCEPT
-A  FORWARD –p tcp --dport 80 –j ACCEPT   
-A  FORWARD –p tcp --sport 80 –j ACCEPT   
-A  FORWARD –p udp --dport 53 –j ACCEPT      
-A  FORWARD –p udp  --sport 53 –j ACCEPT   
-A  FORWARD –p tcp --dport 1863 –j ACCEPT
-A  FORWARD –p tcp --sport 1863 –j ACCEPT
-A  FORWARD –p tcp --dport 443 –j ACCEPT
-A  FORWARD –p tcp --sport 443 –j ACCEPT
-A  FORWARD –p tcp --dport 8000 –j ACCEPT
-A  FORWARD –p tcp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 8000 –j ACCEPT
-A  FORWARD –p udp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p udp --sport 4000 –j ACCEPT
-A  FORWARD –p tcp --dport 110 –j ACCEPT
-A  FORWARD –p tcp --sport 110 –j ACCEPT
-A  FORWARD –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --sport 25 –j ACCEPT
-L –v  
COMMIT
##########################################################################
7、    其它注意事项
1)在使用iptables防火墙之前,必须先打开IP转发功能。
# echo “1” > /proc/sys/net/ipv4/ip_forward
2)以上内容(第6步生成的内容)保存到 /etc/sysconfig/iptables文件中。
3)每修改一次iptables文件后,都要重启iptalbes
    # service iptables restart
以上就是我对iptables的初浅理解,里面的语句已在RedHat 9.0上测试通过。如有不当之处请通知我:QQ 3877900  MSN hzjjr@msn.com
发表于 2005-1-10 15:20:36 | 显示全部楼层
我对iptables有点了解,所以知道你的意思。

如果是新手的话,可能还是不太清楚。

但对于你这种做法表示感谢,一个字“顶”!!!
发表于 2005-1-10 20:07:57 | 显示全部楼层
那么请问,你的意思是不是说,即使有两块网卡,报文也仍然只有一次经过 PREROUTING 和 POSTROUTING 链?

谢谢。
发表于 2005-1-10 20:50:21 | 显示全部楼层
undefinedundefinedundefined
 楼主| 发表于 2005-1-10 22:55:57 | 显示全部楼层
我在这里设置的全部DROP了,所以设置起来会比较麻烦的。我只是为了解释数据是怎么走的,防火墙设置时应该考虑哪些地方,如果您把这些链都ACCEPT的话,那你那句-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111就够了。当然我也是为了解释一个问题罢了,真正的数据当然都经过网卡的啦,不可能不经过网卡的。
发表于 2005-1-10 23:57:30 | 显示全部楼层
我的意思是,是不是 eth0 有一个 PREROUTING 和 POSTROUTING,eth1 也有一个 POSTROUTING?

我前两天写了一个 iptables 的测试程序,过程和结果就发在论坛上了:“讨论:用LOG选项检测iptables,查看报文流入流出过程”,但是是用一块网卡+ADSL 测试的,不清楚两块网卡的情况,所以想要问清楚。

谢谢。
发表于 2005-1-11 01:21:55 | 显示全部楼层
很好!有创意,而且具有一定说服力,和简单明了的思路可以透析iptables
8错.
继续努力!
 楼主| 发表于 2005-1-11 09:54:21 | 显示全部楼层
Chowroc 我的理解是这样的,POSTROUTING的目标是解决不同网段的IP之间的通信的,他一般与 “-o 网卡”使用,而PREROUTING 一般与“-i 网卡”使用,所以你就可以知道,上例中,你有外网数据进来并且访问内网某台机器时,eth0有一个PREROUTING ,eth1有一个POSTROUTING,当共享上网时(即内网访问外网时)eth1有一个PREROUTING,而eth0有一个POSTROUTING。我是这样理解的,不知这样是否正确。我试过POSTROUTING 与-i 配合时,虽然在RedHat 90上执行时没有报错,但在实现测试效果上是错的。
发表于 2005-1-11 18:41:09 | 显示全部楼层
对,我知道,-i 只能与 PREROUTING 配合,-o 只能与 POSTROUTING 配合。POSTROUTING 还可以与 -s IP/MASK 配合:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
or:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

我写的测试脚本,用 LOG 选项记录到 /var/log/message 中:

  1. #!/bin/bash

  2. iptables -F

  3. /sbin/modprobe ipt_MASQUERADE
  4. /sbin/modprobe iptable_nat
  5. /sbin/modprobe ipt_LOG
  6. /sbin/modprobe ip_conntrack

  7. # iptables -P INPUT -j ACCEPT
  8. # iptables -P FORWARD -j ACCEPT
  9. # iptables -P OUTPUT -j ACCEPT

  10. iptables -t nat -A PREROUTING -i eth0 -j LOG --log-level 0 --log-prefix "PREROUTING_i_eth0: "
  11. # iptables -t nat -A PREROUTING -o eth0 -j LOG --log-prefix "PREROUTING_o_eth0: "
  12. iptables -A FORWARD -i eth0 -j LOG --log-level 0 --log-prefix "FORWARD_i_eth0: "
  13. iptables -A FORWARD -o eth0 -j LOG --log-level 0 --log-prefix "FORWARD_o_eth0: "
  14. # iptables -t nat -A POSTROUTING -i eth0 -j LOG --log-prefix "POSTROUTING_i_eth0: "
  15. iptables -t nat -A POSTROUTING -o eth0 -j LOG --log-level 0 --log-prefix "POSTROUTING_o_eth0: "

  16. iptables -t nat -A PREROUTING -i ppp0 -j LOG --log-level 0 --log-prefix "PREROUTING_i_ppp0: "
  17. # iptables -t nat -A PREROUTING -o ppp0 -j LOG --log-prefix "PREROUTING_0_ppp0: "
  18. iptables -A FORWARD -i ppp0 -j LOG --log-level 0 --log-prefix "FORWARD_i_ppp0: "
  19. iptables -A FORWARD -o ppp0 -j LOG --log-level 0 --log-prefix "FORWARD_o_ppp0: "
  20. # iptables -t nat -A POSTROUTING -i ppp0 -j LOG --log-prefix "POSTROUTING_i_ppp0: "
  21. iptables -t nat -A POSTROUTING -o ppp0 -j LOG --log-level 0 --log-prefix "POSTROUTING_o_ppp0: "
  22. iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
  23. echo 1 > /proc/sys/net/ipv4/ip_forward

  24. iptables -A INPUT -j ACCEPT
  25. iptables -A FORWARD -j ACCEPT
  26. iptables -A OUTPUT -j ACCEPT
复制代码


通过查看 message 文件中的记录,我的结论是,使用 eth0 + ppp0 的 ADSL 共享上网,内网请求 Internet 服务,经过:
LAN ---> eth0(PREROUTING) ---> 路由算法 ---> eth0(FORWARD) --->  ppp0(FORWARD) ---> ppp0(POSTROUTING: NAT) ---> Internet
没有eth0(POSTROUTING) 和 ppp0(PREROUTING) 的环节。

而 Internet 服务返回的数据,只经过 eth0(FORWARD) 和 ppp0(FORWARDE)──我通过看到的记录只能得出这样的结论。

我不知道两块网卡共享上网的情况,以及使用两块网卡进行 ADSL 共享上网的情况,故有此问。

不知那位兄台能帮助测一测?作为一种研究和学习。

谢谢。
 楼主| 发表于 2005-1-11 21:56:14 | 显示全部楼层
你讲的现象
“使用 eth0 + ppp0 的 ADSL 共享上网,内网请求 Internet 服务,经过:
LAN ---> eth0(PREROUTING) ---> 路由算法 ---> eth0(FORWARD) ---> ppp0(FORWARD) ---> ppp0(POSTROUTING: NAT) ---> Internet没有eth0(POSTROUTING) 和 ppp0(PREROUTING) 的环节。而 Internet 服务返回的数据,只经过 eth0(FORWARD) 和 ppp0(FORWARDE)──我通过看到的记录只能得出这样的结论。”
不是和我说的一样吗?你用PPP0代替我上例中的eth0,用你说的eth0代替我上例中的eth1,道理应该一样的呀。我觉得INTERNET返回数据应该有一个pppo的PREROUTING的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表