简释iptables防火墙(转)
一般
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
################################
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
################################
-F
-Z
-X
###
以后要新增语句请在此处增加。
-L �Cv
COMMIT
################################################
*filter
##############################
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
##############################
-F
-Z
-X
###
以后要新增语句请在此处增加。
-L �Cv
COMMIT
##########################################################################
1、
局域网用户通过服务器共享上网
(
即从张三家到李四家
)
1)
首先进①号门,再从⑥号门走出。
-A PREROUTING �Cp tcp --dport 80 �Cj ACCEPT
#
允许
TCP 80
端口通过服务器
-A FORWARD �Cp tcp --dport 80 �Cj ACCEPT
#
允许
TCP80
端口转发
-A FORWARD �Cp tcp --sport 80 �Cj ACCEPT
#
允许接收对方为
TCP80
端口反回的信息
2)
其次,由于我们上网打的是域名,为此有一个公网
DNS
服务器为我们服务,那当然也要允许内网机器与
DNS
服务器的数据转发。
DNS
用
UDP 53
或者
TCP 53
端口。两者用其一个就行。
-A PREROUTING �Cp udp --dport 53 �Cj ACCEPT
-A FORWARD �Cp udp --dport 53 �Cj ACCEPT
-A FORWARD �Cp udp --sport 53 �Cj ACCEPT
3
)再次,由于局域网的地址在公网上是不被允许的,所以在出公网前应该把其地址转为服务器地址进行伪装。
-A POSTROUTING �Cs 192.168.5.0/24 �Cj SNAT �Cto 218.100.100.111
2、
允许局域网和公网可以访问服务器的
SSH
假设
SSH
采用默认端口
TCP 22
。此要求相当于要进我的家的
TCP 22
号门,为此我们首先要进我家院子,然后再进我家门,最后走出我家门这样的过程。此操作是征对服务器本身的操作。
-A PREROUTING �Cp tcp --dport 22 �Cj ACCEPT
-A INPUT �Cp tcp --dport 22 �Cj ACCEPT
-A OUTPUT �Cp tcp --sport 22 �Cj ACCEPT
3、
允许内网机器可以登录
MSN
和
QQ
。
(
MSN
和
QQ
默认是不允许登录的)
QQ
一般来说可以从
TCP 80
、
8000
、
443
及
UDP 8000
、
4000
登录,而
MSN
可以从
TCP 1863
、
443
登录。我们登录
MSN
和
QQ
的过程就象上网一样,也是去访问远程服务器的指定端口,故而我们只用数据转发即可。
-A PREROUTING �Cp tcp --dport 1863 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 443 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 8000 �Cj ACCEPT
-A PREROUTING �Cp udp --dport 8000 �Cj ACCEPT
-A PREROUTING �Cp udp --dport 4000 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 1863 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 1863 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 443 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 443 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 8000 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 8000 �Cj ACCEPT
-A FORWARD �Cp udp --dport 8000 �Cj ACCEPT
-A FORWARD �Cp udp --sport 8000 �Cj ACCEPT
-A FORWARD �Cp udp --dport 4000 �Cj ACCEPT
-A FORWARD �Cp udp --sport 4000 �Cj ACCEPT
4、
让内网机器可以收发邮件。
接收邮件是访问远程服务器的
TCP 110
端口,发送邮件是访问
TCP25
端口。用数据转发即可。
-A PREROUTING �Cp tcp --dport 110 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 25 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 110 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 110 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 25 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 25 �Cj 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 �Ci eth0 �Cp tcp �Cd 218.100.100.111 --dport 80 �Cj DNAT --to-destination 192.168.5.179:80
-A PREROUTING �Ci eth1 �Cp tcp �Cd 218.100.100.111 �Cdport 80 �Cj DNAT �Cto-destination 192.168.5.179:80
(以上两句必须写在
�CA PREROUTING �Cp tcp --dport 80 �Cj ACCEPT
前面。)
TCP 80
端口的转发在第
1
步就已做过,此处就不用重复制作了。另外在
-A POSTROUTING �Cs 192.168.5.0/24 �Cj SNAT �Cto 218.100.100.111
之后加上一句
:
-A POSTROUTING �Cp tcp --dport 80 �Cj 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 �Ci eth0 �Cp tcp �Cd 218.100.100.111 --dport 80 �Cj DNAT --to-destination 192.168.5.179:80
告诉
199.199.199.199,
您要访问的真正地址应该是
192.168.5.179:80,
然后我们通过
-A POSTROUTING �Cp tcp --dport 80 �Cj 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 �Cs 192.168.5.0/24 �Cj SNAT �Cto 218.100.100.111
后,
数据源
:
ip:218.100.100.111 sport:80
数据目标:
ip:199.199.199.199 dport 12345
6、
完整的
iptables
配置
###########################################################################
*nat
################################
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
################################
-F
-Z
-X
-A PREROUTING �Ci eth0 �Cp tcp �Cd 218.100.100.111 --dport 80 �Cj DNAT --to-destination 192.168.5.179:80
-A PREROUTING �Ci eth1 �Cp tcp �Cd 218.100.100.111 --dport 80 �Cj DNAT �Cto-destination 192.168.5.179:80
-A PREROUTING �Cp tcp --dport 80 �Cj ACCEPT
-A PREROUTING �Cp udp --dport 53 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 22 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 1863 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 443 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 8000 �Cj ACCEPT
-A PREROUTING �Cp udp --dport 8000 �Cj ACCEPT
-A PREROUTING �Cp udp --dport 4000 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 110 �Cj ACCEPT
-A PREROUTING �Cp tcp --dport 25 �Cj ACCEPT
-A POSTROUTING �Cs 192.168.5.0/24 �Cj SNAT �Cto 218.100.100.111
-A POSTROUTING �Cp tcp --dport 80 �Cj ACCEPT
-L �Cv
COMMIT
################################################
*filter
##############################
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
##############################
-F
-Z
-X
-A INPUT �Cp tcp --dport 22 �Cj ACCEPT
-A OUTPUT �Cp tcp --sport 22 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 80 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 80 �Cj ACCEPT
-A FORWARD �Cp udp --dport 53 �Cj ACCEPT
-A FORWARD �Cp udp --sport 53 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 1863 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 1863 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 443 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 443 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 8000 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 8000 �Cj ACCEPT
-A FORWARD �Cp udp --dport 8000 �Cj ACCEPT
-A FORWARD �Cp udp --sport 8000 �Cj ACCEPT
-A FORWARD �Cp udp --dport 4000 �Cj ACCEPT
-A FORWARD �Cp udp --sport 4000 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 110 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 110 �Cj ACCEPT
-A FORWARD �Cp tcp --dport 25 �Cj ACCEPT
-A FORWARD �Cp tcp --sport 25 �Cj ACCEPT
-L �Cv
COMMIT
##########################################################################
7、
其它注意事项
1)
在使用
iptables
防火墙之前,必须先打开
IP
转发功能。
#
echo “1” > /proc/sys/net/ipv4/ip_forward
2)
以上内容(第
6
步生成的内容)保存到
/etc/sysconfig/iptables
文件中。
3
)每修改一次
iptables
文件后,都要重启
iptalbes
#
service iptables restart
|