Iptables脚本
该脚本用来设置Linux防火墙netfilter,通过调用iptables命令进行配置。
本文内容基于Slackware Linux。
1 rc.iptables系列模板
不同角色的机器需要不同的防火墙设置,为此提供一系列的iptables脚本模板。根据具体环境选择模板,再按实际情况进行更改调整。目前有这么些模板:
- 客户机模板:rc.iptables-client.ref,新版本
- 网关模板(不含vpn):rc.iptables-gate-novpn.ref,新版本
- 网关模板(包含ipsec):rc.iptables-gate-ipsec.ref
- 网关模板(包含openvpn):rc.iptables-gate-openvpn.ref
- 服务器模板:rc.iptables-server.ref,新版本
- Ipv6配置模板:rc.ip6tables.ref
各个模板的详细说明见后。
新版本脚本借鉴了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.ref、rc.iptables-gate-novpn.ref、rc.iptables-gate-ipsec.ref、rc.iptables-gate-openvpn.ref、rc.iptables-server.ref、rc.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的差异。
接口变化:
- ipsec+ --> tun+
为此需要增加模块装载:
/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