iptables – 将来自docker容器的传出流量列入白名单
我有一个服务器在以下配置中运行多个docker容器:>其中一个容器是绑定到其他容器的公开端口的反向代理.这是唯一一个在http端口80上接受外部世界连接的容器
>所有其他容器都是运行tty shell的开发环境.它们在主机上有暴露的端口,但由于主机上的EC2安全组配置,这些端口不会暴露给外部世界.因此,与它们通信的唯一方法是通过反向代理.反向代理通过其暴露的端口与它们通信.
注:我不能在这里使用容器链接,因为我不想用每个新的开发容器重新启动反向代理容器.
| DEV Env Docker
| /
OUTSIDE WORLD <-----|------> REVERSE PROXY DOCKER - DEV Env Docker
|
| DEV Env Docker
这个想法是用户可以通过反向代理访问开发容器并在该容器内运行命令.
我想通过将可以连接的域列入白名单来阻止用户运行连接到外部世界的命令.
我已经安装了squid3并通过在配置文件中添加以下行来设置白名单:
acl whitelist dstdomain "/etc/squid3/whitelist.txt" http_access allow whitelist
我还设法使用以下iptables命令将流量从docker容器重定向到squid
iptables -t nat -A PREROUTING -i docker0 -p tcp -d 0/0 -j REDIRECT –to-port 3128
我遇到的问题是我只希望来自我的Dev Env容器的传出流量通过鱿鱼,但是因为“我相信”我需要使用PREROUTING所有流量都通过鱿鱼,即使是那些传入并发往我的反向代理的流量.
当我尝试通过Web访问我的反向代理时,我从squid收到以下错误
ERROR The requested URL could not be retrieved The following error was encountered while trying to retrieve the URL: / Invalid URL Some aspect of the requested URL is incorrect. Some possible problems are: Missing or incorrect access protocol (should be http:// or similar) Missing hostname Illegal double-escape in the URL-Path Illegal character in hostname; underscores are not allowed. Your cache administrator is webmaster. Generated Fri, 06 Nov 2015 18:56:54 GMT by ip-10-0-1-201 (squid/3.3.8)
问题:如何让squid忽略与反向代理容器相关的所有流量,包括传入和传出?
我的iptables是这样的
# Generated by iptables-save v1.4.21 on Fri Nov 6 18:54:09 2015 *nat :PREROUTING ACCEPT [30:1796] :INPUT ACCEPT [28:1680] :OUTPUT ACCEPT [37:2388] :POSTROUTING ACCEPT [46:2964] :DOCKER - [0:0] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A PREROUTING -i docker0 -p tcp -d 0/0 -j REDIRECT --to-port 3128 -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE -A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 8000 - j MASQUERADE -A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE -A DOCKER ! -i docker0 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 172.17.0.3:8000 -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8192 -j DNAT --to-destination 172.17.0.3:80 -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80 COMMIT # Completed on Fri Nov 6 18:54:09 2015 # Generated by iptables-save v1.4.21 on Fri Nov 6 18:54:09 2015 *filter :INPUT ACCEPT [1891:3910112] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1500:1500230] :DOCKER - [0:0] -A FORWARD -o docker0 -j DOCKER -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT -A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8000 -j ACCEPT -A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT COMMIT # Completed on Fri Nov 6 18:54:09 2015
—-编辑—–
在评论中指出更改为http_port之后,我的Squid Conf完整.
acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT http_access deny !Safe_ports http_access allow localhost manager http_access deny manager acl allowed_ips src 172.17.0.0-172.17.0.254 http_access allow allowed_ips http_access allow localhost http_access deny all http_port 3128 accel vhost allow-direct coredump_dir /var/spool/squid3 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|?) 0 0% 0 refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880 refresh_pattern . 0 20% 4320
我感谢您提供的所有帮助.
诀窍是让iptables仅重定向来自DEV Env容器的连接.我们可以通过添加规则来接受来自反向代理的所有连接.所以IP表规则现在将成为:-A PREROUTING -i docker0 -s 172.17.0.2/32 -j ACCEPT -A PREROUTING -i docker0 -s 172.17.0.1/32 -j ACCEPT -A PREROUTING -i docker0 -p tcp -d 0/0 -j REDIRECT --to-port 3128
由于docker动态分配IP.如果重新运行docker容器或重新启动服务器,则需要更新使用的IP.我还添加了172.17.0.1的规则,即docker0 ip.
这些规则意味着源自docker0接口的所有其他流量(反向代理容器和docker主机本身除外)将被重定向到squid.
在鱿鱼中,我们可以使用以下行将白名单列入白名单
acl allowed_domain dstdomain google.com http_access allow allowed_domain
完整的iptables规则是:
# Generated by iptables-save v1.4.21 on Fri Nov 6 18:54:09 2015 *nat :PREROUTING ACCEPT [30:1796] :INPUT ACCEPT [28:1680] :OUTPUT ACCEPT [37:2388] :POSTROUTING ACCEPT [46:2964] :DOCKER - [0:0] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A PREROUTING -i docker0 -s 172.17.0.2/32 -j ACCEPT -A PREROUTING -i docker0 -s 172.17.0.1/32 -j ACCEPT -A PREROUTING -i docker0 -p tcp -d 0/0 -j REDIRECT --to-port 3128 -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE -A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 8000 -j MASQUERADE -A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE -A DOCKER ! -i docker0 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 172.17.0.3:8000 -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8192 -j DNAT --to-destination 172.17.0.3:80 -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80 COMMIT # Completed on Fri Nov 6 18:54:09 2015 # Generated by iptables-save v1.4.21 on Fri Nov 6 18:54:09 2015 *filter :INPUT ACCEPT [1891:3910112] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1500:1500230] :DOCKER - [0:0] -A FORWARD -o docker0 -j DOCKER -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT -A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8000 -j ACCEPT -A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT COMMIT # Completed on Fri Nov 6 18:54:09 2015
完整的鱿鱼规则是:
acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT http_access deny !Safe_ports http_access allow localhost manager http_access deny manager acl allowed_domain dstdomain google.com http_access allow allowed_domain http_access allow localhost http_access deny all http_port 3128 accel vhost allow-direct coredump_dir /var/spool/squid3 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|?) 0 0% 0 refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880 refresh_pattern . 0 20% 4320