1. 常用语法
iptables [-t <table>] [-I|-D|-A|-C|-R|-L] <chain> -p <protocol> --dport <port> -j DROP
# 追加、检查、删除规则
iptables [-t table] {-A|-C|-D} <chain> <rule-specification>
# 插入规则
iptables [-t table] -I <chain> [<rulenum>] <rule-specification>
# 替换规则
iptables [-t table] -R <chain> <rulenum> <rule-specification>
# 删除规则
iptables [-t table] -D <chain> <rulenum>
# 持久化规则
iptables [-t table] -S [<chain> [<rulenum>]]
# 列举规则
iptables [-t table] -L [<chain> [<rulenum>]] [options...]
rule-specification = [matches...] [target]
match = -m <matchname> [per-match-options]
target = -j <targetname> [per-target-options]
其中:
-
-t <table>
:table
默认值为filter
,包含三种内建的chain
:INPUT
、FORWARD
、OUTPUT
。 -
-A|-C|-D|-I|-R|-S|-L
:-A
-C
检查规则,-D
表示删除规则,-I
表示插入规则,-R
替换规则,-S
持久化规则,-L
列举规则。
关于 rule-specification
的部分:
-
-p <protocol>
:表示协议,比如tcp
、udp
。 -
-s <address>[/<mask>][,...]
:指定来源。 -
--dport <port>
:目标端口。 -
-j <targetname>
:包含ACCEPT
、DROP
和RETURN
。
2. 使用的简单示例
iptables
模拟网络故障就非常必要,下面给出一个简单的例子。
# 首先启动一个 HTTP Server
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
# 列举所有 chain
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# curl 一下
$ curl localhost:8000
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
<li><a href=".bash_logout">.bash_logout</a>
<li><a href=".bashrc">.bashrc</a>
<li><a href=".lesshst">.lesshst</a>
<li><a href=".profile">.profile</a>
<li><a href=".ssh">.ssh</a>
</ul>
<hr>
</body>
</html>
# 禁止 8000 端口入流量
$ sudo iptables -I INPUT -p tcp --dport 8000 -j DROP
# 再列举一下所有 chain
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:8000
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 再次 curl 一下
$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection timed out
# 删除禁用规则
$ sudo iptables -D INPUT -p tcp --dport 2554 -j DROP