阻止我连接到本地主机上运行的docker代理的Iptable规则

阻止我连接到本地主机上运行的docker代理的Iptable规则,docker,iptables,socks,Docker,Iptables,Socks,我无法连接到通过本地主机上的docker运行的socks5代理。 当我刷新iptable规则时,一切正常。 但它们的存在是因为openvpn服务器。 因此,我需要能够修改它们,以允许我将服务器的本地主机路由到绑定到端口9050或其他端口的docker容器(在同一台服务器上) 这是我最初的iptable规则(openvpn)(/etc/iptables/rules.v4) 港口看起来是开放的 ➜ ~ nc -zv 127.0.0.1 9050 localhost [127.0.0.1] 9050

我无法连接到通过本地主机上的docker运行的socks5代理。 当我刷新iptable规则时,一切正常。 但它们的存在是因为openvpn服务器。 因此,我需要能够修改它们,以允许我将服务器的本地主机路由到绑定到端口9050或其他端口的docker容器(在同一台服务器上)

这是我最初的iptable规则(openvpn)(/etc/iptables/rules.v4)

港口看起来是开放的

➜  ~ nc -zv 127.0.0.1 9050
localhost [127.0.0.1] 9050 (?) open
我是不是错过了一个到docker集装箱的转发? “-A FORWARD-j REJECT--REJECT with icmp port unreachable”会导致这种情况吗

我已经在服务器上使用了curl,并使用了包含的python代码

Python代码

import requests
import socks

    def main():
        print("test")
        session = requests.session()
        session.proxies = {}

        session.proxies['http'] = 'socks5h://localhost:9050'
        session.proxies['https'] = 'socks5h://localhost:9050'

        r = session.get('http://icanhazip.com')
        print(r.text)
这是我的规则

sudo iptables --table nat --list
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere            !loopback/8           ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        anywhere            
MASQUERADE  all  --  <hidden>/24         anywhere            
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:6379
MASQUERADE  tcp  --  172.17.0.3           172.17.0.3           tcp dpt:9050

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            
DNAT       tcp  --  anywhere             localhost            tcp dpt:6379 to:172.17.0.2:6379
DNAT       tcp  --  anywhere             localhost            tcp dpt:9050 to:172.17.0.3:9050
sudo iptables——表nat——列表
链预路由(策略接受)
目标保护选项源目标
DOCKER all--anywhere anywhere ADDRTYPE匹配dst类型本地
链输入(策略接受)
目标保护选项源目标
链输出(策略接受)
目标保护选项源目标
码头工人,随便!环回/8地址类型匹配dst类型本地
链后路由(策略接受)
目标保护选项源目标
伪装所有--172.17.0.0/16任意位置
伪装所有--/24任何地方
伪装tcp--172.17.0.2172.17.0.2 tcp dpt:6379
伪装tcp--172.17.0.3 172.17.0.3 tcp dpt:9050
链码头工人(2个参考)
目标保护选项源目标
返回所有--任何地方
DNAT tcp—anywhere本地主机tcp dpt:6379到:172.17.0.2:6379
DNAT tcp—anywhere本地主机tcp dpt:9050到:172.17.0.3:9050
iptables-s的输出

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -i lo -j ACCEPT
-A INPUT -s 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p udp -m state --state NEW,ESTABLISHED -m udp --dport 1194 -j ACCEPT
-A INPUT -i eth0 -p udp -m state --state ESTABLISHED -m udp --sport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 443 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: "
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -s <hidden>/24 -i tun0 -o eth0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m limit --limit 3/min -j LOG --log-prefix "iptables_FORWARD_denied: "
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 22 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state ESTABLISHED -m udp --sport 1194 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state NEW,ESTABLISHED -m udp --dport 53 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 53 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 80 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 443 -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT
-A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_OUTPUT_denied: "
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 6379 -j ACCEPT
-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9050 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
-A f2b-sshd -s <hidden>/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN
-P输入接受
-P远期承兑
-P输出接受
-码头工人
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-DOCKER-USER
-N f2b sshd
-一个输入p tcp-m多端口——dports 22-j f2b sshd
-A输入-i lo-j接受
-A输入-s 127.0.0.0/8-i lo-j REJECT—无法访问icmp端口的REJECT
-输入-p icmp-m状态--state NEW-m icmp--icmp类型8-j ACCEPT
-输入-p icmp-m状态——与状态相关的、已建立的-j ACCEPT
-一个输入-i eth0-p tcp-m状态——状态新建,已建立的-m tcp——dport 22-j ACCEPT
-一个输入-i eth0-p udp-m state——state NEW,estured-m udp——dport 1194-j ACCEPT
-输入-i eth0-p udp-m状态——状态已建立-m udp-sport 53-j接受
-输入-i eth0-p tcp-m状态——状态已建立-m tcp——sport 53-j接受
-输入-i eth0-p tcp-m状态——状态已建立-m tcp——sport 80-j接受
-输入-i eth0-p tcp-m状态——状态已建立-m tcp——sport 443-j接受
-A输入-i tun0-j接受
-输入-m limit--limit 3/min-j LOG--LOG前缀“iptables\u INPUT\u denied:”
-输入-j REJECT--无法访问icmp端口的REJECT
-一个前向DOCKER-USER
-前-j DOCKER-ISOLATION-STAGE-1
-前向docker0-m连接轨道——ctstate相关,已建立-j ACCEPT
-一个向前的码头工人
-一个前锋-我是docker0-o docker0-j接受
-前向-i docker0-o docker0-j接受
-A向前-i tun0-j接受
-A转发-s/24-i tun0-o eth0-j接受
-前向-m状态——与状态相关的、已建立的-j接受
-转发-m限制--限制3/min-j日志--日志前缀“iptables\u FORWARD\u denied:”
-前向-j拒绝——icmp端口不可访问的拒绝
-A输出-o lo-j接受
-A输出-p icmp-j ACCEPT
-输出-o eth0-p tcp-m状态——状态已建立-m tcp——sport 22-j接受
-输出-o eth0-p udp-m状态——状态已建立-m udp-sport 1194-j接受
-输出-o eth0-p udp-m状态——状态新建,已建立-m udp——dport 53-j接受
-一个输出-o eth0-ptcp-m状态——状态新建,已建立的-mtcp——dport 53-j接受
-一个输出-o eth0-ptcp-m状态——状态新建,已建立的-mtcp——dport 80-j接受
-一个输出-o eth0-ptcp-m状态——状态新建,已建立的-mtcp——dport 443-j接受
-A输出-o tun0-j接受
-输出-m限制--限制3/min-j日志--日志前缀“iptables\u OUTPUT\u denied:”
-输出-j REJECT--无法访问icmp端口的REJECT
-码头工人-d 172.17.0.2/32-i docker0-o docker0-ptcp-mtcp--dport 6379-j ACCEPT
-码头工人-d 172.17.0.3/32-i docker0-o docker0-ptcp-mtcp--dport 9050-j ACCEPT
-DOCKER-ISOLATION-STAGE-1-i docker0-o docker0-j DOCKER-ISOLATION-STAGE-2
-DOCKER-ISOLATION-STAGE-1-j返回
-DOCKER-ISOLATION-STAGE-2-o docker0-j下降
-DOCKER-ISOLATION-STAGE-2-j返回
-DOCKER-USER-j返回
-f2b sshd-s/32-j拒绝——icmp端口不可访问的拒绝
-f2b sshd-j回路

您可以在
/var/log/syslog
中找到导致问题的规则

我猜您需要在拒绝规则之前添加以下输入和输出链规则:

-A INPUT -i docker0 -p tcp -m state --state ESTABLISHED -m tcp --sport 9050 -j ACCEPT
-A OUTPUT -o docker0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 9050 -j ACCEPT
这些应放在以下位置之前:

-A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: "
-A INPUT -j REJECT --reject-with icmp-port-unreachable
以及:

分别。您需要为使用其他容器公开的任何其他端口添加类似的规则

编辑:如果您切换到使用docker compose,这将略有不同。如果您最终遇到这种情况并需要帮助,请发表评论


另外,另一个常见问题是docker容器中运行的应用程序绑定到127.0.0.1或localhost。docker容器中的localhost与docker主机不同,因此无法通过docker主机连接到容器。通常,作为docker容器构建的应用程序具有配置文件或选项,您可以指定要绑定的IP——此处使用0.0.0.0。

这显然是一个iptables问题。刷新所有规则,一切正常。那么,我如何修改当前的规则以使其正常工作呢?
-A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: "
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_OUTPUT_denied: "
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable