设置如下:debian 代理服务器 -> linsys 路由器 -> 内部 ubuntu 服务器
问题是:我可以在 Debian 代理上的浏览器中输入 192.168.1.128 来访问 ubuntu Web 服务器 (apache2)。但是,我的 Shorewall 转发规则无法通过以下任一规则:
#Web/DNAT net loc:192.168.1.128
#DNAT net loc:192.168.1.128:80 tcp 80 - 70.90.XXX.XX
额外信息:
我有内部 ubuntu 服务器,现在接受所有连接以进行调试(还安装了 shorewall)
摘自“shorewall show log”的输出(在 debian 机器上):
Feb 1 19:37:15 fw2loc:ACCEPT:IN= OUT=eth1 SRC=192.168.1.137 DST=224.0.0.251 LEN=104 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=84
Feb 1 19:40:31 fw2loc:ACCEPT:IN= OUT=eth1 SRC=192.168.1.137 DST=224.0.0.251 LEN=104 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=84
‘shorewall show nat’ 的输出(在 debian 机器上):
Chain PREROUTING (policy ACCEPT 235 packets, 74689 bytes)
pkts bytes target prot opt in out source destination
12 724 net_dnat all -- eth0 * 0.0.0.0/0 0.0.0.0/0
Chain POSTROUTING (policy ACCEPT 8 packets, 670 bytes)
pkts bytes target prot opt in out source destination
3 242 eth0_masq all -- * eth0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 7 packets, 611 bytes)
pkts bytes target prot opt in out source destination
Chain eth0_masq (1 references)
pkts bytes target prot opt in out source destination
1 69 MASQUERADE all -- * * 192.168.1.0/24 0.0.0.0/0
Chain net_dnat (1 references)
pkts bytes target prot opt in out source destination
2 128 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:192.168.1.128
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:192.168.1.128
编辑:
我还应该提到,在检查了 ubuntu 机器上的 apache 日志后,似乎没有任何请求成功。当我从 LAN 发出请求时,我会在访问日志中获得一个条目,但是当我通过代理从 LAN 外部发出请求时,我什么也没有得到。
代理上的‘iptables -vnL’输出:
22 1280 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
22 1280 eth0_fwd all -- eth0 * 0.0.0.0/0 0.0.0.0/0
22 1280 dynamic all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID,NEW
22 1280 smurfs all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID,NEW
22 1280 tcpflags tcp -- * * 0.0.0.0/0 0.0.0.0/0
22 1280 net2loc all -- * eth1 0.0.0.0/0 0.0.0.0/0
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443
22 1280 ACCEPT tcp -- * * 0.0.0.0/0 192.168.1.128 tcp dpt:80
不太确定该如何理解这一点...
我开始怀疑尝试通过 linksys 路由器是否存在根本问题,以及我是否应该通过交叉方式从 debian 转到 ubuntu...
编辑2
看起来数据包正在被正确转发(我认为这就是“shorewall show nat”的输出为我们所做的)
‘tcpdump -n -i port 80’ 的输出
公共接口:
20:15:40.458118 IP 71.182.212.251.57261 > 70.90.XXX.XXX.80: S 2834662754:2834662754(0) win 65535 <mss 1452,nop,wscale 3,nop,nop,timestamp 25163236 0,sackOK,eol>
私有接口:
20:15:45.405347 IP 71.182.212.251.57261 > 192.168.1.128.80:S 2834662754:2834662754(0)获胜 65535
经过上述几个数据包后,它变成了:
20:16:17.623882 IP 71.182.212.251.57254 > 70.90.XXX.XXX.80: S 1673429824:1673429824(0) win 65535 <mss 1452,sackOK,eol>
和
20:16:17.623917 IP 71.182.212.251.57254 > 192.168.1.128.80: S 1673429824:1673429824(0) win 65535 <mss 1452,sackOK,eol>
答案1
您的 Ubuntu 服务器上将哪个主机设置为默认网关? 如果它不是您的代理 Debian 服务器,则应向 /etc/shorewal/masq 添加另一条规则:
eth1:192.168.1.128 0.0.0.0/0 192.168.1.137 tcp 80
我假设您的 Debian 代理 LAN NIC 是 eth1,您的 Debian 服务器 IP 地址是 192.168.1.137。基本上,这里的问题是 DNAT 规则不会改变转发数据包中的源 IP 地址,因此您的 Ubuntu 服务器会尝试直接响应请求发起者,该请求发起者位于您的 LAN 之外。它使用默认网关执行通信,因此答案永远不会到达 Debian 框。此附加规则将原始 IP 更改为代理框本身的 IP,因此它应该会有所帮助。无论如何,这可能不是您想要的,因为 Ubuntu 上的 Apache 会将 Debian IP 记录为客户端 IP 以访问每个请求的日志。
答案2
首先,我假设#
配置文件中不存在每个规则前面的符号(它会注释掉该行,使其变得无用)。
尝试在代理服务器上的两个接口(公共接口和私有接口)上监控网络流量。在公共端:
# tcpdump -n -i <public interface> port 80
就私人方面而言:
# tcpdump -n -i <private interface> port 80 and host 192.168.1.128
当从外界发出请求时,您看不到私有端的任何流量,那么您应该仔细检查:
内核允许转发流量(应该是一个):
cat /proc/sys/net/ipv4/ip_forward
如果返回 0:
echo 1 > /proc/sys/net/ipv4/ip_forward
FORWARD
过滤表上的链的默认策略
iptables -nL | grep 'Chain FORWARD'
(根据您提供的信息,您应该在 net2loc 链上看到它,而不是 FORWARD)
如果默认策略是 REJECT / DROP,请在 FORWARD 链上查找允许将流量转发到 HTTP 服务器的规则:
iptables -vnL FORWARD | grep 192.168.1.128
(再次,如果FORWARD上没有出现任何有意义的内容,请检查net2loc)。
如果这没有返回一行(并且策略是 REJECT / DROP),那么您缺少允许您转发流量的规则...仔细检查 shorewall 配置。在策略配置文件loc
上将日志设置为info
,强制执行规则:
iptables -A net2loc -i <public iface> -o <private iface> \
--dst 192.168.1.128 -p tcp --dport 80 -j ACCEPT
看看会发生什么。
另一种情况是,当从外部位置发出请求时,您会在私有端看到它,这意味着其他地方出了问题(检查 linksys 路由器转发策略、路由等)。
我不会做什么@亚历克斯建议这样做,因为这样做有风险。您会丢失所有访问您服务的人的踪迹,因此会丢失统计数据。如果您的网站受到任何攻击,仅通过查看您的网络服务器日志和许多其他原因,您无法确定攻击来自何处。通常,SNAT
强烈不建议从公共网络到私人目的地。
答案3
好的,现在事情看起来有点不同了:
现在我只需使用 Debian 代理 -> Ubuntu 服务器(不再使用 Linksys 路由器)。我决定不用路由器,因为这是我们办公室无线网络所使用的。无论如何,将本应是安全的服务器连接到办公室路由器似乎对我来说并不是一个明智的举动。
变更摘要:
为两台机器的私有接口提供静态本地 IP 地址,如下所示
iface eth0 inet static
ipaddress 192.168.1.128 #the other one got 192.168.1.137
netmask 255.255.255.255
network 192.168.1.0
重启网络设备
重新启动shorewall
Shorewall 似乎运行良好,我的 apache 日志信息量很大(它们不仅仅说所有请求都来自 debian 机器)
感谢大家的帮助,我使用了这里发布的所有内容来找到我希望的可接受的解决方案。