С увеличением количества устройств, имеющих доступ к сети и потенциальной возможности взлома, я хочу заблокировать доступ к Интернету с определенного IP-адреса, но разрешить доступ к локальной сети. Например, я использую пульт Logitech Harmony для управления стереосистемой, спутниковым телевидением и телевизором с помощью одной кнопки. Я также могу управлять им с помощью своего iPad по локальной сети. Но я не хочу, чтобы моим телевизором управлял хакер, поэтому я хотел бы заблокировать IP-адрес, назначенный пульту Harmony, с помощью брандмауэра IP Tables.
Вот текущий сценарий, который я использую для редактирования конфигурации таблиц IP. Он работает на моей коробке Fedora 20 с 2 сетевыми картами. В разделе 6 я пытаюсь вставить правило. Все остальное работает как задумано. Я включаю весь сценарий в надежде, что он поможет кому-то другому, даже если он не имеет отношения к моему вопросу. В конце концов, все это построено на знаниях, полученных в результате моих собственных поисков!
#!/bin/sh
#
# A script for creating an iptables firewall
#
#
# Start by clearing iptables
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
#
# Define our interfaces, Squid IP, and Squid port
#
WAN="p4p1"
LAN="p4p2"
SQUIDIP="192.168.10.10"
SQUIDPORT="3129"
#
# Create log files to help troubleshooting. (We can comment out when not needed)
#
# iptables -A OUTPUT -j LOG
# iptables -A INPUT -j LOG
# iptables -A FORWARD -j LOG
#
# Now to create the Routing Firewall
#
#
# (1) Create the default policies (DROP)
#
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#
# (2) User-defined chain called "okay" for ACCEPTed TCP packets
#
iptables -N okay
iptables -A okay -p tcp --syn -j ACCEPT
iptables -A okay -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A okay -p tcp -j DROP
#
# (3) INPUT rules
#
###### (A) Rules for incoming packets from the LAN
iptables -A INPUT -p ALL -i $LAN -s 192.168.10.0/24 -j ACCEPT
iptables -A INPUT -p ALL -i lo -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p ALL -i lo -s 192.168.10.10 -j ACCEPT
iptables -A INPUT -p ALL -i lo -s 192.168.1.10 -j ACCEPT
iptables -A INPUT -p ALL -i $LAN -d 192.168.10.255 -j ACCEPT
##### (B) Rules for incoming packets from the Internet
###### (i) Packets for established connections
iptables -A INPUT -p ALL -d 192.168.1.10 -m state --state ESTABLISHED,RELATED -j ACCEPT
##### (ii) TCP rules ## Opens the server port to any TCP from the internet
iptables -A INPUT -p tcp -i $WAN -s 0/0 –dport 22 -j okay
##### (iii) UDP rules ## Opens the server port to any UDP from the internet
# iptables -A INPUT -p udp -i $WAN -s 0/0 –dport 53 -j okay
##### (iv) ICMP rules
iptables -A INPUT -p icmp -i $WAN -s 0/0 --icmp-tpe 8 -j ACCEPT
iptables -A INPUT -p icmp -i $WAN -s 0/0 --icmp-tpe 11 -j ACCEPT
#
# Creates the router between the 2 ethernet cards to accept the packets we want to forward
#
iptables -A FORWARD -i $LAN -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# (5) OUTPUT rules
# Only output packets with local addresses (no spoofing)
#
iptables -A OUTPUT -p ALL -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -p ALL -s 192.168.10.10 -j ACCEPT
iptables -A OUTPUT -p ALL -s 192.168.1.10 -j ACCEPT
#
# (6) OUTPUT rule to allow a client LAN access, but DROP internet access
# I use this to prevent various home appliances from accessing the internet
#
iptables -A OUTPUT -s 192.168.10.110 -j DROP
#
# (7) PREROUTING rules to allow a client to bypass our Squid proxy
# (NetFlix works better when it bypasses the proxy)
iptables -t nat -A PREROUTING -s 192.168.10.204 -j ACCEPT # BluRay player
iptables -t nat -A PREROUTING -s 192.168.10.205 -j ACCEPT # Sony TV
#
# (8) PREROUTING rules for transparent Squid proxy (also requires changes in the squid configuration file)
# (from: http://wiki.squidcache.org/ConfigExamples/Intercept/LinuxRedirect)
#
iptables -t nat -A PREROUTING -s $SQUIDIP -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port $SQUIDPORT
iptables -t mangle -A PREROUTING -p tcp --dport $SQUIDPORT -j DROP
#
# (9) POSTROUTING chain rules. SNAT is for static IP, MASQUERADE is for dynamic IP
#
iptables -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.10
# iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
#
# Last, but not least, save the new configuration in /etc/sysconfig/iptables
#
service iptables save
#
# EOF
#
Это не сработает.
#
# (6) OUTPUT rule to allow a client LAN access, but DROP internet access
# I use this to prevent various home appliances from accessing the internet
# iptables -A OUTPUT -s 192.168.10.110 -j DROP
Причина, по которой это не сработает, заключается в том, что таблица OUTPUT фильтрует только трафик, исходящий от вашего маршрутизатора, а не проходящий через него. Вы хотите, чтобы правило применялось к таблице FORWARD следующим образом:
iptables -A FORWARD -s 192.168.10.110 -j DROP
Но это может не сохраняться вечно, поскольку IP-адреса, назначенные устройствам, могут изменяться с помощью DHCP. Поэтому я предлагаю вам вместо этого фильтровать по MAC-адресу.
Что-то вроде:
/sbin/iptables -A PREROUTING -i $LAN -m mac --mac-source ff:ff:ff:ff:ff:ff -j DROP
куда ff:ff:ff:ff:ff:ff
- это MAC-адрес вашего пульта Harmony или другого устройства, которое вы хотите фильтровать.
Примечание: как указано в комментариях, MAC-адрес работает только на уровне Layer2. Примеры, которые я видел, предполагают, что вышеуказанное должно работать, поскольку фильтр применяется к интерфейсу LAN. Протестируйте и дайте мне знать, работает ли он должным образом.
Еще хочу добавить:
#
# Creates the router between the 2 ethernet cards to accept the packets we want to forward
#
iptables -A FORWARD -i $LAN -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Нет, он не создает маршрутизатор между двумя картами Ethernet. Маршрутизация выполняется ядром автоматически при включении переадресации IP.
Вышеупомянутые правила iptables говорят ACCEPT или разрешают прохождение пакетов, исходящих из $ LAN, на любой интерфейс. И сохраняйте состояние установленных / связанных сеансов, проходящих через прямую цепочку, поступающих в маршрутизатор, не исходящих из $ LAN. Потому что это попало в первое правило и остановилось.
Спасибо, Мэтт! Я решил, что это будет что-то легкое. Поэтому мне нужно использовать правило FORWARD, а не OUTPUT! Мне не нужно беспокоиться об изменении IP-адреса, поскольку этот сервер также предоставляет DHCP, и я назначаю их устройствам на основе MAC-адреса. Но я вижу, как ваше предложение сработает в другом сценарии.
Что касается комментариев к маршрутизации ... Я программист вырезания и вставки. Я использую эту часть сценария с тех пор, как скопировал ее из «Библии RedHat 8» много лет назад, до того, как RedHat отделилась от Fedora. Хотя комментариев не было в исходном сценарии, я попытался дать комментарии для собственного понимания. Фактический комментарий из книги гласит:
«Правила цепочки FOWARD - поскольку брандмауэр также действует как маршрутизатор, правила FORWARD необходимы для ограничения того, что брандмауэр будет и не будет передавать между двумя сетями (Интернет и LAN)»
Комментарий - это моя неверная интерпретация того, что я прочитал. Мои извинения. Вот исправленный сценарий с изменением Мэтта правила FORWARD. Кроме того, теперь он перемещен в верхнюю часть раздела ВПЕРЕД, и я обновил комментарии, чтобы отразить то, что на самом деле было сказано в книге, из которой я получил исходный сценарий.
Желаемый IP-адрес теперь имеет доступ к локальной сети, но не к Интернету.
#!/bin/sh
#
# A script for creating an iptables firewall
#
#
# Start by clearing iptables
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
#
# Define our interfaces, Squid IP, and Squid port
#
WAN="p4p1"
LAN="p4p2"
SQUIDIP="192.168.10.10"
SQUIDPORT="3129"
#
# Create log files to help troubleshooting. Comment out when not needed.
#
# iptables -A OUTPUT -j LOG
# iptables -A INPUT -j LOG
# iptables -A FORWARD -j LOG
# Turn on ip forwarding in the kernel with:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# or edit /etc/sysctl.conf and add: "net.ipv4.ip_forward = 1"
#
##### Now to create the Routing Firewall
#
#
# (1) Create the default policies (DROP)
#
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#
# (2) User-defined chain called "okay" for ACCEPTed TCP packets
#
iptables -N okay
iptables -A okay -p tcp --syn -j ACCEPT
iptables -A okay -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A okay -p tcp -j DROP
#
# (3) INPUT rules
#
###### (A) Rules for incoming packets from the LAN
iptables -A INPUT -p ALL -i $LAN -s 192.168.10.0/24 -j ACCEPT
iptables -A INPUT -p ALL -i lo -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p ALL -i lo -s 192.168.10.10 -j ACCEPT
iptables -A INPUT -p ALL -i lo -s 192.168.1.10 -j ACCEPT
iptables -A INPUT -p ALL -i $LAN -d 192.168.10.255 -j ACCEPT
##### (B) Rules for incoming packets from the Internet
###### (i) Packets for established connetions
iptables -A INPUT -p ALL -d 192.168.1.10 -m state --state ESTABLISHED,RELATED -j ACCEPT
##### (ii) TCP rules ## Opens the server port to any TCP from the internet
iptables -A INPUT -p tcp -i $WAN -s 0/0 --dport 22 -j okay
##### (iii) UDP rules ## Opens the server port to any UDP from the internet
# iptables -A INPUT -p udp -i $WAN -s 0/0 --dport 53 -j okay
##### (iv) ICMP rules
iptables -A INPUT -p icmp -i $WAN -s 0/0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp -i $WAN -s 0/0 --icmp-type 11 -j ACCEPT
#
# (4) FORWARD rules
#
##### (A) FORWARD rule to allow a client LAN access, but DROP internet access
##### I use this to prevent various home appliances from accessing the internet
#
iptables -A FORWARD -s 192.168.10.110 -j DROP
##### (B) Since this firewall is also a router, limit what packets are forwarded
##### between the 2 ethernet cards
#
iptables -A FORWARD -i $LAN -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# (5) OUTPUT rules
# Only output packets with local addresses (no spoofing)
#
iptables -A OUTPUT -p ALL -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -p ALL -s 192.168.10.10 -j ACCEPT
iptables -A OUTPUT -p ALL -s 192.168.1.10 -j ACCEPT
#
# (6) PREROUTING rules to allow a client to bypass our Squid proxy
# (NetFlix works better when it bypasses the proxy)
iptables -t nat -A PREROUTING -s 192.168.10.204 -j ACCEPT # BluRay player
iptables -t nat -A PREROUTING -s 192.168.10.205 -j ACCEPT # Sony TV
#
# (7) PREROUTING rules for transparent Squid proxy
# Also requires changes in the squid configuration file
# (from: http://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect)
#
iptables -t nat -A PREROUTING -s $SQUIDIP -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port $SQUIDPORT
iptables -t mangle -A PREROUTING -p tcp --dport $SQUIDPORT -j DROP
#
# (8) POSTROUTING chain rules. SNAT is for static IP, MASQUERADE is for dynamic IP
#
iptables -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.10
# iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
#
# Last, but not least, save the new configuration in /etc/sysconfig/iptables
#
service iptables save
#
# EOF
#