背景:
我的服务器上使用docker部署了redis,但是redis暴露了6379端口,同时redis未设置密码,有数据泄露风险。为此,我需要在服务器上添加iptables规则,禁止其他用户访问我的redis,只允许我服务器上的程序或容器访问redis的6379端口。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c47698614b64 redis:7.0.4 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
4103d0cf15c8 nginx "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx
[root@localhost ~]#
查看本地服务器网卡:
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:c5:07:03 brd ff:ff:ff:ff:ff:ff
inet 11.0.1.11/24 brd 11.0.1.255 scope global noprefixroute dynamic ens33
valid_lft 5284214sec preferred_lft 5284214sec
inet6 fe80::55ea:6184:f0d5:bfc/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:3c:b4:fa:4c brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:3cff:feb4:fa4c/64 scope link
valid_lft forever preferred_lft forever
7: veth9c397c3@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4a:ea:ac:0f:9d:9e brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::48ea:acff:fe0f:9d9e/64 scope link
valid_lft forever preferred_lft forever
11: vethbcee86e@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 82:44:a0:94:22:2b brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::8044:a0ff:fe94:222b/64 scope link
valid_lft forever preferred_lft forever
上面可以看出,我的11.0.1.11所在的网卡为ens33。
从上面的背景部分,我们可以看出当前的需求:只允许服务器内部访问,不允许外部访问,也就是凡是通过11.0.1.11这块网卡过来的请求全都拒绝掉。
需求搞明白了,下面开始分析如何操作。
首先要搞明白的是iptables底层的“四表五链”,默认的是filter表,我们的docker的规则是不可以放在这里的,使用iptables -t raw -L 、iptables -t nat -L和iptables -t mangle -L可以看到nat表和mangle表都有很多规则,而raw表是空的;需要注意的是nat表不能配置DROP规则,全是ACCEPT规则。所以我们的docker的访问规则就放在mangle表里。
综上所述,我们要使用的表是mangle,要禁止访问的端口是6379,要禁止的网卡是ens33,那么操作命令如下:
iptables -t mangle -I PREROUTING -p tcp --dport 6379 -i ens33 -j DROP
service iptables save
然后可以测试一下:
使用客户机telnet 11.0.1.11 6379是不通的,在nginx容器内测试redis容器的6379端口是通的。