5.2. 防火墙

5.2.1. iptables的使用

链操作:
    -N: new,创建新的链
    -X: delete,删除一个链
    -F: flush,清空一个链
    -P: policy,策略
    -E: rename,重名

规则操作:
    -A: append,追加一条规则
    -I: insert,插入一天规则
    -D: delete, 删除一条规则
    -R: replace,替换一条规则
    -Z: zero,清空计数器

匹配规则:
    基本匹配:
        -s: src,匹配源地址
        -d: dst,匹配目标地址
        -i: 指定数据包的流入接口
        -o: 指定数据的流出接口

    扩展匹配:
        tcp:
            -p: protocol,指定协议
            --sports: 源端口
            --dports:  目标端口
            --tcp-flags: 标记
            --sync:     只允许新连接
        udp:
            --sports: 源端口
            --dports:  目标端口
        icmp:
            --icmp-type: 8ping出去,0代表进入

    显式扩展:
        -m state:
            NEW: 新连接
            ESTABLISHED:对一个权限的请求进行回应
            RELATED: 两个完整连接之间的相互关系
            INVALID: 无法识别的状态连接
            UNTRACKED: 未追踪的连接

        -m multiport:
            --sports: 22,80,443 指定多个端口
            --dports: 指定多个端口
            --ports: 指定端口,不限定是入和出的端口

        -m iprange:
            --src-range: 源地址范围
            --dst-range: 目标地址范围

        -m connlimit:
            --connlimit-upto n: 限定并发连接数的上限
            --connlimit-above n: 限定并发连接数的下限

        -m limit:
            --limit: 限制速率
            --limit-burst: 突发速率限定

        -m string:
            --algo bm|kmp: 指定算法
            ! --string pattern : 给定要检查的字符串模式

        -m time:
            --datestart YYYY[-MM-DD][Thh:mm:ss]: 起始日期时间
            --datestop YYYY[-MM-DD][Thh:mm:ss]: 结束日期时间
            --timestart hh:mm:ss 起始时间
            --timestop   hh:mm:ss 结束时间
            ! --monthdays: 匹配一个月中的那些天
            ! --weekdays: 匹配一周中的那些天

处理动作:
    --j TARGET 其中TARGET有下面几个值
    ACCEPT  接受
    DROP    丢弃
    REJECT  拒绝
    SNAT    源地址转化
    DNAT    目标地址转换
    REDIRECT 重定向
    LOG  日志

5.2.2. 样例

查看所有链

[root@centos-150 ~]#
[root@centos-150 ~]#  iptables -nL --line-number

查看特定表

[root@centos-150 ~]# iptables -nL -t nat

修改默认规则

[root@centos-150 ~]# iptables -t filter -P FORWARD DROP

放行特定ip特定端口访问

[root@centos-150 ~]# iptables -A INPUT -s 0/0 -d 192.168.46.1 -p tcp --dport 21 -j ACCEPT
[root@centos-150 ~]# iptables -A OUTPUT -s 192.168.46.1 -d 0/0 -p tcp --sport 21 -j ACCEPT

只能本机ping别人,限制别人ping

[root@centos-150 ~]# iptables -A OUTPUT -p icmp --icmp-type 8 -s 192.168.168.150 -j ACCEPT
[root@centos-150 ~]# iptables -A INPUT -p icmp --icmp-type 0 -s 0/0 -j ACCEPT

禁止访问包含有“old”字符的页面

[root@centos-150 ~]# iptables -I OUTPUT  -s 192.168.46.7 -d 0/0  -p tcp --sport 80  -m string --algo kmp --string "old"   -j DROP

时间限定

[root@centos-150 ~]# iptables -A INPUT -d 192.168.46.7 -p tcp --dport 23 -m iprange --src-range 172.18.46.1-172.18.46.100 \
-m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5 -j ACCEPT

允许23端口同一个客户端小于3个并发连接

[root@centos-150 ~]# iptables -A INPUT -s 0/0 -d 192.168.46.7 -p tcp --dport 23 -m connlimit ! --connlimit-above 3 -j ACCEPT

允许22,23,80端口访问

[root@centos-150 ~]# iptables -A INPUT -s 192.168.46.0/24 -d 192.168.46.7 -p tcp -m multiport --dports 22,23,80 \
 -m state --state NEW,ESTABLISHED -j ACCEPT

允许ftp访问

[root@centos-150 ~]# modprobe  nf_conntrack_ftp
[root@centos-150 ~]# iptables -A INPUT -d 192.168.46.7 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

每个访问规则添加日志记录

[root@centos-150 ~]# iptables -I FORWARD 2 -s 10.0.0.0/24 -p tcp -m multiport --dports 80,21,22,23 \
-m state --state NEW -j LOG --log-prefix "new conn:"

5.2.3. 防火墙案例

5.2.3.1. SNAT案例

要求如下:

  1. 时间控制: 在1,3,5上午09:00到12:00 ,下午2:00到16:00不能访问,其他时间都可以访问

  2. 网址限制: 限制huya.com视频播放和douyu.com视频播放

  3. 特例控制: 对于192.168.46.1-192.168.46.4 这些ip不能有任何限制

  4. snat服务: 要给局域网内部的机器提供nat功能。

详细部署图:

../_images/snat.png
# 各个主机的网关配置为防火墙的网关为192.168.46.151。
# 启动防火墙的路由功能
[root@centos-151 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@centos-151 ~]# sysctl  -p
[root@centos-151 ~]# cat /proc/sys/net/ipv4/ip_forward
1
# 给局域网主机启用snat服务,这里不要质疑我的为何外网ip是172的。 我这个请求还要被172.18.0.1这个防火墙snat的。

[root@centos-151 ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -m iprange --src-range 192.168.46.1-192.168.46.4 -j ACCEPT
-A FORWARD -s 192.168.46.0/24 -m string --string "huya.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 192.168.46.0/24 -m string --string "douyu.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -m time --timestart 01:00:00 --timestop 04:00:00 --weekdays Mon,Wed,Fri --datestop 2038-01-19T03:14:07 -j ACCEPT
-A FORWARD -m time --timestart 06:00:00 --timestop 10:00:00 --weekdays Mon,Wed,Fri --datestop 2038-01-19T03:14:07 -j ACCEPT
-A FORWARD -s 192.168.46.0/24 -j REJECT --reject-with icmp-port-unreachable

5.2.3.2. DNAT案例

5.2.4. firewalld-cmd的使用

firewalld是centos7新推出的管理netfilter的工具。

5.2.4.1. firewalld-cmd基本的使用

# 查看预定义的服务列表
[root@centos-151 ~]# firewall-cmd --get-default-zone
FirewallD is not running
[root@centos-151 ~]# systemctl start firewalld
[root@centos-151 ~]# firewall-cmd --get-default-zone
public

# 查看预定义的服务配置项
[root@centos-151 ~]# cat /usr/lib/firewalld/services/http.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/>
</service>

# 列出所有的可用区域
[root@centos-151 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

# 查询默认的区域
[root@centos-151 ~]# firewall-cmd --get-default-zone
public

# 设置默认区域
[root@centos-151 ~]# firewall-cmd --set-default-zone=dmz
success

# 列出正在使用的区域
[root@centos-151 ~]# firewall-cmd --get-active-zones
dmz
interfaces: ens33 ens37
# 添加源地址的浏览到特定区域
[root@centos-151 ~]# firewall-cmd --add-source=192.168.46.1 --zone public
success

# 移除特定源地址的流量
[root@centos-151 ~]# firewall-cmd --remove-source=192.168.46.1 --zone public
success

# 添加来自于特定接口的流量到特定区域
[root@centos-151 ~]# firewall-cmd --add-interface=ens33 --zone=dmz
The interface is under control of NetworkManager, setting zone to 'dmz'.
success

# 改变指定接口到新区域
[root@centos-151 ~]# firewall-cmd --change-interface=ens33 --zone=public
The interface is under control of NetworkManager, setting zone to 'public'.
success

# 允许服务流量通过
[root@centos-151 ~]# firewall-cmd --add-service=http
success


# 允许特定端口和协议的流量
[root@centos-151 ~]# firewall-cmd --add-port=8080/tcp
success
# 移除特定服务
[root@centos-151 ~]# firewall-cmd --remove-service=http
success

# 移除特定端口
[root@centos-151 ~]# firewall-cmd --remove-port=8080/tcp
success

# 重新加载配置项
[root@centos-151 ~]# firewall-cmd --reload
success

# 查看开放的服务
[root@centos-151 ~]# firewall-cmd --list-services
ssh

# 查看开放的端口
[root@centos-151 ~]# firewall-cmd --list-ports

# 列出指定区域的所有配置信息

[root@centos-151 ~]# firewall-cmd --list-all
dmz (active)
target: default
icmp-block-inversion: no
interfaces: ens37
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

5.2.4.2. firewalld-cmd rich规则的使用

# 获取rich规则的帮助
[root@centos-151 ~]# man 5 firewalld.richlanguage
[root@centos-151 ~]# firewall-cmd --permanent --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject '
success

# 拒绝从192.168.0.11的所有流量
[root@centos-151 ~]# firewall-cmd --permanent --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject '
success

# 限制每分钟只有2个连接到ftp服务
[root@centos-151 ~]# firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ftp" limit value=2/m accept '
success

# 抛弃esp协议的所有数据包
[root@centos-151 ~]# firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'
success

# 接受所有192.168.1.0/24子网端口范围7900-7905的tcp流量



# 接受ssh新连接,记录日志到syslogde notice级别,每分钟最多接受3条信息
[root@centos-151 ~]# firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh"  log prefix="ssh " level="notice" limit value="3/m" accept '
success

# 从192.168.45.0/24子网的dns连接在5分钟内被拒绝, 并记录日志到audit,每小时最大记录一条信息。
[root@centos-151 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="192.168.45.0/24" service name="dns" audit limit value="1/h" reject '
success

# 检查是否允许伪装,并开启伪装
[root@centos-151 ~]# firewall-cmd --query-masquerade
no
[root@centos-151 ~]# firewall-cmd --add-masquerade
success
[root@centos-151 ~]# firewall-cmd --query-masquerade
yes

# 为内网提供snat 功能
[root@centos-151 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="192.168.0.0/24"  masquerade '
success

# 转发传入连接9527/tcp到防火墙的80/tcp到public zone 的192.168.0.254去

[root@centos-151 ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=9527:proto=tcp:toport=80:toadd=192.168.0.254
success

5.2.5. 更多练习

iptalbes练习