iptables初探


iptables 基本命令

iptables 语法

我们来看看 iptables 命令的语法帮助信息,并将其保存到文本文件想要通过步骤检查,可以在终端输入: sudo iptables -h > ~/iptables_help

查看 iptables 表的规则

iptables 有表 (tables) 的概念,每张表又包含不同链 (chains),大部分情况下我们仅需要使用 filter 和 nat 两张表的链就可以完成功能。使用以下命令可以查看 filter 表中的规则。sudo iptables -L -n

参数解析:

命令默认显示的是 filter 表,可以通过 -t 参数来指定其他表。

可以看到目前 filter 表中有 3 条链: INPUT, FORWARD, OUTPUT。 3 条链都没有任何规则存在,因此通过网卡的网络数据包不会受到任何影响。

场景:禁止访问目的地址

添加一条规则到 Filter 表

在没有任何防火墙规则时,尝试 ping 百度的服务器,ping 是可以正常返回的。

ping -c 4 www.baidu.com
PING qcloud.com (119.29.47.192) 56(84) bytes of data.
64 bytes from 119.29.47.192: icmp_seq=1 ttl=58 time=3.11 ms
64 bytes from 119.29.47.192: icmp_seq=2 ttl=58 time=3.10 ms
64 bytes from 119.29.47.192: icmp_seq=3 ttl=58 time=3.17 ms

假设我们作为 Linux 管理员,不希望有人从本机 ping 百度的服务器,那么就可以用到如下的 iptables 命令:sudo iptables -I OUTPUT -p icmp -d www.baidu.com -j DROP

参数解析

重要: 因为在 iptables 一个链中的规则是从上到下依次执行的,因此一条规则在链中的位置十分重要。例如一条拒绝全部连接的规则 -j REJECT 一定要放在链的最后,而允许通行的规则要放在这条规则之前。否则所有网络数据包进入链后直接匹配到这条规则,将导致所有连接被拒绝。现在我们可以用 sudo iptables -L -n 命令看到 filter 表的 OUTPUT 链中新增了两条记录,其中 destination 地址是 DNS 返回的百度服务器 IP 地址。

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  0.0.0.0/0            220.181.112.244
DROP       icmp --  0.0.0.0/0            220.181.111.188

这时再 ping 百度服务器会发现无法 ping 通了,因为访问百度服务器 IP 地址的数据包已经被防火墙过滤丢掉了

ping -c 4 www.baidu.com
PING www.a.shifen.com (220.181.111.188) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted

场景:导出、编辑、导入规则

导出规则

通过如下命令导出所有规则到文本文件sudo iptables-save > /home/ubuntu/iptables_rules

编辑规则

在新标签页打开 iptables_rules,在 filter 表的 :OUTPUT ACCEPT链下面添加一条规则

-A OUTPUT -p icmp -d 114.114.114.114 -j DROP

Ctrl-S 保存该文件

导入规则

使用命令将编辑过的规则重新导入 iptables

sudo iptables-restore /home/ubuntu/iptables_rules

使用 sudo iptables -L -n 查看是否有禁止 ping 114.114.114.114 的新增规则使用 sudo ping 114.114.114.114 查看新规则是否生效

iptables进阶场景:黑/白名单

实验:

假设本机作为一台网关使用,被限制的目标网站有 114.114.114.114 和 220.181.111.188,被限制访问的 PC 就是本机。

查看本机 IP 地址。

sudo ip a show eth0

inet 之后的就是本机网口的 IP 地址,例如 10.135.166.86

编辑 iptables 规则:

//清除已有规则

sudo iptables -F

//清除自建链

sudo iptables -X

//新建一个叫做 BLACKLIST 的链

sudo iptables -N BLACKLIST

//当访问的源 IP 地址是本机的时候进入 BLACKLIST 链

sudo iptables -A OUTPUT -s 10.135.166.86 -j BLACKLIST

//向 BLACKLIST 链添加 2 条规则

sudo iptables -A BLACKLIST -d 114.114.114.114 -j DROP
sudo iptables -A BLACKLIST -d 220.181.111.188 -j DROP

如上配置后,会发现本机已经无法 ping BLACKLIST 中的目的地址了。

如果后续要增加新的禁止访问的目的地址,则只需向 BLACKLIST 链添加新规则。如果需要限制另一台 PC 通过本网关转发访问外网,则只需添加一条 OUTPUT 链的源 IP 匹配规则并指向 -j BLACKLIST。

进阶场景:端口映射

分析:

通常来讲应该首先考虑程序本身能否配置监听多个端口,或者使用负载均衡器作为代理程序。 但在本次实验中我们将使用 iptables 监听 8080 端口并将网络数据包转发给本地80端口

实验:

首先测试 telnet 0 80telnet 0 8080

可以看到 80 和 8080 端口都是不通的。

接下来我们用 netcat 监听 80 端口:

sudo nc -k -l 80 &

这时候 telnet 0 80 发现 80 端口可以工作了。

退出telnet需要按 Ctrl + ] (右方括号) ,再按 q 回车。

下面我们用 iptables 做一个端口映射

sudo iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 8080 -j DNAT --to 127.0.0.1:80

这里我们用到了 -t nat 参数,表示我们使用了 netfilter 的 nat 表。在 nat 表的 OUTPUT 链上做了一个 -j DNAT 转发,将访问内网 8080 端口的数据包转向了 80 端口。

这时候 telnet 0 8080 发现 8080 端口也可以工作了。

如果是监听外网的 8080 端口转发到 80 端口,则需要执行以下命令:

sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80

通过使用 PREROUTING 链直接将访问 8080 端口的数据包转发到 80 端

© 2018 JIAWEI    粤ICP备18035774号