在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详解