iptables
入门参考:http://www.zsythink.net/archives/1199/
四表五链(默认)
表(Table, 适配匹配的规则rule)
raw
:PREROUTING, OUTPUTmangle
: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTINGnat
: PREROUTING, OUTPUT, POSTROUTING( centos7中还有|NPUT, centos6中没有filter
: INPUT, FORWARD, OUTPUT (默认表)
链(Chain)
REROUTING
:raw表, mangle表,nat表,用于目标地址转换(DNAT)进站进行的过滤INPUT
: mangle表, filter表,( centos7中还有nat表, centos6中没有),处理输入数据包,入站数据包处理FORWARD
: mangle表, filter表,处理转发数据包OUTPUT
:raw表 mangle表,nat表, filter表,处理输出数据包,出站数据包处理POSTROUTING
: mangle表,nat表,用于源地址转换(SNAT)出站进行的过滤。
动态开放端口适配
- ftp协议 :
modprobe nf_conntrack_ftp ports=21,2125,2135
- sip协议:
nf_conntrack_sip
- tftp协议:
nf_conntrack_tftp
- 其他。。。
iptables命令
库支持:libiptc
与 libiptext
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
动作
ACCEPPT
:接受数据包。
REJECT
:拒绝
DROP
:直接丢弃数据包。不给任何回应信息,这时候客户端会感觉自己的请求沉入大海,等过了超时时间才会有反应。
REDIRECT
:重定向、映射、透明代理。
SNAT
:源地址转换。
DNAT
:目标地址转换。
MASQUERADE
:IP伪装(NAT),用于ADSL。是SNAT的一种特殊形式,适用于动态的,临时会变的IP上(内网访问外网,如:LAN->WAN,则wan采用动态伪装)
LOG
:日志记录,除了记录对数据包不做任何动作。
状态
NEW
:主机连接目标主机,在目标主机上看到的第一个想要连接的包
ESTABLISHED
:主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态。
RELATED
:主机已与目标主机进行通信,目标主机发起新的链接方式,例如ftp
INVALID
:无效的封包,例如数据破损的封包状态
官方说明
https://linux.die.net/man/8/iptables
iptables
-N 自定义链
#iptables -t filter -N use_reject
#iptables -E use_reject WEB
#iptables -X WEB
-i 指定进入的网卡(PREROUTING,INPUT,FORWARD)
#iptables -t filter -I INPUT -i eth2 -p icmp -j DROP
-o 指定出去的网卡(FORWARD,OUTPUT,POSTROUTING)
[!] -d 目标地址
#iptables -I INPUT ! -d 192.168.0.230 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j DROP
[!] -s 源地址
-p #协议
tcp
--dport 目标端口
--sport 源端口
--tcp-flags 匹配报文的tcp头的标志位
{SYN,ACK,FIN,RST,URG,PSH} {..}
--syn 匹配tcp新建连接的请求报文,相当于使用"--tcp-flags SYN,RST,ACK,FIN SYN"
#iptables -t nat -I PREROUTING -d 192.168.0.172 -p tcp --dport 553 -m comment --comment "!mapping:rtsp" -j DNAT --to-destination 192.168.100.172:554
udp
--dpor
--sport
icmp
--icmp-type
echo-request 或数字8
echo-reply (响应的数据包)一般用0来表示
其他参考icmp协议
-m #模块
tcp #tcp模块
--source-port [!] port[:port]
--destination-port [!] port[:port]
--tcp-flags [!] mask comp
第一个参数是我们应该检查的标志,写为逗号分隔列表,
第二个参数是逗号分隔的标志列表,必须设置。
标志是:SYN ACK FIN RST URG PSH ALL NONE。
multiport #指定多端口号
--sport 匹配报文的源端口
--dport 匹配报文的目标端口
--ports 匹配源与目标端口
#iptables -t filter -I -s 192.168.0.12 -p tcp -m multiport --sport 11 -j REJECT
iprange 匹配指定范围内的地址
[!] --src-range from[-to]:指明连续的源IP地址范围;
[!] --dst-range from[-to]:指明连续的目标IP地址范围;
#iptables -I INPUT -d 192.168.184.142 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.184.1-192.168.184.150 -j ACCEPT
state 状态检查
--state {NEW,ESTATBLISHED,INVALID,RELATED} 指定检测那种状态
string 字符串匹配,能够检测报文应用层中的字符串
--algo bm|kmp 指定算法bm或kmp
[!] --string pattern 指明字符串是什么
#防止电子邮件欺骗
#iptables -I INPUT -p tcp --dport 25 -m string --string "Subject" --algo bm -j DROP
connlimit 连接数限制
--comlimit-above #限定大连接个数
#允许8080端口最大连接数为 30
#iptables -I INPUT -p tcp --dport 8080 -m connlimit --connlimit-above 30 -j REJECT
conntrack
--ctstate
limit 限定匹配数据包的个数
--limit 25/sec
--limit-burst 50
#响应请求的速率
# iptables -A INPUT -d 192.168.184.142 -p icmp --icmp-type 0 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
recent 限制一段时间内的连接数
time 时间
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
#iptables -I INPUT -d 192.168.184.142 -p tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j REJECT
comment #注释(最多256个字符)
--comment ""
#-m comment --comment "allow SSH to this host from anywhere"
mac #
--mac-source [!] address
匹配的源MAC地址。它的形式必须是XX的:XX:XX:XX:XX:XX。需要注意的是,这恰恰使从以太网设备来并进入PREROUTING,FORWARD和INPUT链的包感。
# iptables -A INPUT -s 192.168.100.172 -m mac --mac-source e0:50:8b:05:b9:6b -j DROP
# iptables -A input_rule -s 192.168.100.172 -m mac ! --mac-source e0:50:8b:05:b9:6b -j DROP
iprange
--src-range
#iptables -I INPUT -m iprange --src-range 192.168.1.23-192.168.1.63 -j ACCE
-j
LOG
--log-level 日志级别(0-7 man syslog)
--log-prefix "" 日志记录
-n --line-numbers
一些使用命令
# 统计输出源端口5902的tcp流量
iptables -A OUTPUT -p tcp --sport 5902
# 统计输出到目标地址192.168.0.55的tcp流量
iptables -A OUTPUT -p tcp -d 192.168.0.55
# 做网关使用将172.16.3.0网段的数据转发到enp1s0源地址修改为192.168.0.251(源地址转换)
iptables -t nat -A POSTROUTING -s 172.16.3.0/24 -o enp1s0 -j SNAT --to-source 192.168.0.251
# centos上的防火墙实现: 转发nat表输出到网卡enp1s0源地址为192.168.3.0网段,进行MASQUERED动态伪装(自动选择IP,可解决IP地址变化问题)
sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE -s 192.168.3.0/24
# 查看当前
iptables -nvL
# 查看表
iptables -t raw -nvL
iptables -t nat -nvL
iptables -t mangle -nvL
iptables -t filter -nvL
linux配置相关
# vim /etc/sysctl.conf
#使能IPv4转发
net.ipv4.ip_forward=1 # 1表示开启 0表示关闭
临时生效:
sysctl -w net.ipv4.ip_forward=1
当前存在的表
cat /proc/net/ip_tables_names
cat /proc/net/ip6_tables_names
- luci-bwc 流量统计与图表展示
- /proc/net/ip_conntrack 连接跟踪文件(老版本)
- /proc/net/nf_conntrack 连接跟踪文件