分类: FreeBSD

  • ipfw 简单介绍

    FreeBSD 下首选的防火墙无疑是 ipfw ,在官方的文档中有这么一段关于启用 ipfw 的说明:

    IPFW 是基本的 FreeBSD 安装的一部分, 以单独的可加载内核模块的形式提供。 如果在 rc.conf 中加入 firewall_enable=”YES” 语句, 就会自动地加载对应的内核模块。 除非您打算使用由它提供的 NAT 功能, 一般情况下并不需要把 IPFW 编进 FreeBSD 的内核。

    启用

    那么在 /etc/rc.conf 中加入以下配置则代表启用防火墙,使用 service ipfw start 启动:

    注意:如果在线上直接启用的话很可能一不小心导致无法再连接,因为默认就是禁止所有连接,所以最好在本地或者虚拟机里先测试熟悉

    
    firewall_enable="YES"
    firewall_type="/etc/ipfw.conf"
    #firewall_script="/etc/ipfw.rules"
    

    其中 firewall_type 可以指定多种类型的值,如:

    
    open ── 允许所有流量通过。
    client ── 只保护本机。
    simple ── 保护整个网络。
    closed ── 完全禁止除回环设备之外的全部 IP 流量。
    UNKNOWN ── 禁止加载防火墙规则。
    filename ── 到防火墙规则文件的绝对路径。
    
    

    上面示例指定/etc/ipfw.conf文件来作为规则

    firewall_script 代表使用脚本来添加规则,区别是脚本可以执行命令,变量等组合规则,更加灵活(需要使用 ipfw add.. 来添加规则)

    firewall_type 指定的规则文件则纯粹存放规则,一行一个,比较简单直观

    修改规则后可以使用 service ipfw restart 生效

    规则示例

    注意:优先级是从上到下,一旦匹配到规则,则后面的规则都不再匹配。

    
    #拒绝任何 IP 192.168.56.2 到本机的请求
    #注意这里 10000 的这个数字是必须指定的一个规则编号,范围 1-65535,详情见手册
    add 10000 deny ip from 192.168.56.1 to me
    
    #允许任何请求
    #因为默认是禁止任何请求的,若上面的规则没匹配到,则后面仍会禁止请求,所以要允许一下没有匹配到规则的请求
    #具体是否要此条规则根据白名单形式还是黑名单形式而定
    add 20000 allow all from any to any
    
    #允许本机 UDP 协议使用 53 端口向外发出的请求(UDP 53 端口一般是 DNS 解析请求)
    add allow udp from me to any 53 out
    
    #同上,区别是允许解析结果返回到本机
    add allow udp from any 53 to me in
    
    #DHCP
    ipfw add allow udp from me 68 to any 67 out
    ipfw add allow udp from any 67 to me 68 in
    # ipfw add allow udp from any 68 to 255.255.255.255 67 out
    # ipfw add allow udp from any 67 to 255.255.255.255 68 in
    
    #允许本机对外部的主机运行ping命令,并得到相应的应答
    ipfw add allow icmp from me to any icmptypes 8 out
    ipfw add allow icmp from any to me icmptypes 0 in
    
    #允许别人ping我
    ipfw add allow icmp from any to me icmptype 8 in
    ipfw add allow icmp from me to nay icmptype 0 out
    
    #允许我运行traceroute命令
    ipfw add allow icmp from any to any icmptypes 11 in
    
    #允许SSH等各种端口的服务
    ipfw add allow tcp from any to me 21,22,80,3306 in
    ipfw add allow tcp from me 22 to any out
    
    

    注意:很多示例中没有编号,最好加上。

    其它

    可使用 ipfw -q -f flush 清除 ipfw 命令动态添加的规则

    参考文档:官方手册FreeBSD 自带防火墙 ipfw 简单介绍

  • FreeBSD定期创建快照

    1、安装sysutils/freebsd-snapshot

    
    portmaster sysutils/freebsd-snapshot
    
    

    2、配置cron

    
    sudo crontab -e
    
    

    添加

    
    # /etc/crontab
    0 * * * * root /usr/local/sbin/periodic-snapshot hourly
    0 0 * * * root /usr/local/sbin/periodic-snapshot daily
    0 0 * * 0 root /usr/local/sbin/periodic-snapshot weekly
    
    

    编辑/etc/periodic.conf

    sudo vim /etc/periodic.conf
    

    添加

    snapshot_enable="YES"
    snapshot_schedule="/home:2:10:0"
    

    上述snapshot_schedule变量值必须符合以下语法:

    <schedule>
    ::= <entry>*
    <entry>
    ::= <fs> (", <fs>)* : <spec>
    <fs>
    ::= /^.*$/
    <spec>
    ::= <gen_weekly> : <gen_daily> : <gen_hourly> <gen_weekly> 
    ::= <generation>
    <gen_daily>
    ::= <generation> <gen_hourly> 
    ::= <generation> ("@ <hour> (", <hour>)*)? <generation> 
    ::= /^[0-9]+$/
    <hour>
    ::= /^(0?[0-9]|1[0-9]|2[0-3])$/
    
  • 使用fail2ban加固服务器

    Fail2Ban 是一个应用程序,它会在太多的失败登录尝试后禁止 IP 地址登录到你的服务器。由于合法登录通常不会超过三次尝试(如果使用 SSH 密钥,那不会超过一个),因此如果服务器充满了登录失败的请求那就表示有恶意访问。

    Fail2Ban 可以监视各种协议,包括 SSH、HTTP 和 SMTP。默认情况下,Fail2Ban 仅监视 SSH,并且因为 SSH 守护程序通常配置为持续运行并监听来自任何远程 IP 地址的连接,所以对于任何服务器都是一种安全威慑。

    安装Fail2Ban

    CentOS 7

    1、确保你的系统已经安装所有的更新:

    yum update

    2、启用 EPEL 更新源:

    
    wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    rpm -ivh epel-release-latest-7.noarch.rpm
    
    

    3、安装Fail2Ban

    yum install fail2ban

    4、启动Fail2Ban

    systemctl start fail2ban
    systemctl enable fail2ban
    

    Debian

    1、确保你的系统已经安装所有的更新:

    apt-get update
    apt-get upgrade -y
    

    2、安装Fail2Ban

    apt-get install fail2ban

    FreeBSD

    1、确保你的系统ports更新到最新:

    portsnap fetch
    portsnap update
    

    2、安装Fail2Ban

    portmaster security/py-fail2ban

     

     

  • FreeBSD 11发布

    FreeBSD项目正式发布了11分支的第一个稳定版本。

    主要新特性包括:

    • OpenSSH默认禁用DSA密钥生成,移除 Protocol 1支持;
    • OpenSSH更新到7.2p2;
    • 无线支持IEEE 802.11n;
    • 支持AArch64 (arm64) 架构;
    • 从NetBSD项目移植了libblacklist(3)库和应用;
    • 其它包括性能改进和支持更多无线芯片组等等。

    转载自Solidot

  • portmaster使用介绍

    portmaster是一个用来升级ports的工具,它并不依赖于其他的数据库去追踪你已经安装的软件,而仅仅利用现有的ports架构,比如是/var/db/pkg

    portmaster的特点是通过port的依赖追踪而保持你的port随时更新到最新,这能够允许你去安全的更新某一特定的port而不必不得不更新基于这个port的其他软件,当然,在极少的情况下,你有重新编译那些依赖于你更新port的软件的需求,因此你可以用-r选项来完成。

    portmaster默认更新那些你在命令中指定的port,portmaster会去查询是否存在软件的最新版本,然后通过make config命令遍历指定的port和它所依赖port的编译选项,假如你从来没有安装过port或者更改了编译选项,将会有编译选项窗口来提示选择编译选项,当然,如果你想要默认提示所有的选项,可以使用—force-dialog选项

    当portmaster在遍历port的依赖关系的时候,假如你没有使用—packages*选项,portmaster会在后台默认启动一个make checksum进程去检查和验证已经下载和软件包,如果你在此时按了ctrl+c,会默认终止这个检查

    下面介绍一些常用的选项:

    
    --force-config //为所有的ports执行make config,会覆盖-G选项
    -G //阻止make config,也就是使用默认选项
    -B //不为已经安装的ports做备份
    -b //为已经安装的ports做备份
    --update-if-newer //当软件已经是最新了,就不再重新安装,只在命令行后跟软件包才执行
    -P //使用package来安装,假如没有合适的package,也可以用ports替换
    -PP //只使用package安装,假如没有合适的,就放弃安装或者升级
    -a //检查所有的ports,假如有必要就执行升级
    -l //根据ports的分类列出所以已经安装的port
    --index //只使用INDEX-[7-9]去检查port是否已经是最新了
    --no-confirm //在将要执行升级或者安装之前,不询问用户,直接执行
    --package-build //使用package来安装编译过程的一些依赖
    --delete-build-only //当一个port安装完之后,删除只在编译过程中使用依赖ports
    

    举个例子:假如我想更新或者新安装nginx,然后使用package安装编译过去依赖的包,并且在编译完成之后删除它们

    portmaster --packages-build delete-build nginx
    

    假如我要更新所有的包

    
    
  • ZFS文件系统介绍 – 快照和克隆

    快照是文件系统或卷的只读副本,而克隆是可读写的卷或文件系统,克隆只能从快照创建。

    ZFS快照

    创建快照几乎没有任何成本,可以即时创建完成,而且快照创建的最初几乎不占用额外的存储池空间,ZFS采用COW策略,快照会与原始文件系统共享快照创建后一直没有变化的存储块。无法直接访问卷的快照,但是可以对它们执行克隆、备份、回滚等操作

    创建ZFS快照

    使用zfs snapshot filesystem@snapname,快照名称由两部分组成,@前面为文件系统名称,@后面为快照标识,二者组成完成的快照名

    # zfs snapshot reservoir/data@thursday

    查看ZFS快照

    
    # zfs list -t snapshot
    NAME USED AVAIL REFER MOUNTPOINT
    reservoir/data@thursday 0 – 30K –
    
    

    使用-r选项为所有后代文件系统递归创建快照

    # zfs snapshot reservoir/data@thursday

    销毁ZFS快照

    使用zfs destroy filesystem@snapname销毁ZFS快照

    # zfs destroy reservoir/data@thursday

    如果数据集(dataset)存在快照,则不能销毁该数据集。也可指定-r选项一起销毁快照和数据集。

    重命名ZFS快照

    可以重命名快照,但是不能跨越池和数据集对它们进行重命名。

    # zfs rename reservoir/data@thursday reservoir/data@thursday1

    可以使用更快捷的方式重命名快照

    # zfs rename reservoir/data@thursday thursday1

    回滚ZFS快照

    可以使用 zfs rollback 命令放弃自特定快照创建以来对文件系统所做的全部更改。文件系统恢复到创建快照时的状态。缺省情况下,该命令无法回滚到除最新快照以外的快照。
    要回滚到早期快照,必须销毁所有的中间快照。可以通过指定 -r 选项销毁早期的快照。如果存在任何中间快照的克隆,则还必须指定 -R 选项以销毁克隆。

    # zfs rollback reservoir/data@thursday

    则自此快照之后文件系统的任何改变都会被丢弃。

    ZFS快照差异比较

    可以使用 zfs diff 命令来比较两个ZFS快照之间的差异。

    比如下面的例子

    
    # cd /reservoir/data/
    
    # touch file1
    
    # zfs snapshot reservoir/data@snap1
    
    # touch file2
    
    # zfs diff reservoir/data@snap1 reservoir/data@snap2
    
    M /reservoir/data/
    
    + /reservoir/data/file2
    
    

    M表示目录被修改过了,+表示文件/reservoir/data/file2存在与更新的快照中zfs diff 命令输出符号的含义见下表

    
    文件或目录更改 标识符
    
    ————————————————– ——
    
    文件或目录已被修改,或文件或目录链接已更改 M
    
    文件或目录出现在较旧的快照中,但未出现在较新的快照中 –
    
    文件或目录出现在较新的快照中,但未出现在较旧的快照中 +
    
    文件或目录已重命名 R
    
    

    ZFS克隆

    克隆是可写入的卷或文件系统,其初始内容与从中创建它的数据集的内容相同。与快照一样,创建克隆几乎是即时的,而且最初不占用其他磁盘空间。此外,还可以创建克隆的快照。克隆只能从快照创建。克隆快照时,会在克隆和快照之间建立隐式相关性。即使克隆是在文件系统分层结构中的其他位置创建的,但只要克隆存在,就无法销毁原始快照。

    创建ZFS克隆

    使用 zfs clone 命令创建克隆,指定从中创建克隆的快照以及新文件系统或卷的名称。新文件系统或卷可以位于ZFS文件系统分层结构中的任意位置。新数据集与从其中创建克隆的快照属同一类型(例如文件系统或卷)。不能在原始文件系统快照所在池以外的池中创建该文件系统的克隆,亦即克隆是不能跨越存储池的。

    # zfs clone reservoir/data@snap2 reservoir/clone_snap2

    销毁ZFS克隆

    # zfs destroy reservoir/clone_snap2

    必须先销毁克隆,才能销毁父快照。

    发送和接收ZFS快照流

    通过使用zfs send命令,可以将 ZFS 文件系统或卷的快照转换为快照流。然后可以通过zfs receive命令使用快照流重新创建 ZFS 文件系统或卷。

    可以生成两种快照流:

    完整流 – 包含从创建数据集时开始到指定的快照为止的所有数据集内容。zfs send 命令生成的缺省流是完整流。它包含一个文件系统或卷,直到并包括指定的快照。流不会包含在命令行上指定的快照之外的快照。

    增量流 – 包含一个快照与另一个快照之间的差异。

    使用 zfs send 命令来发送快照流,并在同一系统的另一个池中或用于存储备份数据的不同系统上的另一个池中接收快照流。

    例如

    # zfs send reservoir/data@snap1 | zfs receive reservoir/data_received

    这样通过send和receive发送和接收快照流生成一个新的ZFS文件系统reservoir/data_snap_stream

    使用 zfs send -i 选项可以发送增量数据。

    例如:

    # zfs send -i reservoir/data@snap1 reservoir/data@snap2 | zfs receive reservoir/data_received

    这里snap1是较早的快照,snap2是较晚的快照,而且reservoir/data_received必须已经存在而且已经接收了snap1快照流,增量接收才能成功。

    可以通过SSH将快照流发送到远程系统

    # zfs send reservoir/data@snap1 | ssh remote_system zfs receive reservoir/data_received

    还可以将快照流压缩归档保存

    # zfs send reservoir/data@snap1 | gzip > data.gz

    然后可以接收压缩归档的快照流

    # zfs gunzip -c data.gz | zfs receive reservoir/data_recv

    可以将发送接收ZFS快照流以及其增量机制作为备份ZFS文件系统的一种策略,但这种备份方式不能逐个恢复文件,必须恢复整个文件系统。