之前配置 openSUSE 的时候,发现大变色龙(雾)的 iptables 配置和别的发行版不大一样。

它是通过一个名为 SuSEfirewall2 的工具来实现对 iptables 规则的配置,虽然一开始无从下手,但这个工具还是比较好用的,我就在这里介绍一下。

SuSEfirewall2 简介

SuSEfirewall2 实际上是一个脚本,它会根据 /etc/sysconfig/SuSEfirewall2 这个配置文件写入 iptables 规则。同时他也是系统中的一个服务,可以服务启动的时候自动根据配置文件设定 iptables 规则。SuSEfirewall2 的配置可以在 YaST 中完成,但 Firewall 模块中只提供了基本的设置,更多的高级设置可以通过 /etc/sysconfig Editor 模块或者是 /etc/sysconfig/SuSEfirewall2 这个配置文件来设定。

SuSEfirewall2 的基本命令

  • 启动

    1
    
    $SuSEfirewall2 start
    
  • 关闭

    1
    
    $SuSEfirewall2 stop
    
  • 查看防火墙运行状态(实际上是输出运行 iptables -nvL 的结果)

    1
    
    $SuSEfirewall2 status
    
  • 开机自动启动

    1
    
    $chkconfig SuSEfirewall2_init on
    
  • 配置 SuSEfirewall2 的方法

    1
    
    $vim /etc/sysconfig/SuSEfirewall2
    
  • YaST 和 SuSEfirewall2 的关系

    YaST 提供了 SuSEfirewall2 的简单接口,在 YaST 里面修改,其实也是在修改 SuSEfirewall2 的配置文件,如果手动修改配置文件,也可以被 YaST 读入识别

配置样例

/etc/sysconfig/SuSEfirewall2 文件中,我们通过定义变量的值来进行配置:

1
FW_VARIABLE="value1 value2 value3,with,more,parameters"

防火墙区域

SuSEfirewall2 默认定义了三个不同的 Zone:

  • EXT/External Zone (不信任的,比如 Internet)
  • INT/Interanl Zone (完全信任的, 没有过滤, 比如家庭网络,LAN)
  • DMZ/Demilitarized Zone (在防火墙后的服务器, 比如 Apache 需要被外部 Internet 访问)

我们可以把 interface 添加到不同的区域来执行不同的防火墙策略,对应的选项为配置文件中的 FW_DEV_zone 选项。External Zone 一般都是外部地址,有公网 ip。SuSEfirewall2 对于 External Zone 的策略是默认过滤,在 Interanl Zone 中要访问外网,需要在防火墙上做一个 SNAT/MASQUERADE。Interanl Zone 和 Demilitarized Zone 均为内部地址,默认均不进行过滤。前一个我们容易理解,后一个直接翻译过来是“非军事化区”,它大概相当于防火墙后的一台服务器,不与外网直接连接。如果外网用户要连接到 Demilitarized Zone,那么请求先到防火墙,然后在防火墙上做一个 DNAT,把目的地址替换为 Demilitarized Zone 的内部 ip 地址,再发到 Demilitarized Zone 中的服务器。

例子:

1
2
3
FW_DEV_EXT="dsl0"
FW_DEV_EXT="any wlan0"
FW_DEV_INT="eth0 wlan1"

允许访问服务

所有的防火墙区域都能允许四种服务:

  • TCP - FW_SERVICES_EXT_TCP, FW_SERVICES_INT_TCP, FW_SERVICES_DMZ_TCP
  • UDP - FW_SERVICES_EXT_UDP, FW_SERVICES_INT_UDP, FW_SERVICES_DMZ_UDP
  • RPC - FW_SERVICES_EXT_RPC, FW_SERVICES_INT_RPC, FW_SERVICES_DMZ_RPC
  • IP - FW_SERVICES_EXT_IP, FW_SERVICES_INT_IP, FW_SERVICES_DMZ_IP

TCP 和 UDP 服务可以通过填写端口号或者端口名(可以在 /etc/services 中查看)来开放,另外你可以用 {port}:{port} 的形式来开放一个端口段,例如:

1
2
3
FW_SERVICES_EXT_TCP="ssh"
FW_SERVICES_EXT_TCP="ftp 22 telnet 512:514"
FW_SERVICES_EXT_UDP="631 400:405"

更多访问限制

上面提到的访问限制配置是比较简单粗暴的,它只规定了该服务能或不能被访问,而没有更多的访问限制策略,比如针对网段的限制等。其实 SuSEfirewall2 提供了这个功能,我们可以使用如下选项:

  • FW_SERVICES_ACCEPT_EXT, FW_SERVICES_ACCEPT_INT, FW_SERVICES_ACCEPT_DMZ

针对每一个服务规则,这些选项提供了4个参数,可以为 ip 地址或其他的关键词,也可以称为 flags。格式为以空格分隔的 net,protocol[,dport[,sport[,flags]]],例如:

1
2
FW_SERVICES_ACCEPT_EXT="0.0.0.0/0,tcp,22"
# This 0.0.0.0/0 restricts access via IPv4 only

支持以下 flags:

  • hitcount=NUMBER : ipt_recent –hitcount parameter
  • blockseconds=NUMBER : ipt_recent –seconds parameter
  • recentname=NAME : ipt_recent –name parameter

例子:

1
2
3
# Allow max three ssh connects per minute from the same IP address somewhere in the Internet:
FW_SERVICES_ACCEPT_EXT="0/0,tcp,22,,hitcount=3,blockseconds=60,recentname=ssh"
# This 0/0 allows access via both IPv4 and IPv6

地址伪装

允许内部区域完整访问外网,包括 INT 和 DMZ,例如:

1
FW_MASQ_NETS="10.1.1.0/24 192.168.1.0/24"

IPv6

Internet Protocol version 6 (IPv6) 在配置文件中有如下选项:

  • IPv6 支持 - FW_IPv6 (yes/no)
  • IPv6 连出配置 - FW_IPv6_REJECT_OUTGOING ([yes]/no/drop)

例子:

1
2
FW_IPv6=""
FW_IPv6_REJECT_OUTGOING="no"