我是一个客户端/服务器-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
ping 127.0.0.1
不起作用。- 端口 9000 上的客户端/服务器套接字交换不起作用(来自网络示例)。
- 浏览网页有效
请问我做错了什么?
编辑于 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 上运行。