无法在本地主机上设置用于客户端/服务器套接字交换的 iptables 规则

无法在本地主机上设置用于客户端/服务器套接字交换的 iptables 规则

我是一个客户端/服务器-IPC-iptables 新手。我在一年的时间里做了大量的功课,并认为这应该可行:

# cat /root/firewall/iptable | nocomment
iptables -F
iptables -F -t nat
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I INPUT 1 -s 127.0.0.0/24 -p tcp --dport 80:65535 -j ACCEPT
iptables -I INPUT 1 -s 127.0.0.0/24 -p udp --dport 80:65535 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -s 127.0.0.0/24 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
iptables -A INPUT -p tcp -i eth0 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -i eth0 -j REJECT --reject-with icmp-port-unreachable
iptables -L -v -n
/etc/init.d/iptables save

# /root/firewall/iptable
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  *      *       127.0.0.0/24         0.0.0.0/0            udp dpts:80:65535
    0     0 ACCEPT     tcp  --  *      *       127.0.0.0/24         0.0.0.0/0            tcp dpts:80:65535
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       192.168.0.0/24       0.0.0.0/0            icmptype 0
    0     0 ACCEPT     icmp --  *      *       127.0.0.0/24         0.0.0.0/0            icmptype 0
    0     0 ACCEPT     udp  --  *      *       192.168.0.0/24       0.0.0.0/0            udp dpt:631
    0     0 ACCEPT     tcp  --  *      *       192.168.0.0/24       0.0.0.0/0            tcp dpt:631
    0     0 REJECT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
    0     0 REJECT     udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 * Saving iptables state ...                    

# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.10  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx::xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x0<global>
        inet6 xxxx::xxxx:xxxx:xxxx::10  prefixlen 64  scopeid 0x0<global>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 204122  bytes 114225536 (108.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 230083  bytes 27756306 (26.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 17  

# ifconfig lo
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 16436
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Boucle locale)
        RX packets 443796  bytes 25809111 (24.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 443796  bytes 25809111 (24.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  1. ping 127.0.0.1不起作用。
  2. 端口 9000 上的客户端/服务器套接字交换不起作用(来自网络示例)。
  3. 浏览网页有效

请问我做错了什么?

编辑于 2013-08-12 08:28 CET

  • 客户端/服务器套接字交换测试(上面的第 2 点)在本地主机上
  • 我用另一个端口 (55555) 构建了另一个示例。这次成功了。我尝试了许多端口,它们都成功了。然后我做了:
# netstat -a | grep 9000 
getnameinfo failed 
tcp6 0 0 [::]:9000 [::]:* LISTEN

因此,某些进程已经绑定到端口 9000,我认为这就是导致我出现问题的原因。您知道我该如何识别该进程吗?ps aux | grep 9000什么都没有输出。

  • 取消 127.0.0.0/24 规则后,我的端口 5555 工作示例停止工作。我仍然有:tcp6 0 0 [::]:9000 [::]:* LISTEN- 当我放回 127.0.0.0/24 规则时,它再次使用端口 5555 工作。

答案1

首先:例如,当通过 SSH 登录时,您应该非常谨慎地使用“iptables -F”,尤其是当输入链上的默认规则(策略,iptables -P)是 DROP(如您在此处设置的那样)时。您将把自己锁在外面。

现在进入正题:

1) 我不会在防火墙规则的任何地方定义 127.0.0.0/8(是的!/8 不是 /24)。删除它们。这些地址是本地的,你为什么要锁定本地的东西。你在自找麻烦。

2) “端口 9000 上的套接字交换(?)”。从哪里?从 192.168.0.0/24 网络?具体是哪个主机?它无法工作,因为你只有

0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
0     0 ACCEPT     udp  --  *      *       192.168.0.0/24       0.0.0.0/0            udp dpt:631
0     0 ACCEPT     tcp  --  *      *       192.168.0.0/24       0.0.0.0/0            tcp dpt:631

这意味着它将只在端口 631 上接受新连接。


您发现您也在使用 IPv6。(端口 9000 上的侦听器是 tcp6)

意思是:ipv4 防火墙规则不是问题(事实上,他们根本不关心):您必须使侦听 tcp6:9000 的任何内容也侦听 tcp:9000。然后配置 ipv4 防火墙规则以允许访问端口 9000。但如果您从本地主机连接,这将立即生效。

笔记:

  • IPv4 = tcp/udp/... (netstat) = iptables (数据包过滤器)
  • IPv6 = tcp6/udp6/... (netstat) = ip6tables (数据包过滤器)

答案2

我读这里是帖子#3那 :

Linux 不允许进程在 IPv4 和 IPv6 上侦听同一端口(IPv4 连接将作为 IPv4-in-6 映射连接传递给应用程序)。

但我们不能由此得出结论,当使用 ipv6 打开套接字时,就不可能使用 ipv4 打开相同的端口。实际上,我的测试应用程序可以绑定到 ipv4 上的相同端口,并且其客户端也可以连接。

我的结论是客户端可能会在收到绑定在 ipv4 上的配对服务器的应答之前,先收到绑定在 ipv6 上的进程的应答。这就解释了为什么测试程序在尝试使用相同端口时会失败。

此外,我还找到了 netstat 识别端口窃贼的良好选项:

# netstat -tlp | grep 9000
tcp6       0      0 [::]:9000               [::]:*                  LISTEN      15382/java          

# ps aux | grep 15382
root      5459  0.0  0.0 110788   960 pts/21   S+   08:56   0:00 grep --colour=auto 15382
laurent    15382  1.7  2.8 5479456 465744 ?      Sl   août09  74:30 /usr/lib/jvm//sun-jdk-1.6/bin/java -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx384m -jar /usr/opt/eclipse-CDT/eclipse//plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar -os linux -ws gtk -arch x86_64 -showsplash -launcher /usr/opt/eclipse-CDT/eclipse/eclipse -name Eclipse --launcher.library /usr/opt/eclipse-CDT/eclipse//plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.100.v20110505/eclipse_1407.so -startup /usr/opt/eclipse-CDT/eclipse//plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --launcher.overrideVmargs -exitdata f28017 -product org.eclipse.epp.package.linuxtools.product -nl en_US -vm /usr/bin/java -vmargs -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx384m -jar /usr/opt/eclipse-CDT/eclipse//plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar

关闭 Eclipse 后,# netstat -tlp | grep 9000没有任何返回。

.....我的测试应用程序在端口 9000 上运行。

相关内容