iptables是一个非常强大的Linux防火墙工具,你可以使用它来控制网络流量的访问和转发。
前面已经学习了iptables的基本原理,四表五链的基本概念,也已经安装好了iptables,下面我们主要学习iptables命令的基本使用。
可以使用iptables -h
来查看帮助:
$ iptables -h
iptables v1.6.1
Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--check -C chain Check for the existence of a rule
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain [rulenum]]
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
--ipv4 -4 Nothing (line is ignored by ip6tables-restore)
--ipv6 -6 Error (line is ignored by iptables-restore)
[!] --protocol -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--wait -w [seconds] maximum wait to acquire xtables lock before give up
--wait-interval -W [usecs] wait time to try to acquire xtables lock
default is 1 second
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --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
[!] --version -V print package version.
iptables的命令语法通常如下:
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 动作]
iptables -t 表名 <-A/I/D/R> 链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
这里的各个部分解释如下:
-t 表名
:这是可选的,用于指定你要操作的表。如果没有指定,默认是“filter”表。其他可用的表包括“nat”,“mangle”和“raw”。- 管理选项:这是你要执行的操作,比如添加(-A)或删除(-D)一条规则,插入一条规则(-I),替换一条规则(-R),清空链(-F)等。
- 匹配条件:这是可选的,用于指定匹配条件。比如,你可以匹配源或目标IP地址,源或目标端口,输入或输出接口等。
-j 动作
:这是规则的动作,当匹配条件满足时,执行的操作。比如,你可以接受(ACCEPT)数据包,拒绝(DROP)数据包,记录(LOG)数据包,或者跳转到另一个链(JUMP)。
规则的管理
规则的查询
查看当前防火墙规则:
$ sudo iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
选项:
-n
:将地址和端口显示为数字-t table
:指定表名,默认为filter-v
:显示更为详细的信息--line-numbers
:显示规则的ID
规则的添加
向表的链中添加规则:
$ sudo iptables -t filter -A INPUT -p icmp -j REJECT
$ sudo iptables -t filter -nvL
Chain INPUT (policy ACCEPT 44 packets, 2912 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 33 packets, 2508 bytes)
pkts bytes target prot opt in out source destination
这条规则的含义就是在filter表的INPUT链上增加一条拒绝所有icmp请求的规则,这样所有的ping请求将无法通讯:
$ ping 172.29.142.35 -c 3
PING 172.29.142.35 (172.29.142.35) 56(84) bytes of data.
--- 172.29.142.35 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2044ms
再添加一条规则:
$ sudo iptables -t filter -A INPUT -p tcp -j ACCEPT
$ sudo iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 6 588 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
2 96 5568 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 49 packets, 3724 bytes)
num pkts bytes target prot opt in out source destination
-A
选项表示在尾部规则链中进行追加。
如果想在规则链的指定位置插入规则,可以使用-I
选项,需要指定插入到规则链的哪个位置,默认为1。
$ sudo iptables -t filter -I INPUT 2 -p udp -j ACCEPT
$ sudo iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 6 588 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
2 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
3 327 19308 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 51 packets, 3876 bytes)
num pkts bytes target prot opt in out source destination
规则的替换
使用-R
选项进行规则的替换。
$ sudo iptables -t filter -R INPUT 1 -p icmp -j ACCEPT
$ sudo iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
3 473 27740 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 6 packets, 488 bytes)
num pkts bytes target prot opt in out source destination
规则的删除
使用-D
选项进行规则的删除,可以根据规则的ID进行删除,也是根据整个规则进行删除。
$ sudo iptables -t filter -D INPUT 2
$ sudo iptables -t filter -D INPUT -p tcp -j ACCEPT
$ sudo iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 8 packets, 464 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 388 bytes)
num pkts bytes target prot opt in out source destination
可以使用-F
来删除所有的规则:
$ sudo iptables -t filter -F
$ sudo iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 8 packets, 464 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 380 bytes)
num pkts bytes target prot opt in out source destination
可以使用-Z
选项让规则的计数器从0重新开始:
$ sudo iptables -t filter -Z
匹配条件
iptables可以根据不同的匹配条件来过滤网络数据包。iptables的匹配条件可以分为通用匹配条件和扩展匹配条件两种。
通用匹配条件:
- -p:指定协议类型,如TCP、UDP、ICMP等。
- -s:指定源IP地址或地址段。
- -d:指定目标IP地址或地址段。
- –sport:指定源端口号。
- –dport:指定目标端口号。
- -i:指定数据包进入的网络接口。
- -o:指定数据包输出的网络接口。
扩展匹配条件:除了通用匹配条件其余可用于匹配的条件称为扩展配条件,这些扩展匹配条件在netfilter中以模块的形式存在,如果想使用这些条件,则需要依赖对应的拓展模块。
扩展匹配条件包括:
- –mac-source:指定源MAC地址。
- –mac-destination:指定目标MAC地址。
- –state:指定连接状态,如NEW、ESTABLISHED、RELATED等。
- –tcp-flags:指定TCP标志位。
- –icmp-type:指定ICMP类型。
- –limit:限制匹配规则的匹配次数。
- –comment:为匹配规则添加注释。
处理动作
iptables规则的处理动作是指对匹配到的数据包所采取的操作。
常见的处理动作包括:
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包,不给任何回应信息。。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个相应的信息,客户端刚请求就会收到拒绝的信息。
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上。
- DNAT:目标地址转换
- REDIRECT:在本机做端口映射。
- LOG:在/var/log/mesages文件中记录日志信息,然后将数据包传递给下一条规则。即除了记录外不对数据包做任何其他操作,仍然让下一条规则进行匹配
自定义链
在iptables中,可以创建自定义链(Custom Chains)来组织和管理防火墙规则。
自定义链可以以更高层次和更好的可读性来管理规则,使配置和维护更加简单。
创建链mychain
$ sudo iptables -N MYCHAIN
$ sudo iptables -t filter -nvL
Chain INPUT (policy ACCEPT 201 packets, 12360 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 127 packets, 9820 bytes)
pkts bytes target prot opt in out source destination
Chain MYCHAIN (0 references)
pkts bytes target prot opt in out source destination
此时filter表中多了一条MYCHAIN链。
添加规则到自定义链:
$ sudo iptables -t filter -A MYCHAIN -s 192.168.1.0/24 -j DROP
禁止192.168.1.0/24
的网段访问本机,丢弃源地址的流量。
调用自定义链:
$ sudo iptables -t filter -A INPUT -p tcp --dport 80 -j MYCHAIN
$ sudo iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 6 packets, 348 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 MYCHAIN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 4 packets, 304 bytes)
num pkts bytes target prot opt in out source destination
Chain MYCHAIN (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 192.168.1.0/24 0.0.0.0/0
将所有传入TCP端口80的流量传递到MYCHAIN自定义链进行处理。如果不调用自定义的规则链,则自定义的规则链无效。
清空链中的规则:
$ iptables -F MYCHAIN
删除指定的自定义链:
$ iptables -X MYCHAIN
删除所有的的自定义链:
$ iptables -X