Назад | Перейти на главную страницу

Не удается настроить правила iptables для обмена клиент-серверным сокетом на localhost

Я клиент / сервер-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

# netstat -a | grep 9000 
getnameinfo failed 
tcp6 0 0 [::]:9000 [::]:* LISTEN

Итак, что-то уже привязано к порту 9000, что, как я полагаю, является причиной моей проблемы. У вас есть идея, как я могу определить этот процесс? ps aux | grep 9000 ничего не выводит.

Я читаю вот пост # 3 который :

Linux не позволяет процессу прослушивать один и тот же порт как на IPv4, так и на IPv6 (подключения IPv4 будут передаваться в приложение как сопоставленные подключения IPv4-in-6).

Но из этого нельзя сделать вывод, что когда сокет открывается с помощью ipv6, невозможно открыть тот же порт с помощью ipv4. Собственно, мое тестовое приложение может подключаться к тому же порту на ipv4, и его клиент тоже может подключаться.

Мой вывод таков клиент может получить ответ от процесса, привязанного к ipv6, до того, как ответ его сопутствующего сервера привязан к ipv4. Это объясняет, почему тестовая программа терпит неудачу, когда пытается использовать тот же порт.

Более того, я мог найти хорошие варианты для 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.

Первое: вы должны быть очень осторожны с использованием «iptables -F» при входе в систему, например, через SSH, особенно если правилом по умолчанию (policy, 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. Но если вы подключаетесь с localhost, это будет работать из коробки.

Примечание:

  • IPv4 = tcp / udp / ... (netstat) = iptables (фильтр пакетов)
  • IPv6 = tcp6 / udp6 / ... (netstat) = ip6tables (фильтр пакетов)