语法概述:iptables [-t 要操作的表] 操作命令 [要操作的链] [规则号码] [匹配条件] [-j 匹配到以后的动作]
note: [-t 操作表] 不写默认为 -t filter
查看filter表中配置规则:iptables -L <==> iptables -t filter -L
如果要查看对应规则序号可以在后面追加:--line-number
以插入的顺序进行执行(第一条优先级最高,序号越大优先级越低。如要匹配指定端口访问,拒绝所有的规则应放在最后)
操作命令:
-A 追加
-I 插入(可在[INPUT]等参数后加入序号,表示插入到第几条,默认第一条)
-D [Chain] [number] 删除链[Chain]序号为[number]的规则
-R repalce
-P 设置默认规则(不常用)
ex: iptables -t filter -P INPUT DROP // 当数据包咩有被规则列表里的任何规则匹配到时,按此默认规则处理
反例: iptables -P INPUT ACCEPT // 默认允许所有,覆盖默认丢弃所有
-F 清空
ex:
[1] iptables -F INPUT // 清空filter表INPTUT链中的所有规则
[2] iptables -t nat -F PREROUTING // 清空nat表PREROUTING链中的所有规则
note:
1、-F 仅仅 清空链中规则,并不影响 -P 的设置的默认规则
2、-P 设置了 DROP 后,使用 -F 一定要小心!!!
3、如果不写链名,默认清空某表里所有规则
-L 查看
前置参数(非必须):
v: 显示详细信息,包括每条规则的匹配包数量和匹配字节数
x: 在 v 的基础上,禁止自动单位换算(K、M)
n: 只显示 IP 地址和端口号码,不显示域名和服务器名称
ex:
[1] iptables -t filter -A INPUT -j DROP -p tcp --dport 80 // 将到本机的所有80请求包丢弃
[2] iptables -t filter -A OUTPUT -j DROP -p tcp -d 192.168.1.1 // 发往192.168.1.1的包丢掉
[3] iptables -I INPUT -j ACCEPT -s 172.32.88.228 // 172.32.88.228所有请求都放行
查看nat表中配置规则:iptables -t nat -L
# 正常路线
PREROUTING -> INPUT -> OUTPUT -> POSTROUTING
# 需要转发时(修改目的地)
PREROUTING -> FORWARD -> POSTROUTING
# or (修改来源)
POSTROUTING -> FORWARD -> PREROUTING
# 特殊场景(如直接从forward发包,左右都可设置代理转发)
PREROUTING <-> INPUT <-> FORWARD <-> OUTPUT <-> POSTROUTING
# 将本机的[port]端口请求转发到[ip]:[port]
iptables -t nat -A PREROUTING -p tcp --dport [port] -j DNAT --to [ip]:[port]
# 将[ip]:[port]的响应转发到本机响应
iptables -t nat -A POSTROUTING -p tcp -d [ip] --dport [port] -j SNAT --to [ip]
//-j SNAT --to [ip] <==> -j MASQUERADE
# 配置后响应不成功查看是否开启ip_forward 0-disable,1-enable
cat /proc/sys/net/ipv4/ip_forward
-i 流入
-o 流出
-s 来源地址
-d 目的地址
-p 协议类型
--sport 来源端口
--dport 目的端口
iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
为何在没有添加上述规则就不能通信?因为建立一个通信连接需要服务器端和客户端交互才能完成。举例来说,从本机使用ssh客户端去登陆外部的ssh服务器,假设使用端口为12345,那么本就使用tcp端口号12345向服务器22端口发送一个请求,这个属于OUTPUT,由于OUTPUT规则没有任何限制,所以可以顺利到达服务器,服务器收到请求后,服务器会回应本机的tcp 12345端口,此时回应属于INPUT,如果INPUT中配置放行此规则,那么连接就无法完成,也即是本机无法和外部通信。外部的网络那么多,总不能逐条去配置INPUT规则,所以为了能访问外部网络,必须要配置上述规则。
# 对进来的包的状态进行检测,已经建立tcp连接的包以及该连接相关的包允许通过
# or 这个想要进入的封包是否为刚刚我发出去的回应?如果是刚刚我发出去的回应,那麼就可以予以接受放行
# RELATED:该封包为本机发出的封包有关
# ESTABLISHED:已建立的链接状态
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 加上DNS的53端口,ssh和mysql默认要做反向解析
iptables -I INPUT -j ACCEPT -p tcp --dport 53
iptables -I INPUT -j ACCEPT -p udp --dport 53
# 将现有规则存入 /etc/sysconfig/iptables 文件,重启后原有命令还会存在,否则原有命令被清空
service iptables save