相关文件
-rw-------. 1 root root 2374 9月 4 2017 /etc/sysconfig/iptables-config
-rw------- 1 root root 191 10月 1 2018 /etc/sysconfig/iptables
防火墙结构
四张功能表 raw 快速通道功能。标记、追踪 mangle 数据包修改功能,修改报文元数据,做防火墙标记等 nat 路由转换功能 filter 报文过滤
五个规则链 PREROUTING 路由前,数据包刚进入网络接口之后 INPUT 数据包从内核流入用户空间。 FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤。 OUTPUT 数据包从用户空间流出到内核空间。 POSTROUTING 路由后,数据包离开网络接口前。
规则链内的匹配顺序,按顺序依次检查,匹配即停止(LOG 策略例外),若找不到相匹配规则,则按该链的默认策略处理
规则链内的匹配顺序 raw mangle nat filter PREROUTING PREROUTING PREROUTING INPUT OUTPUT POSTROUTING POSTROUTING FORWARD INPUT OUTPUT OUTPUT OUTPUT FORWARD
COMMAND 命令选项
-A|--append CHAIN //链尾添加新规则
-D|--delete CHAIN [RULENUM] //删除链中规则,按需序号或内容确定要删除的规则
-I|--insert CHAIN [RULENUM] //在链中插入一条新的规则,默认插在开头
-R|--replace CHAIN RULENUM //替换、修改一条规则,按序号或内容确定
-L|--list [CHAIN [RULENUM]] //列出指定链或所有链中指定规则或所有规则
-S|--list-urles [CHAIN [RULENUM]] //显示链中规则
-F|--flush [CHAIN] //清空指定链或所有链中规则
-Z|--zero [CHAIN [RULENUM]] //重置指定链或所有链的计数器(匹配的数据包数和流量字节数)
-N|--new-chain CHAIN //新建自定义规则链
-X|--delete-cahin [CHAIN] //删除指定表中用户自定义的规则链
-E|--rename-chain OLDCHAIN NEWCHAIN //重命名链,移动任何引用
-P|-policy CHAIN TARGET //设置链的默认策略,数据包未匹配任意一条规则就按此策略处理
辅助选项
-t|--table TABLE //指定操作的表,默认的表为filter
-n|--numeric //用数字形式显示地址和端口,显示主机IP地址而不是主机名
-x|--exact //计数器显示精确值,不做单位换算
-v|--verbose (x3) //查看规则列表时,显示更详细的信息
-line-numbers //查看规则表时,显示在链中的序号
-V|--version
-h|--help
[option] --help //查看特定选项的帮助,如iptables -p icmp --help
--fragment -f //match second or further fragments only
--modprobe=<command> //try to insert modules using this command
--set-counters PKTS BYTES //set the counter during insert/append
CRETIRIA 条件匹配
基本匹配
扩展匹配-> |隐式匹配
|显示匹配
-p|--proto PROTO //按协议匹配,如tcp、udp、icmp,all表示所有协议。 (/etc/protocols中的协议名)
-s|--source ADDRESS[/mask]... //按数据包的源地址匹配,可使用IP地址、网络地址、主机名、域名
-d|--destination ADDRESS[/mask]... //按目标地址匹配,可使用IP地址、网络地址、主机名、域名
-i|--in-interface INPUTNAME[ +] //按入站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING链
-o|--out-interface OUTPUTNAME[+] //按出站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING链
- 隐式匹配
-m PROTO 可以省略,所以叫隐式匹配
-m tcp //-p tcp的扩展
--sport [!]N[:M] //源端口, 服务名、端口、端口范围。
--dport [!]N[:M] //目标端口,服务名、端口、端口范围
--tcp-flags CHECKFLAGS FLAGSOFTRUE //TCP标志位:SYN(同步),ACK(应答),RST(重置),FIN(结束),URG(紧急),PSH(强迫推送)。多个标志位逗号分隔。
//CHECKFLAGS为要检查的标志位,FLAGSOFTRUE为必须为1的标志位(其余的应该为0)
--syn //第一次握手。 等效于 --tcpflags syn,ack,fin,rst syn 四个标志中只有syn为1
-m udp //-p udp的扩展
--sport N[-M]
--dport N[-M]
-m icmp //隐含条件为-p icmp
--icmp-type N //8:echo-request 0:echo-reply
-m state
--state //连接状态检测,NEW,ESTABLISHED,RELATED,INVALID
-m multiport
--source-ports PORT[,PORT]...|N:M //多个源端口,多个端口用逗号分隔,
--destination-ports PORT[,PORT]...|N:M //多个目的端口
--ports //多个端口,每个包的源端口和目的端口相同才会匹配
-m limit
--limit N/UNIT //速率,如3/minute, 1/s, n/second , n/day
--limit-burst N //峰值速率,如100,表示最大不能超过100个数据包
-m connlimit
--connlimit-above N //多于n个,前面加!取反
-m iprange
--src-range IP-IP
--dst-range IP-IP
-m mac
--mac-source //mac地址限制,不能用在OUTPUT和POSTROUTING规则链上,因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址
-m string
--algo [bm|kmp] //匹配算法
--string "PATTERN" //匹配字符模式
-m recent
--name //设定列表名称,默认为DEFAULT
--rsource //源地址
--rdest //目的地址
--set //添加源地址的包到列表中
--update //每次建立连接都更新列表
--rcheck //检查地址是否在列表
--seconds //指定时间。必须与--rcheck或--update配合使用
--hitcount //命中次数。必须和--rcheck或--update配合使用
--remove //在列表中删除地址
-m time
--timestart h:mm
--timestop hh:mm
--days DAYS //Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗号分隔
-m mark
--mark N //是否包含标记号N
-m owner
--uid-owner 500 //用来匹配来自本机的封包,是否为某特定使用者所产生的,可以避免服务器使用root或其它身分将敏感数据传送出
--gid-owner O //用来匹配来自本机的封包,是否为某特定使用者群组所产生的
--pid-owner 78 //用来匹配来自本机的封包,是否为某特定进程所产生的
--sid-owner 100 //用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包
ACTION 目标策略(TARGET)
-j|--jump TARGET //跳转到目标规则,可能加载target extension
-g|--goto CHAIN //跳转到指定链,不再返回
ACCEPT 规则验证通过,不再检查当前链的后续规则,直接跳到下一个规则链。
DROP 直接丢弃数据包,不给任何回应。中断过滤。
REJECT 拒绝数据包通过,会返回响应信息。中断过滤。
--reject-with tcp-reset|port-unreachable|echo-reply
LOG 在/var/log/messages文件中记录日志,然后将数据包传递给下一条规则。详细位置可查看/etc/syslog.conf配置文件
--log-prefix "INPUT packets"
ULOG 更广范围的日志记录信息
QUEUE 防火墙将数据包移交到用户空间,通过一个内核模块把包交给本地用户程序。中断过滤。
RETURN 防火墙停止执行当前链中的后续规则,并返回到调用链。主要用在自定义链中。
custom_chain 转向自定义规则链
DNAT 目标地址转换,改变数据包的目标地址。外网访问内网资源,主要用在PREROUTING。完成后跳到下一个规则链
--to-destination ADDRESS[-ADDRESS][:PORT[-PORT]]
SNAT 源地址转换,改变数据包的源地址。内网访问外网资源。主机的IP地址必须是静态的,主要用在POSTROUTING。完成后跳到下一个规则链。
--to-source ADDRESS[-ADDRESS][:PORT[-PORT]]
MASQUERADE 源地址伪装,用于主机IP是ISP动态分配的情况,会从网卡读取主机IP。直接跳到下一个规则链。
--to-ports 1024-31000
REDIRECT 数据包重定向,主要是端口重定向,把包分流。处理完成后继续匹配其他规则。能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。
--to-ports 8080
MARK 打防火墙标记。继续匹配规则。
--set-mark 2
MIRROR 发送包之前交换IP源和目的地址,将数据包返回。中断过滤。
state TCP链接状态
NEW 第一次握手,要起始一个连接(重设连接或将连接重导向)
ESTABLISHED 数据包属于某个已经建立的连接。第二次和第三次握手 (ack=1)
INVALID 数据包的连接编号(Session ID)无法辨识或编号不正确。如SYN=1 ACK=1 RST=1
RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。如有些服务使用两个相关的端口,如FTP,21和20端口一去一回,FTP数据传输(上传/下载)还会使用特殊的端口
只允许NEW和ESTABLISHED进,只允许ESTABLISHED出可以阻止反弹式木马。
使用示例
iptables -F //删除iptables现有规则
iptables -L [-v[vv] -n] //查看iptables规则
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE //在POSTROUTING链尾添加一条规则
iptables -t nat -A POSTROUTING -s 20.20.20.0/24 -o eth1 -j MASQUERADE //在POSTROUTING链中插入为第2条规则
iptables -t nat -R POSTROUTING 2 -s 40.40.40.40 -o eth1 -j MASQUERAD //替换修改第二条规则
iptables -t nat -D POSTROUTING 2 //删除POSTROUTING链中第2条规则
iptables -t nat -P POSTROUTING DROP //设置默认策略为DROP
//限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
//限制SSH连接速率(默认策略是DROP)
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT
//防止syn攻击(限制syn的请求速度)
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
//防止syn攻击(限制单个ip的最大syn连接数)
iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP //利用recent模块抵御DOS攻击
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //单个IP最多连接3个会话
Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP //只要是新的连接请求,就把它加入到SSH列表中。5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP //防止单个IP访问量过大
iptables –A OUTPUT –m state --state NEW –j DROP //阻止反弹木马
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT //防止ping攻击
参考原文:https://www.cnblogs.com/hftian/p/8280841.html