Linux防火墙

CentOS作为一个开发环境用还是有些繁琐了,今天因为忘了iptables防火墙默认开启,还浪费了些时间找原因.

更郁闷的是用lokkit这个工具新开通一个端口,几分钟之后之前的防火墙设置全没了.

Docker啊,赶紧给团队统一起来吧,折腾环境太无聊了.

防火墙概要

iptables

iptables是存放防火墙规则的数据库

# 检查当前状态
iptables -nvL  # 或者 service iptables status
# 关闭防火墙,在非生产环境
service iptables save
service iptables stop
chkconfig iptables off
# 开启防火墙
service iptables start
chkconfig iptables on

基础用法

iptables -nvL

# 更新规则
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT



# 禁用某IP
iptables -A INPUT -s xx.xx.xx.xx -j DROP

# 增加从某IP访问特定端口
iptables -A INPUT -s xx.xx.xx.xx -p tcp --destination-port 25 -j DROP

# 删除规则
iptables -D INPUT -s xx.xxx.xx.xx -j DROP

# 注:每次修改完要保存


# 如果规则比较多,使用行号操作
iptables -L -n --line-number

# 删除第8行
iptables -D INPUT 8

iptables-save | sudo tee /etc/sysconfig/iptables   # 等价于 service iptables save 来保存修改
service iptables restart

Tool

firewall-cmd

CentOS

systemctl start firewalld
firewall-cmd --list-all
firewall-cmd --get-active-zones
# 持久化
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload

# 添加2个
firewall-cmd --permanent --zone={{public}} --add-port={{25565/tcp}} --add-port={{19132/udp}}

lokkit

CentOS简化命令行工具

# 允许某端口
lokkit -p 3389:tcp

lokkit --enabled
lokkit -s ssh

ufw

Ubuntu简化工具: Uncomplicated Firewall

sudo ufw allow ssh/tcp
sudo ufw allow 3389/tcp
# 某范围
sudo ufw allow 9000:9010/tcp
# 常用命令
sudo ufw logging on
sudo ufw enable/disable
sudo ufw status

其他工具

  • fail2ban: python工具,根据正则匹配日志错误并触发iptables动作

GUI工具

iptables详解

iptables使用表结构管理防火墙规则, 底层实际上调用Linux内核的netfilter框架.

几种表类型:

  • Filter: 防火墙过滤
  • NAT: 地址转换
  • Mangle: 改变数据包IP头信息或增加标记
  • Raw: 用于连接追踪,保持连接会话关系/状态
  • Security: SELinux相关

常用命令

iptables -nvL

# 更新规则
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

iptables-save | sudo tee /etc/sysconfig/iptables   # 等价于 service iptables save 来保存修改
service iptables restart
# 列出所有规则
-S 
# 删除所有规则
-F --flush
# 清除计数
-Z --zero

-L --list
-A  # 添加一条规则
-I <num> #在指定位置插入一条规则,默认chain的第一条
-D  # 删除一条规则

--line-numbers # 显示行号
-m --match
-p --protocol
-i --in-interface

常用规则

# 允许本地连接
iptables -A INPUT -i lo -j ACCEPT

# 开启常用服务端口
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# 或者
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT


# 允许在server发起建立的outgoing连接上返回数据.
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 其他
# 查询对外IP
w
# 之后可以限定来源IP
iptables -A INPUT -p tcp -s YOUR_IP_ADDRESS -m tcp --dport 22 -j ACCEPT


# 允许所有outgoing
iptables -P OUTPUT ACCEPT
# 拒绝其他incoming
iptables -P INPUT DROP

# 多个端口
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT

规则的保存/备份/恢复

注: 用命令配置重启后会失去作用,需要先保存并重启防火墙服务

#保存规则
# Ubuntu
apt-get install iptables-persistent
netfilter-persistent save

# CentOS
service iptables save
# 默认保存到 /etc/sysconfig/iptables
# 等价于     iptables-save | sudo tee /etc/sysconfig/iptables

# CentOS7有可能会开启firewalld, 检查firewalld 运行状态
firewall-cmd --state
# 导出规则
iptables-save > iptables-export

#恢复规则
iptables-restore < ~/iptables-export

规则使用说明

Chain是一组规则的集合,默认内置有几个Chain,包含INPUT,FORWARD,OUTPUT.
每个Chain有一个默认的policy, ACCEPT/DROP/REJECT
用户可以自定义新的Chain(必须通过jump到达),比如Docker启动容器时会默认创建几个.

Chain可以理解为有顺序的一系列规则,由上到下挨个匹配,没有匹配则使用默认策略.

规则构成:

  • INPUT: 系统接收的数据包,打开/关闭(进口/incoming)端口/地址
  • OUTPUT: 系统发出的数据包,打开/关闭(出口/outgoing)端口/地址
  • FORWARD:通常用于路由转发,如LAN到互联网

包/packet 匹配规则:

  • 每个包以第一条规则开始
  • 继续处理包直到匹配到一条规则
  • 如果找到匹配,控制跳转到指定目标

目标/target : 指规则匹配时采取的行动.

  • ACCEPT : 允许
  • REJECT : 丢掉包,通知错误消息给远程主机(connection refused)
  • DROP : 丢掉包,不发错误通知

较少用到的:

  • RETURN : 通常用于自定义Chain
  • NOTRACK: 不做连接追踪

连接追踪

iptables也可以track connection/state(new,established,related).

可用状态:

  • NEW
  • ESTABLISHED
  • RELATED: 与被标记为RELATED的连接关联,如FTP,ICMP
  • INVALID
  • UNTRACKED
  • SNAT/DNAT: 原/目的地址已被转换

资源/参考