在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 |
语法
|
1 |
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,当然也可以直接编辑该配置文件:
|
1 2 3 4 5 |
# 保存规则 service iptables save # 保存规则至指定的文件 iptables-save > /etc/sysconfig/iptables.bak# 加载指定文件中的规则 iptables-restore /etc/sysconfig/iptables.new |
举例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# 设置默认规则为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详解

技术学堂















