Duangw

Iptables脚本

 

该脚本用来设置Linux防火墙netfilter,通过调用iptables命令进行配置。

本文内容基于Slackware Linux。

1 rc.iptables系列模板

不同角色的机器需要不同的防火墙设置,为此提供一系列的iptables脚本模板。根据具体环境选择模板,再按实际情况进行更改调整。目前有这么些模板:

各个模板的详细说明见后。

新版本脚本借鉴了Iptables-tutorial的做法,重新组织了内容,并使用了很多增强可读性的注释,所以下面就不再说明了。

 

2 配置方法

把相应模板脚本放到/etc/rc.d/目录下,改名为rc.ip[6]tables:

# cp rc.iptables-XXXX.ref /etc/rc.d/rc.iptables
或
# cp rc.ip6tables.ref /etc/rc.d/rc.ip6tables

编辑/etc/rc.d/rc.S文件,在末尾添加调用rc.ip[6]tables的语句。

防火墙要在网络接口启动之前运行,否则就会留下时间空间,这就是脚本为什么放在rc.S中的原因,在rc.M中会启动网络接口。调用方法也提供一个模板rc.S.ref,把模板内容粘贴到rc.S的末尾即可。模板内容如下:

# If there is my iptables script, run it before network up.
if [ -x /etc/rc.d/rc.iptables ]; then
  . /etc/rc.d/rc.iptables start
fi

# If there is my ip6tables script, run it before network up.
if [ -x /etc/rc.d/rc.ip6tables ]; then
  . /etc/rc.d/rc.ip6tables start
fi

 

3 模板说明

链接:rc.iptables-client.refrc.iptables-gate-novpn.refrc.iptables-gate-ipsec.refrc.iptables-gate-openvpn.refrc.iptables-server.refrc.ip6tables.ref

3.1 rc.iptables-client.ref

#!/bin/sh
# Start/stop/restart my iptables configuration for workstation.
#

start() {

# 装载模板
/sbin/modprobe ip_conntrack_ftp

iptables -F

# 缺省策略设置为禁止一切数据:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# 对于本地loopback接口,不做限制:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 虽然分片包有存在的理由,但在当今的网络现状下,已经很少了。分片出现更多的是源于攻击,所以禁止分片包:
iptables -A INPUT -f -j DROP

# 作为客户机(桌面),我们可以访问任何地方,不应做限制。所以从本机发出的连接都是允许的,相应的应答包也可进入本机:
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 缺省提供ssh接入服务,相应的应答数据已经包含在上面的规则中,所以不需要再添加一条OUTPUT规则:
iptables -A INPUT -p tcp --dport ssh -m state --state NEW -j ACCEPT

# 允许ping进入,出于安全担忧可以取消:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# other

}

resume_all() {

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

}

stop() {

iptables -F

}


case "$1" in
'start')
    start
    ;;
'stop')
    stop
    resume_all
    ;;
'restart')
    stop
    start
    ;;
*)
    echo "usage $0 start|stop|restart"
esac

注:restart功能的实现一般都是先stop,然后start。如果stop功能取消了所有限制,那么在start启动之前,就会有一个时间空间,使机器在无防火墙监管之下。为此,修改了stop的内容,额外提供一个resume_all()函数,以避免这种情况。

 

3.2 rc.iptables-gate-novpn.ref

#!/bin/sh
# Start/stop/restart my iptables configuration for gate.
#

# 网关作为一个网络的枢纽,一般都是有多个接口的,比如内网、外网、dmz接口,有的还配有专门的管理接口mng,故这里按多接口的规格进行设计。
# 接口映射关系如下(实际情况不同则进行调整):
# in: eth0(内网用eth0接口)
# out: eth1, ppp+(外网用eth1接口,如果使用了PPP,对应接口也属于外网)
# dmz: eth2(dmz网络使用eth2)
# mng: eth3(管理网络使用eth3接口)

start() {

# 装载模板
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp

## filter table begin:

iptables -F

# 缺省策略设置为禁止一切数据:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# 对于本地loopback接口,不做限制:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 虽然分片包有存在的理由,但在当今的网络现状下,已经很少了。分片出现更多的是源于攻击,所以禁止分片包:
iptables -A INPUT -f -j DROP
iptables -A FORWARD -f -j DROP

# 允许网关可以访问任何地方,这种做法是值得商榷的。这里如此做是为了方便测试,实际情况还得细细琢磨。
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 针对各种网络数据流向定义相应的链:
iptables -N in-IN(处理从内网进入网关的数据)
iptables -N in-out-FOR(处理内网经过网关进入外网的数据)
iptables -N in-dmz-FOR(处理内网经过网关进入dmz的数据)
iptables -N in-mng-FOR(处理内网经过网关进入mng的数据)
iptables -N in-OUT(处理从网关进入内网的数据)

iptables -N out-IN(处理从外网进入网关的数据)
iptables -N out-in-FOR(处理外网经过网关进入内网的数据)
iptables -N out-dmz-FOR(处理外网经过网关进入dmz的数据)
iptables -N out-mng-FOR(处理外网经过网关进入mng的数据)
iptables -N out-OUT(处理从网关进入外网的数据)

iptables -N dmz-IN(处理从dmz进入网关的数据)
iptables -N dmz-in-FOR(处理dmz经过网关进入内网的数据)
iptables -N dmz-out-FOR(处理dmz经过网关进入外网的数据)
iptables -N dmz-mng-FOR(处理dmz经过网关进入mng的数据)
iptables -N dmz-OUT(处理从网关进入dmz的数据)

iptables -N mng-IN(处理从mng进入网关的数据)
iptables -N mng-in-FOR(处理mng经过网关进入内网的数据)
iptables -N mng-out-FOR(处理mng经过网关进入外网的数据)
iptables -N mng-dmz-FOR(处理mng经过网关进入dmz的数据)
iptables -N mng-OUT(处理从网关进入mng的数据)

# 根据如上说明,把数据定义到相应的链,以后就不用再关心具体的网络接口,可以更专注于功能上:
iptables -A INPUT -i eth0 -j in-IN
iptables -A FORWARD -i eth0 -o eth1 -j in-out-FOR
iptables -A FORWARD -i eth0 -o ppp+ -j in-out-FOR
iptables -A FORWARD -i eth0 -o eth2 -j in-dmz-FOR
iptables -A FORWARD -i eth0 -o eth3 -j in-mng-FOR
iptables -A OUTPUT -o eth0 -j in-OUT

iptables -A INPUT -i eth1 -j out-IN
iptables -A INPUT -i ppp+ -j out-IN
iptables -A FORWARD -i eth1 -o eth0 -j out-in-FOR
iptables -A FORWARD -i ppp+ -o eth0 -j out-in-FOR
iptables -A FORWARD -i eth1 -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i ppp+ -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i eth1 -o eth3 -j out-mng-FOR
iptables -A FORWARD -i ppp+ -o eth3 -j out-mng-FOR
iptables -A OUTPUT -o eth1 -j out-OUT
iptables -A OUTPUT -o ppp+ -j out-OUT

iptables -A INPUT -i eth2 -j dmz-IN
iptables -A FORWARD -i eth2 -o eth0 -j dmz-in-FOR
iptables -A FORWARD -i eth2 -o eth1 -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o ppp+ -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o eth3 -j dmz-mng-FOR
iptables -A OUTPUT -o eth2 -j dmz-OUT

iptables -A INPUT -i eth3 -j mng-IN
iptables -A FORWARD -i eth3 -o eth0 -j mng-in-FOR
iptables -A FORWARD -i eth3 -o eth1 -j mng-out-FOR
iptables -A FORWARD -i eth3 -o ppp+ -j mng-out-FOR
iptables -A FORWARD -i eth3 -o eth2 -j mng-dmz-FOR
iptables -A OUTPUT -o eth3 -j mng-OUT

# 从现在开始,就可以根据需要定义具体的规则。
# 比如,只允许使用ssh连接网关,而且只能在内网接口和mng接口,则如下定义:
# (相应的应答数据已经包含在前面:
# "iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT"
# 里了,所以这里没有再定义对应的in-OUT和mng-OUT。)
iptables -A in-IN -p tcp --dport ssh -m state --state NEW -j ACCEPT
iptables -A mng-IN -p tcp --dport ssh -m state --state NEW -j ACCEPT

# 除了外网,允许其余网络的机器给网关发ping数据包:
iptables -A in-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A dmz-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A mng-IN -p icmp --icmp-type echo-request -j ACCEPT

# in --> out
# 外网访问本地网络一般都是受限的,网关要阻止外网对内网的肆意访问,但对内网访问外网,外网返回的应答数据则要允许通过,相应的,内网与外网的正常数据流也要允许通过。
# 此外,一些关联(related)的连接也要允许。最明显的如ftp协议,在ftp的port模式下,外网服务器要通过自身ftp-data端口连接内网机器的某个端口进行数据传输,这就是外网对内网的related;在ftp的passive模式下,内网要连接外网某个临时端口进行数据传输,这就是内网对外网的related。
iptables -A out-in-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A in-out-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# 内网对外网的访问规则。这里提供几个典型应用的模板:
# ping
#iptables -A in-out-FOR -p icmp --icmp-type echo-request -j ACCEPT
# http(s)
#iptables -A in-out-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A in-out-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A in-out-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT

# in --> dmz
# 内网对DMZ网络的访问规则:
# enable dmz respond in
iptables -A dmz-in-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A in-dmz-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# enable in access dmz
#iptables -A in-dmz-FOR -m state --state NEW -j ACCEPT

# dmz <-- out
# 外网对DMZ网络的访问规则:
# enable dmz respond out
iptables -A dmz-out-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A out-dmz-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# enable out access dmz
# http(s)
#iptables -A out-dmz-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A out-dmz-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A out-dmz-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT

## filter table end.

# 以上部分只是filter部分的内容,如果有NAT方面的需求,则在下面接着定义。
## nat table begin:

#iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

#iptables -t nat -A PREROUTING -i eth1 -j DNAT --to dmz-machine

## nat table end.
}

resume_all() {

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

}

stop() {
## filter table begin:

iptables -F

# 删除所有定义的链:
iptables -X in-IN
iptables -X in-out-FOR
iptables -X in-dmz-FOR
iptables -X in-mng-FOR
iptables -X in-OUT

iptables -X out-IN
iptables -X out-in-FOR
iptables -X out-dmz-FOR
iptables -X out-mng-FOR
iptables -X out-OUT

iptables -X dmz-IN
iptables -X dmz-in-FOR
iptables -X dmz-out-FOR
iptables -X dmz-mng-FOR
iptables -X dmz-OUT

iptables -X mng-IN
iptables -X mng-in-FOR
iptables -X mng-out-FOR
iptables -X mng-dmz-FOR
iptables -X mng-OUT

## filter table end.
 
## nat table begin:

iptables -t nat -F

## nat table end.
}

case "$1" in
'start')
  start
  ;;
'stop')
  stop
  resume_all
  ;;
'restart')
  stop
  start
  ;;
*)
  echo "usage $0 start|stop|restart"
esac

示例:

允许内网机器访问外网的http(s)和ftp服务,在start()函数中取消如下规则的注释:

iptables -A in-out-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
iptables -A in-out-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
iptables -A in-out-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT

使用SNAT,把start()函数末尾的如下规则取消注释:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

使用DNAT,把start()函数末尾的如下规则取消注释,将其中的dmz-machine替换为实际的地址:

#iptables -t nat -A PREROUTING -i eth1 -j DNAT --to dmz-machine

 

3.3 rc.iptables-gate-ipsec.ref

该模板与前一模板区别在于启动ipsec后,会增加新的网络接口如ipsec0、ipsec1等,从而需要针对这些新接口制定规则。同时,ipsec需要开放UDP 500端口和ESP(50)协议。

模板说明(与rc.iptables-gate-novpn.ref相同的地方不再注释):

#!/bin/sh
# Start/stop/restart my iptables configuration for gate.
#

# interface summary:
#	in:	eth0
#	out:	eth1, ppp+
#	dmz:	eth2
#	mng:	eth3
#	vpn:	ipsec+(新增的网络接口)

start() {

# load modules
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp

## filter table begin:

iptables -F

# default policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# enable all lookback packets
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# disable all fragment packets
iptables -A INPUT -f -j DROP
iptables -A FORWARD -f -j DROP

# enable I access anywhere and response messages
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 开放UDP500端口和ESP(50):(这里可使用地址和端口加强安全性)
iptables -A INPUT -i eth1 -p udp -s xxx.xxx.xxx.xxx --sport 500 -d xxx.xxx.xxx.xxx --dport 500 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eth1 -p 50 -s xxx.xxx.xxx.xxx -d xxx.xxx.xxx.xxx -m state --state NEW -j ACCEPT

# 针对vpn增加了对应的链:
iptables -N in-IN
iptables -N in-out-FOR
iptables -N in-dmz-FOR
iptables -N in-mng-FOR
iptables -N in-vpn-FOR(新增)
iptables -N in-OUT

iptables -N out-IN
iptables -N out-in-FOR
iptables -N out-dmz-FOR
iptables -N out-mng-FOR
iptables -N out-vpn-FOR(新增)
iptables -N out-OUT

iptables -N dmz-IN
iptables -N dmz-in-FOR
iptables -N dmz-out-FOR
iptables -N dmz-mng-FOR
iptables -N dmz-vpn-FOR(新增)
iptables -N dmz-OUT

iptables -N mng-IN
iptables -N mng-in-FOR
iptables -N mng-out-FOR
iptables -N mng-dmz-FOR
iptables -N mng-vpn-FOR(新增)
iptables -N mng-OUT

iptables -N vpn-IN(新增)
iptables -N vpn-in-FOR(新增)
iptables -N vpn-out-FOR(新增)
iptables -N vpn-dmz-FOR(新增)
iptables -N vpn-mng-FOR(新增)
iptables -N vpn-OUT(新增)

# jump to new chains
iptables -A INPUT -i eth0 -j in-IN
iptables -A FORWARD -i eth0 -o eth1 -j in-out-FOR
iptables -A FORWARD -i eth0 -o ppp+ -j in-out-FOR
iptables -A FORWARD -i eth0 -o eth2 -j in-dmz-FOR
iptables -A FORWARD -i eth0 -o eth3 -j in-mng-FOR
iptables -A FORWARD -i eth0 -o ipsec+ -j in-vpn-FOR(新增)
iptables -A OUTPUT -o eth0 -j in-OUT

iptables -A INPUT -i eth1 -j out-IN
iptables -A INPUT -i ppp+ -j out-IN
iptables -A FORWARD -i eth1 -o eth0 -j out-in-FOR
iptables -A FORWARD -i ppp+ -o eth0 -j out-in-FOR
iptables -A FORWARD -i eth1 -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i ppp+ -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i eth1 -o eth3 -j out-mng-FOR
iptables -A FORWARD -i ppp+ -o eth3 -j out-mng-FOR
iptables -A FORWARD -i eth1 -o ipsec+ -j out-vpn-FOR(新增)
iptables -A FORWARD -i ppp+ -o ipsec+ -j out-vpn-FOR(新增)
iptables -A OUTPUT -o eth1 -j out-OUT
iptables -A OUTPUT -o ppp+ -j out-OUT

iptables -A INPUT -i eth2 -j dmz-IN
iptables -A FORWARD -i eth2 -o eth0 -j dmz-in-FOR
iptables -A FORWARD -i eth2 -o eth1 -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o ppp+ -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o eth3 -j dmz-mng-FOR
iptables -A FORWARD -i eth2 -o ipsec+ -j dmz-vpn-FOR(新增)
iptables -A OUTPUT -o eth2 -j dmz-OUT

iptables -A INPUT -i eth3 -j mng-IN
iptables -A FORWARD -i eth3 -o eth0 -j mng-in-FOR
iptables -A FORWARD -i eth3 -o eth1 -j mng-out-FOR
iptables -A FORWARD -i eth3 -o ppp+ -j mng-out-FOR
iptables -A FORWARD -i eth3 -o eth2 -j mng-dmz-FOR
iptables -A FORWARD -i eth3 -o ipsec+ -j mng-vpn-FOR(新增)
iptables -A OUTPUT -o eth3 -j mng-OUT

iptables -A INPUT -i ipsec+ -j vpn-IN(新增)
iptables -A FORWARD -i ipsec+ -o eth0 -j vpn-in-FOR(新增)
iptables -A FORWARD -i ipsec+ -o eth1 -j vpn-out-FOR(新增)
iptables -A FORWARD -i ipsec+ -o ppp+ -j vpn-out-FOR(新增)
iptables -A FORWARD -i ipsec+ -o eth2 -j vpn-dmz-FOR(新增)
iptables -A FORWARD -i ipsec+ -o eth3 -j vpn-mng-FOR(新增)
iptables -A OUTPUT -o ipsec+ -j vpn-OUT(新增)

# enable ssh for management in eth0,eth3
iptables -A in-IN -p tcp --dport ssh -m state --state NEW -j ACCEPT
iptables -A mng-IN -p tcp --dport ssh -m state --state NEW -j ACCEPT

# enalbe LAN ping me
iptables -A in-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A dmz-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A mng-IN -p icmp --icmp-type echo-request -j ACCEPT

# in --> out
# enable out respond in
iptables -A out-in-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A in-out-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# enable in access out
# ping
#iptables -A in-out-FOR -p icmp --icmp-type echo-request -j ACCEPT
# http(s)
#iptables -A in-out-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A in-out-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A in-out-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT

# in <--> vpn(新增)
# enable vpn and in respond each other
iptables -A vpn-in-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A in-vpn-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# enable in access vpn
# ping
#iptables -A in-vpn-FOR -p icmp --icmp-type echo-request -j ACCEPT
# http(s)
#iptables -A in-vpn-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A in-vpn-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A in-vpn-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT
# enable vpn access in
# ping
#iptables -A vpn-in-FOR -p icmp --icmp-type echo-request -j ACCEPT
# http(s)
#iptables -A vpn-in-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A vpn-in-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A vpn-in-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT

# in --> dmz
# enable dmz respond in
iptables -A dmz-in-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A in-dmz-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# enable in access dmz
#iptables -A in-dmz-FOR -m state --state NEW -j ACCEPT

# dmz <-- out
# enable dmz respond out
iptables -A dmz-out-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A out-dmz-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# enable out access dmz
# http(s)
#iptables -A out-dmz-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A out-dmz-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A out-dmz-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT

# dmz <-- vpn(新增)
# enable dmz respond vpn
iptables -A dmz-vpn-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A vpn-dmz-FOR -m state --state ESTABLISHED,RELATED -j ACCEPT
# enable vpn access dmz
# http(s)
#iptables -A vpn-dmz-FOR -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A vpn-dmz-FOR -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A vpn-dmz-FOR -p tcp --dport ftp -m state --state NEW -j ACCEPT

## filter table end.

## nat table begin:

#iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

#iptables -t nat -A PREROUTING -i eth1 -j DNAT --to dmz-machine

## nat table end.

}

resume_all() {

# enable all
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

}

stop() {

## filter table begin:

iptables -F

# remove all chains
iptables -X in-IN
iptables -X in-out-FOR
iptables -X in-dmz-FOR
iptables -X in-mng-FOR
iptables -X in-vpn-FOR
iptables -X in-OUT

iptables -X out-IN
iptables -X out-in-FOR
iptables -X out-dmz-FOR
iptables -X out-mng-FOR
iptables -X out-vpn-FOR
iptables -X out-OUT

iptables -X dmz-IN
iptables -X dmz-in-FOR
iptables -X dmz-out-FOR
iptables -X dmz-mng-FOR
iptables -X dmz-vpn-FOR
iptables -X dmz-OUT

iptables -X mng-IN
iptables -X mng-in-FOR
iptables -X mng-out-FOR
iptables -X mng-dmz-FOR
iptables -X mng-vpn-FOR
iptables -X mng-OUT

iptables -X vpn-IN
iptables -X vpn-in-FOR
iptables -X vpn-out-FOR
iptables -X vpn-dmz-FOR
iptables -X vpn-mng-FOR
iptables -X vpn-OUT

## filter table end.

## nat table begin:

iptables -t nat -F

## nat table end.

}


case "$1" in
'start')
	start
	;;
'stop')
	stop
	resume_all
	;;
'restart')
	stop
	start
	;;
*)
	echo "usage $0 start|stop|restart"
esac

 

3.4 rc.iptables-gate-openvpn.ref

该模板与之前的ipsec很类似,因为两者都是vpn的一种实现。主要的区别是接口的名称和相应的规则。此外,与对等的ipsec不同,openvpn采用的是client/server架构,所以server端和client端的配置有细小差异。

模板不再详细说明,只列出与ipsec的差异。

接口变化:

为此需要增加模块装载:

/sbin/modprobe tun

openvpn server需要打开udp端口1194(client不需要第1条规则):

# enable openvpn in (1st is only for server)
#iptables -A INPUT -i eth1 -p udp --dport 1194 -m state --state NEW -j ACCEPT
iptables -A INPUT -i tun+ -m state --state NEW -j ACCEPT

由于接口名称的变化,一些链的规则也相应进行改变,如:

iptables -A FORWARD -i eth0 -o tun+ -j in-vpn-FOR

即将原来ipsec的地方改为tun。

 

3.5 rc.iptables-server.ref

#!/bin/sh
# Start/stop/restart my iptables configuration for server.
#

start() {

# load modules
/sbin/modprobe ip_conntrack_ftp

iptables -F

# 缺省策略设置为禁止一切数据:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# 对于本地loopback接口,不做限制:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 虽然分片包有存在的理由,但在当今的网络现状下,已经很少了。分片出现更多的是源于攻击,所以禁止分片包:
iptables -A INPUT -f -j DROP

# 允许正常的应答和关联(related)数据流:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 作为服务器,提供的服务依次在下面定义:
# ping
#iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# ssh
#iptables -A INPUT -p tcp --dport ssh -m state --state NEW -j ACCEPT
# http(s)
#iptables -A INPUT -p tcp --dport http -m state --state NEW -j ACCEPT
#iptables -A INPUT -p tcp --dport https -m state --state NEW -j ACCEPT
# ftp
#iptables -A INPUT -p tcp --dport ftp -m state --state NEW -j ACCEPT

# other

}

resume_all() {

# enable all
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

}

stop() {

iptables -F

}

case "$1" in
'start')
  start
  ;;
'stop')
  stop
  resume_all
  ;;
'restart')
  stop
  start
  ;;
*)
  echo "usage $0 start|stop|restart"
esac

 

3.6 rc.ip6tables.ref

当前的ipv6配置仅仅是禁止所有流量:

#!/bin/sh
# Start/stop/restart my ip6tables configuration.
#

start() {

ip6tables -F

# default policy
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

}

resume_all() {

# enable all
ip6tables -P INPUT ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT

}

stop() {

ip6tables -F

}


case "$1" in
'start')
	start
	;;
'stop')
	stop
	resume_all
	;;
'restart')
	stop
	start
	;;
*)
	echo "usage $0 start|stop|restart"
esac