我家里有一台 Linux 路由器,它是一台台式机,配有多个网卡和一张 wifi 卡。这几年来一直运行良好。但是我最近添加了一个新接口 (eth2),无法从其他内部网络访问该网络上的主机。
eth0 - External interface to ISP
eth1 - Internal interface (172.16.0.1) Bcast:172.16.0.255 Mask:255.255.255.0
eth2 - The new network (172.16.48.1) Bcast:172.16.48.255 Mask:255.255.255.0
wlan0 - Wifi network (172.16.16.1) Bcast:172.16.16.255 Mask:255.255.255.0
eth2 是双网卡(Intel 82546GB)上的第二个端口。eth1 是该卡上的第一个端口。eth0 是主板上的内置网卡。wlan0 是 Atheros AR5418 wifi 卡。
为了解决我遇到的问题,我目前有一个简单的防火墙设置。以下是防火墙脚本:
#!/bin/bash
MYIP_EXT="myhomeip"
MYIP_INT="172.16.0.1"
EXT_INTERFACE="eth0"
INT_INTERFACE="eth1"
NEW_INTERFACE="eth2"
WIFI_INTERFACE="wlan0"
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t mangle -F
/sbin/iptables -t nat -F
/sbin/iptables -N droplog
/sbin/iptables -A droplog -s 0/0 -d 0/0 -j LOG --log-prefix "droplog "
/sbin/iptables -A droplog -s 0/0 -d 0/0 -j DROP
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -A FORWARD -i $EXT_INTERFACE -o $INT_INTERFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A FORWARD -i $INT_INTERFACE -o $EXT_INTERFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A FORWARD -i $WIFI_INTERFACE -o $EXT_INTERFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A FORWARD -i $NEW_INTERFACE -o $EXT_INTERFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables --table nat -A POSTROUTING -o $EXT_INTERFACE -j SNAT --to $MYIP_EXT
/sbin/iptables -A PREROUTING -t nat -p tcp --dport 2222 -i $EXT_INTERFACE -j DNAT --to 172.16.0.204:22
/sbin/iptables -A INPUT -i $WIFI_INTERFACE -j ACCEPT
/sbin/iptables -A INPUT -i $INT_INTERFACE -j ACCEPT
/sbin/iptables -A INPUT -i $EXT_INTERFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A INPUT -i $EXT_INTERFACE -j droplog
路由器路由表:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 99.70.232.1 0.0.0.0 UG 0 0 0 eth0
myhomeip.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
172.16.16.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
172.16.48.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
一切正常,除了我无法通过新接口从 172.16.0.0/24 或 172.16.16.0/24 网络上的主机连接到 172.16.48.0/24 网络。
我可以从路由器连接到 172.16.48.0 网络上的主机,并从这些主机连接到互联网。我还可以连接 172.16.0.0 网络上的主机和 172.16.16.0 wifi 网络。
如果我在主机 172.16.48.100 上运行 tcpdump 并尝试从 172.16.0.204 ssh 到它,我会看到数据包进来,但没有返回。
172.16.48.100 上的网络配置是
inet addr:172.16.48.100 Bcast:172.16.48.255 Mask:255.255.255.0
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.48.1 0.0.0.0 UG 0 0 0 eth0
172.16.48.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
如果我在 172.16.0.204 上运行 tcpdump 并尝试从 172.16.48.100 ssh 到 172.16.0.204,我看不到任何数据包。
我究竟做错了什么?
答案1
您有一条 iptables 规则
/sbin/iptables -A droplog -s 0/0 -d 0/0 -j DROP
但你做了不是有以下规则:
/sbin/iptables -A INPUT -i $NEW_INTERFACE -j ACCEPT
因此,发往 $NEW_INTERFACE 的初始数据包将被丢弃,并且连接永远不会变为 ESTABLISHED (已建立) 和 RELATED (已关联)。