使用Squid和/或iptables通过网桥共享IP地址

时间:2018-01-26 14:38:38

标签: networking network-programming iptables squid

已修改以获得更多清晰度,并添加了其他尝试解决方案的链接。

我已经和其他一个开发人员一起尝试了好几天了,而且我们无处可去,并且有很多关于没有例子可以做这类事情的评论(包括{{3}虽然不完全是这个)。我们也试图实现someone who wrote some c code to do something similar中描述的解决方案,但到目前为止,本地http服务器似乎没有按预期收到任何请求。

我们要做的是:

位于另一台设备(迷你电脑)和网络之间的设备(测试设备)上。我们希望测试设备使用迷你计算机的IP地址与控制服务器进行通信 - 换句话说,我们不希望它必须拥有自己的IP地址,而是使用小型计算机的IP地址进行控制命令(例如,阻止网络流量,恢复网络流量)。事情是这样设置的:

Mini Computer|    |            Test Device           |    | LAN
Ethernet     |<-->|eth_minicomp<-->br0<-->eth_network|<-->| Ethernet

对于以下流量:

  • 来自控制IP地址,AND
  • 发往迷你电脑的IP地址

我们希望测试设备拦截(而不是前进),但在本地使用。

而流量是:

  • 从测试设备进行编译,AND
  • 目的地为控制IP地址

我们希望它走出eth_network接口,src地址是迷你计算机的ip地址。

最新尝试

我将设备设置为透明桥,其工作原理为:

# Bring interfaces down
ip link set dev eth_minicomp down
ip link set dev eth_network down
# Create bridge
ip link add name br0 type bridge
ip link set dev br0 up
# Remove IP addresses from interfaces
ip address flush dev eth_minicomp
ip address add 0.0.0.0 dev eth_minicomp
ip address flush dev eth_network
ip address add 0.0.0.0 dev eth_network
# Bring interfaces back up
ip link set dev eth_minicomp up
ip link set dev eth_network up
# Set promisc (not sure about on br0, but should not have an effect)
ip link set dev eth_minicomp promisc on
ip link set dev eth_network promisc on
ip link set dev br0 promisc on
# Add interfaces to bridge
ip link set dev eth_minicomp master br0
ip link set dev eth_network master br0

我一直希望使用iptables / tproxy或者Squid来处理这个问题,方法是将所需的TCP / IP流量路由到lo(127.0.0.1),但似乎无法使其工作。我最近的尝试是尝试使用

sysctl net.ipv4.ip_forward=1
sysctl net.ipv4.conf.lo.rp_filter=1
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 0x01/0x01
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A PREROUTING -s $CONTROLLER_IP -p tcp -j TPROXY \
    --tproxy-mark 0x1/0x1 --on-port 80
ip route flush table 100
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

TPROXY似乎至少需要net.ipv4.ip_forward设置SuperUser1,但是,2上的过程似乎没有为此类型设置解决方案。

-s-d--on-port等各种排列。似乎我可以在中间设置中使用Suid人来做这样的事情,但我不这样做怎么看。试图在SO上搜索Squid TPROXY Feature pageSuid man in the middle会返回很多不太重要的问题。

那么我们如何将这些数据包路由到测试设备上的本地服务器进行处理? RTFM响应非常受欢迎,我们无法找到精彩的手册。

1 个答案:

答案 0 :(得分:0)

使用ebtables和iptables从团队成员那里得到帮助。

让这项工作最大的惊喜是发现如果你使用ebtables创建一个以太网桥,你必须DROP以太网帧,以便它们被踢到网络层。我们都认为DROP实际上丢弃了以太网帧,因此丢弃了TCP / IP数据包。去图。

我们现在有一台设备可以共享它所连接的计算机的MAC和IP地址,并且可以在不中断计算机的情况下进行通信。

INT_IP=169.254.1.1
SRC_IP=192.168.1.2
DST_IP=192.168.1.3
EXT_PORT=80
INT_PORT=54321

# Bring interfaces to bridge down
ip link set dev eth1 down
ip link set dev eth2 down
# Remove any ip addresses on the interfaces
ip address flush dev eth1
ip address flush dev eth2
ip address add 0.0.0.0 dev eth1
ip address add 0.0.0.0 dev eth2
# Bring interfaces back up
ip link set dev eth1 up
ip link set dev eth2 up
# Set promiscuous on the interfaces
ip link set dev eth1 promisc on
ip link set dev eth2 promisc on
# Create bridge
ip link add name br0 type bridge
ip link set dev br0 up
# Add interfaces to bridge
ip link set dev eth1 master br0
ip link set dev eth2 master br0
# Add a local private IP to the bridge
ip address add $INT_IP dev "br0"
# Allow forwarding
sysctl -w net.ipv4.ip_forward=1
# Set up ethernet bridge with ebtables.
# NOTE the drop. Completely counterintuitive.

ebtables -t broute -A BROUTING -p IPv4 --ip-source $SRC_IP \
     --ip-destination $DST_IP --ip-proto tcp --ip-dport \
     $EXT_PORT -j redirect --redirect-target DROP
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp \
     --ip-sport $INT_PORT -j redirect --redirect-target \
     DROP

# Set up iptables to handle diverting requests that originate
# from $SRC_IP destined for $DST_IP on port $EXT_PORT and send
# them to $INT_IP and $EXT_PORT in stead where you can have a
# service / thingy to handle them.
iptables -t nat -A PREROUTING -p tcp -s $SRC_IP -d $DST_IP \
     --dport $EXT_PORT -j DNAT \
     --to-destination $INT_IP:$INT_PORT
iptables -t nat -A POSTROUTING -p tcp -d $INT_IP \
     --dport $EXT_PORT -j SNAT --to-source \
     $DST_IP:$EXT_PORT
iptables -t nat -A POSTROUTING -j MASQUERADE

现在,如果您尝试从$ SRC_IP到达$ EXT_PORT端口上的$ DST_IP,它将被路由到$ INT_PIP上的$ INT_IP。相反,如果您尝试从配置此项的系统向$ INT_PORT发送数据到$ INT_IP,则所有流量将转到$ EXT_PORT上的$ SRC_IP

-2因果报应!哇噢!