Linux系统防火墙iptables详解

在Linux中,iptables是用来设置IPv4数据包过滤和地址转换(NAT)的命令行工具,它本身并不是防火墙,只不过由它定义的规则可以让处于内核中的netfilter读取,并且实现让防火墙工作。

一共有四张表,分别是raw/mangle(修改报文原数据)/nat(地址转换)/filter(访问规则),默认是filter,又有五个规则链,分别是PREROUTING(路由前)/INPUT(数据包流入口)/FORWARD(转发管卡)/OUTPUT(数据包出口)/POSTROUTING路由后),何一个经过本机的数据包,必将经过这五个链中的其中一个链,表和链的适用关系如下:

filter INPUT, FORWARD, OUTPUT
nat PREROUTING, OUTPUT, POSTROUTING
mangle PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

语法

iptables [-t 表名] {-A|-D|-I|-F|-L|-Z|-P} 链名 动作

参数说明

参数 说明
表链管理
-t 指定表:raw|nat|filter|mangle,默认filter
-N 创建新链,例:iptables -N in_tcp_http
-E 将自定义链重命名
-X 删除用户自定义引用计数为0的空链
-S 列出选定链的规则
-Z 清空链及链中默认规则的计数
规则管理
-A 追加规则
-D <n> 删除第<n>条规则
-F 清空规则
-I <n> 将新规则插入至第<n>条
-R <n> 替换或修改第<n>条规则
-P 设置链默认规则,默认策略一般只有ACCEPT或DROP
-L 列出规则,子命令有-n,-v,-x等
  -n 以数字形式显示地址和端口
  -v, -vv, -vvv 在打印规则时显示详细信息
  -x 在计数器上显示精确值,不进行单位换算
  --line-numbers 在打印规则时显示规则序号
通用匹配
-p 匹配协议:tcp|udp|udplite|icmp|icmpv6|esp|ah|sctp|mh|all
-d 匹配目的IP地址,多个IP用逗号隔开
-s 匹配源IP地址,多个IP用逗号隔开
-i <网卡名> 匹配入站网卡地址
-o <网卡名> 匹配出站网卡地址
--dport 匹配目的端口
--sport 匹配源端口
扩展匹配:隐含扩展
-p tcp 针对TCP协议的扩展
  --dport xx[-xx] 指定源/目的端口或端口范围
  --sport xx[-xx]
  --tcp-flags 指定匹配TCP标识位SYN,ACK,FIN,PSH,RST,URG,跟两个参数:待检查的标识位和必须为1的标识位
-p udp 针对UDP协议的扩展
  --dport xx[-xx] 指定源/目的端口或端口范围
  --sport xx[-xx]
-p icmp 针对ICMP数据报文的扩展
  --icmp-type 0 响应的数据包echo-reply
  --icmp-type 8 请求回显的数据包echo-request
扩展匹配:显式扩展
-m multiport 启用多端口扩展,然后就可以使用如--dports 80,443
动作说明
-j <动作> 满足某条件时执行后续<动作>
  ACCEPT 悄悄接受
  DROP 丢弃,多用来隐藏身份和链表
  REJECT 明示拒绝
  LOG 将数据包信息记录到syslog日志
  DNAT 目的地址转换
  SNAT 源地址转换
  MASQUERADE 源地址伪装
  REDIRRECT 重定向,一般用于端口重定向
  MARK 标记
  RETURN 在自定义链执行完毕后使用返回原规则链

另外,状态检测是一种显式扩展,用于检测会议间的连接关系,常见的状态有四种,分别是:NEW/ESTABLISHED/RELATED/INVALID。

最后,执行iptables命令后需要保存规则才能永久生效,默认配置文件是/etc/sysconfig/iptalbes,当然也可以直接编辑该配置文件:

# 保存规则
service iptables save
# 保存规则至指定的文件
iptables-save > /etc/sysconfig/iptables.bak# 加载指定文件中的规则
iptables-restore /etc/sysconfig/iptables.new

举例

# 设置默认规则为DROP
iptables -P INPUT DROP
# 清空nat表的所有链
iptables -t nat -F

# 扩展匹配,检查这syn/ack/fin/rst,其中syn必须为1、其他必须为0
iptables -A INPUT -p tcp --tcpflags syn,ack,fin,rst syn -j ACCEPT
# 丢弃来自网卡eth0的不合法的数据包
iptables -A INPUT -i eth0 -m state --state INVALID -j DROP

# 允许从跳板机172.31.254.254访问172.16.0.0/16网段的22端口
iptables -A INPUT ! -s 172.31.254.254 -d 172.16.0.0/16 -p tcp --dport 22 -j DROP
iptables -A INPUT -s 172.31.254.254 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 172.31.254.254 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
# 修改从跳板机172.31.254.254访问172.16.0.0/16网段的22端口的规则
iptables -L -n --line-number
iptables -R INPUT 5 -s 172.31.254.254 -d 172.16.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 2 -m state --state ESTABLISHED -j ACCEPT

# 允许ping其他主机但其他主机无法ping自己
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

# 将172.16.16.0网段在经过的时候转换成10.10.10.10
iptables -t nat -A POSTROUTING -s 172.16.16.0/24 -j SNAT --to-source 10.10.10.10
# 将172.16.16.0网段在经过的时候转换成不固定的外网IP
iptables -t nat -A POSTROUTING -s 172.16.16.0/24 -j MASQUERADE
# 将客户端中的目标(负载)地址172.16.16.1转换为实际(服务器)地址10.10.200.201
iptables -t nat -A PREROUTING -d 172.16.16.1 -p tcp --dport 80 -j DNAT --todestination 10.10.200.201

原创文章禁止转载:技术学堂 » Linux系统防火墙iptables详解

精彩评论

6+2=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏