问题:
我有两个接口,VLAN.202和tap0。vlan.202 是我的 VPN 客户端 VLAN,最初我只是将所有 VPN 客户端隧道连接到一个随机子网,并让它们共享我的主机 IP,但我希望我的客户端隧道连接并转储到 VPN 客户端 VLAN。我正在使用的这台服务器是不是主路由器,只是与 VLAN 有链接的服务器。我希望这样做,以便所有客户端都被迫与我的路由器通信,并且不能使用我的服务器路由表路由到其他 VLAN。
简而言之,我想桥接该 VLAN 上服务器上没有任何 IP 的接口。我只希望我的客户端被转储到 VLAN 上,就像那里有一个集线器一样。(只需将一个接口上收到的所有数据包放在另一个接口上。)
我已尝试过:
我对 IP 表还很陌生,但到目前为止我确实花了 8 多个小时。
- 我尝试创建一个转发规则,该规则只接受一个输入接口并将其跳转到一个输出,但由于没有 IP 并且数据包以我为网关,因此该规则从未被命中。
- 我也尝试过输入和输出链,但是没有成功。
- 我尝试创建如下所示的新链以允许我输入和输出,但它们也未能实现目标。
我的 OpenVPN 服务器配置:
; Connection Details
local 10.10.3.2
port 25000
;proto tcp
proto udp
dev tap0
;dev tun
; Keys & Certs
ca ca.crt
cert SP.crt
key SP.key
dh dh4096.pem
tls-auth ta.key 0
; Subnet for Clients
server-bridge 10.20.8.1 255.255.255.0 10.20.8.2 10.20.8.254
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
; Encryption Settings
cipher AES-256-CBC
auth SHA256
; Compression Settings
;compress lz4-v2
;push "compress lz4-v2"
max-clients 10
; Security Settings to Avoid Attacks
user nobody
group nogroup
persist-key
persist-tun
; Logging
status /var/log/openvpn/openvpn-status.log
;log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
verb 3
;mute 20
我的IP表配置:
# START OPENVPN RULES
# Mangle table rules
*mangle
:PREROUTING ACCEPT [0:0]
# Custom Chains
-N V202
-A V202 -i tap0 -o vlan.202 -g POSTROUTING
-N TAP
-A TAP -i vlan.202 -o tap0 -g POSTROUTING
# TAP <-> vlan.202
-A PREROUTING -i vlan.202 -g TAP
-A PREROUTING -i tap0 -g V202
COMMIT
# END OPENVPN RULES
答案1
我可能错了,但听起来好像您正在尝试在彼此之间以及在 VLAN 上的其他主机之间本地路由远程 VPN 客户端的流量。
如果是这样,那么由于您正在尝试路由流量,因此必须启用路由。因此,除非已经完成,否则请编辑 /etc/sysctl.conf 并添加或取消注释以下行:
net.ipv4.ip_forward=1
然后重新启动或者运行:
sudo sysctl -p
其次,INPUT 和 OUTPUT 链仅用于发往本地进程或套接字(即主机)的数据包,而不用于发往其他系统的数据包。对于后者,请使用 FORWARD 链。此外,过滤表可能比 mangle 更适合放置。
第三,对于您的情况,-j 可能比 -g 更好。
我还没有测试过这一点,也无法明智地评论实现 TUN 接口是否是更好的方法,但要将数据包从 tap 转发到 vlan.202,我可能会建议:
iptables -A FORWARD -i tap -o vlan.202 -j ACCEPT
换个方式:
iptables -A FORWARD -i vlan.202 -o tap -j ACCEPT
要在 VLAN 上的系统之间路由数据包(如果没有其他方法完成):
iptables -A FORWARD -i vlan.202 -o vlan.202 -j ACCEPT
在可用的系统之间路由数据包(同样,如果没有其他方式完成):
iptables -A FORWARD -i tap -o tap -j ACCEPT
当然,您可以根据源、目标、协议和端口来细化这些规则。
此外,这些规则在重启后不会保留,因此您需要在启动脚本中使用 iptables-save 和 iptables-restore,或者将上述 iptables 命令合并到启动时运行的脚本中。以下是在启动时调用脚本(名为 iptables-rules.sh)的 systemd .service 文件的示例:
# /etc/systemd/system/iptables-rules.service
[Unit]
Description=Run iptables rules at startup
Before=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c /etc/my-scripts/iptables-rules.sh
[Install]
WantedBy=multi-user.target
其他资料介绍了如何编写和保存脚本(语法很简单;确保使用 chmod 将文件设置为可执行文件)以及如何启用 .service。
祝你好运,HTH。
答案2
找到了!我想避免使用 IP 的桥接,但不一定需要桥接。我能够使用我下载并编辑的脚本来修复此问题,如下所示:
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
echo "Making tunnel..."
openvpn --mktun --dev tap0
echo "Creating bridge..."
brctl addbr bridge0
brctl addif bridge0 vlan.202
brctl setageing bridge0 0
echo "Adding tap interface to bridge"
brctl addif bridge0 tap0
echo "Setting tap rules..."
ifconfig tap0 0.0.0.0 promisc up
iptables -A INPUT -i tap0 -j ACCEPT
echo "Setting bridge rules"
iptables -A INPUT -i bridge0 -j ACCEPT
iptables -A FORWARD -i bridge0 -j ACCEPT
echo "Bringing up interface as promisc"
ifconfig vlan.202 0.0.0.0 promisc up
echo "Bringing up bridge"
ifconfig bridge0 up
它实际上构成了一座像集线器一样运作的桥梁。