我在将 PC 的 DNS 请求重定向到本地 DNS 服务器时遇到了问题。我想阻止对除我自己的 DNS 服务之外的其他 DNS 服务的访问。我找到了不同的方法,但都不起作用。所以我一定是做错了什么。
很多人建议使用这个:
iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 192.168.2.70:53
但在我的配置中,这会阻止对 DNS 的访问。而且我不明白为什么这应该起作用。因为预路由是为想要访问内部服务的外部用户准备的,对吧?
我还尝试指定内部 lan 接口 -i eth1,但这根本行不通,因为内部服务器也在同一接口上。这会形成一个循环,对吧?服务器向端口 53 发送数据包,网关将其发送回同一服务器。
然后,我还想仅允许内部网络上的 DNS 服务器联系其他外部 DNS 服务器。例如:
iptables -A OUTPUT -p udp -s 192.168.2.70 -d 208.67.222.222 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 192.168.2.70 -d 208.67.222.220 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -s 192.168.2.72 -d 208.67.222.222 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 192.168.2.72 -d 208.67.222.220 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
但我猜 OUTPUT 表不正确。因为据我所知,INPUT 和 OUTPUT 仅适用于本地 Linux 路由器,不是吗?
信息:
Internal dns servers: 192.168.2.70 and 192.168.2.72
External dns server: 208.67.222.220 and 208.67.222.222
LAN interface: ETH1
WAN interface: ETH0
我当前的防火墙配置没有预路由和转发规则,只有一条规则用于显示其配置方式。
#!/bin/sh -e
ifconfig eth1 192.168.2.1/24
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
#Flush table's
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F
#toestaan SSH verkeer
iptables -t nat -A PREROUTING -p tcp --dport 22 -i eth0 -j DNAT --to 192.168.2.1
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#Drop traffic and accept
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
#verkeer naar buiten toe laten en nat aanzetten
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP
#toestaan verkeer loopback
iptables -A INPUT -i lo -j ACCEPT
#toestaan lokaal netwerk
iptables -A INPUT -i eth1 -j ACCEPT
#accepteren established traffic
iptables -A INPUT -i eth0 --match state --state RELATED,ESTABLISHED -j ACCEPT
#droppen ICMP boodschappen
iptables -A INPUT -p icmp -i eth0 -m limit --limit 10/minute -j ACCEPT
iptables -A INPUT -p icmp -i eth0 -j REJECT
#RDP forward voor windows servers
iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to 192.168.2.73
iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT
答案1
您需要将这些规则放入FORWARD链中:
iptables -A FORWARD -p udp -s 192.168.2.70 -d 208.67.222.222 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.70 -d 208.67.222.220 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.2.72 -d 208.67.222.222 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.72 -d 208.67.222.220 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
通过 DHCP 为用户提供本地 DNS 服务器地址,而不必费心将其 DNS 流量重定向到本地服务器 - 如果他们操纵其网络配置(DNS 服务器配置),他们将会失败。
答案2
我使用这些规则强制所有 DNS 查找由我的 DD-WRT 路由器上的 dnsmasq 完成:
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT
可以通过前往“管理 - 命令”,将它们输入框并点击“保存防火墙”将它们存储在 DD-WRT 中。