Linux防火墙之iptables

  iptables是低版本的CentOS中用于防火墙管理的工具(当然在Ubuntu系中也时常见到)。虽然现在习惯了CentOS新版firewalld的操作,但考虑到以后不可避免会遇到CentOS 6的时候,为方便备查整理一下零散的笔记。

工作机制

  Linux在内核中选取五个位置放了五个钩子函数(hook function),分别是INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。写好的规则被送往netfilter,告诉内核如何去处理数据包。

  实际上,通过ps会发现,iptables本身在工作时并没有特定的进程,而是本身作为一个内核模块被加载(可以通过lsmod | grep table查看)。所以,需要注意的是,在大部分Linux发行版中,仅通过systemctl或service命令是无法准确判断iptables规则是否正在工作(可以使用iptables查询命令去确认)。

  数据包流动时涉及到的钩子:

方向 钩子
流入本机 PREROUTING --> INPUT --> 用户空间进程
流出本机 用户空间进程 --> OUTPUT --> POSTROUTING
转发 PREROUTING --> FORWARD --> POSTROUTING

  数据包的处理过程,这张图画的很好:

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP通过路由判断是否需要转送出去;

  • 如果数据包就是进入本机的,数据包就会沿着图向上移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它;

  • 离开本机的数据包,比如本机上运行的程序发送出的数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出;

  • 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

  iptables工具通过table实现数据包管理,每张表又包含不同的Chain(也就是上面反复提到的钩子函数)。目前Linux通常主要通过3张表就可以实现管理:filter,nat,mangle(还有基本用不到的raw和security)。

  filter是防火墙规则中默认的表。这个表包含内置的Chain有INPUT、FORWARD和OUTPUT。从上面数据流程的分析可以看出,这个表涉及到的钩子函数可以实现管理本机数据包的进出。

  nat表内含3条Chain:PREROUTING,OUTPUT和POSTROUTING,用于管理后端内部主机访问internet时的地址转换。

  mangle表在2.4.17版本的系统内核为止仅支持PREROUTING和OUTPUT俩个钩子,从2.4.18开始支持所有5个钩子函数。用于实现自定义的规则处理方式。

通用语法

iptables [-t table] Option chain condition -j target_name
-t table
    filter,nat,mangle等,默认filter

Option
    Chain管理
        -Nnew, 自定义一条新的规则链
        -Xdelete,删除自定义的空的规则链
        -Ppolicy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受;DROP:丢弃
    Chain查询
        -Llist, 列出指定链上的所有规则,本选项须置后
        -nnumberic,以数字格式显示地址和端口号
        -vverbose,详细信息
        -xexactly,显示计数器结果的精确值,而非单位转换后的易读值
        --line-numbers:显示规则的序号
    rule管理:
        -Aappend,追加
        -Iinsert, 插入,要指明插入至的规则编号,默认为第一条
        -Ddelete,删除;(1) 指明规则序号;(2) 指明规则本身
        -Rreplace,替换指定链上的指定规则
        -Fflush,清空指定链的规则
        -Zzero,计数器置零

chain:
    指定链

condition
    匹配条件

-j target_name
    指定动作

一般开局

# 查看当前默认表的规则
iptables -t filter -nvL
# 清空现有规则
# all the chains in the table if none is given
iptables -F,--flush [chain]
# 清除自定义的空规则
iptables -X
# 清0计数器
iptables -Z
# 保存规则
service iptables save
# 
# 初始化完成,此时的配置文件为空,且默认全部放行。开始配置
#
# 首先配置默认filter表的链策略
# 一般的业务机器,凡是收到我们未明确指定的数据包,均丢弃
# 注意!!开局是本地访问时使用,不适合远程ssh执行,因为下一步操作会马上导致远程ssh断开
# 远程ssh时,可以预先放行22端口后再执行链策略初始化,或者直接写入配置文件后重启服务即可。
# 配置文件位置往往不固定,推荐手动find
# 再次声明,下面这条命令远程执行非常危险!
# 就算是关闭防火墙,这个命令也会打开防火墙并执行阻止策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
#iptables -P OUTPUT DROP
iptables -P OUTPUT ACCEPT
# 根据业务需求,开始追加新规则到链尾
# 允许本机正常通信
iptables -A INPUT -i lo -j ACCEPT
# 放行外界进入的22端口的请求
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 放行ping
iptables -A INPUT -p icmp -j ACCEPT
# 重启服务生效
service iptables save
service iptables restart
# 可参考上述做法,放行其他端口的业务
# 要是非常严格的机器,为提高安全级别,初始化链策略时,OUTPUT也可以丢弃
# 此时,要实行来回方向都放行
# 如下方是22端口的来回放行做法
# 在默认filter表的INPUT链上,接收从eth0进入的目标端口为22的TCP数据包,允许的数据包状态为刚刚发起连接或已建立连接
#iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# 在默认filter表的OUTPUT链上,允许离开eth0的源端口为22的TCP数据包,允许的数据包状态为已建立连接
#iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# (不推荐)假如于默认链策略为接收时,需要在末尾拒绝所有其他数据包
# iptables -A INPUT -j DROP
#
# 特例,OPEN VPN端口NAT转发(需要提前开启系统级数据转发)
#
# 接受对VPN端口的数据包
iptables -A INPUT -p TCP --dport 1194 -j ACCEPT
# 来自VPN内网的数据包,通过SNAT将源IP转换为网卡IP转发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
service iptables save
service iptables restart

# 查看当前状态
iptables --list
iptables -t nat --list

发表评论

评论列表,共 0 条评论

    暂无评论