Revision 7d163a24 kvm-vif-bridge
b/kvm-vif-bridge | ||
---|---|---|
7 | 7 |
MAC2EUI64=/usr/bin/mac2eui64 |
8 | 8 |
NFDHCPD_STATE_DIR=/var/lib/nfdhcpd |
9 | 9 |
|
10 |
function clear_tap { |
|
11 |
|
|
12 |
arptables -D OUTPUT -o $INTERFACE --opcode request -j mangle >/dev/null 2>&1 |
|
13 |
while ip rule del dev $INTERFACE; do :; done |
|
14 |
iptables -D FORWARD -i $INTERFACE -p udp --dport 67 -j DROP 2>/dev/null |
|
15 |
|
|
16 |
|
|
17 |
} |
|
18 |
|
|
10 | 19 |
function routed_setup_ipv4 { |
11 | 20 |
# get the link's default gateway |
12 | 21 |
gw=$(ip route list table $TABLE | sed -n 's/default via \([^ ]\+\).*/\1/p' | head -1) |
13 | 22 |
|
14 | 23 |
# mangle ARPs to come from the gw's IP |
15 |
arptables -D OUTPUT -o $INTERFACE --opcode request -j mangle >/dev/null 2>&1 |
|
16 | 24 |
arptables -A OUTPUT -o $INTERFACE --opcode request -j mangle --mangle-ip-s "$gw" |
17 | 25 |
|
18 | 26 |
# route interface to the proper routing table |
19 |
while ip rule del dev $INTERFACE; do :; done |
|
20 | 27 |
ip rule add dev $INTERFACE table $TABLE |
21 | 28 |
|
22 | 29 |
# static route mapping IP -> INTERFACE |
... | ... | |
73 | 80 |
fi |
74 | 81 |
} |
75 | 82 |
|
76 |
function routed_setup_nfdhcpd {
|
|
83 |
function setup_nfdhcpd { |
|
77 | 84 |
umask 022 |
78 | 85 |
cat >$NFDHCPD_STATE_DIR/$INTERFACE <<EOF |
79 | 86 |
IFACE=$1 |
... | ... | |
85 | 92 |
EOF |
86 | 93 |
} |
87 | 94 |
|
88 |
function reset_ebtables {
|
|
95 |
function clear_ebtables {
|
|
89 | 96 |
TAP=$INTERFACE |
90 | 97 |
FROM=FROM${TAP^^} |
91 | 98 |
TO=TO${TAP^^} |
92 | 99 |
|
93 |
ebtables -D INPUT -i $TAP -j $FROM |
|
94 |
ebtables -D FORWARD -i $TAP -j $FROM |
|
95 |
ebtables -D FORWARD -o $TAP -j $TO |
|
96 |
ebtables -D OUTPUT -o $TAP -j $TO |
|
100 |
exist=$(ebtables -L | grep $TAP) |
|
97 | 101 |
|
98 |
ebtables -X $FROM |
|
99 |
ebtables -X $TO |
|
102 |
if [ ! -z "$exist" ]; then |
|
103 |
ebtables -D INPUT -i $TAP -j $FROM |
|
104 |
ebtables -D FORWARD -i $TAP -j $FROM |
|
105 |
ebtables -D FORWARD -o $TAP -j $TO |
|
106 |
ebtables -D OUTPUT -o $TAP -j $TO |
|
107 |
|
|
108 |
ebtables -X $FROM |
|
109 |
ebtables -X $TO |
|
110 |
fi |
|
100 | 111 |
} |
101 | 112 |
|
102 |
function set_ebtables { |
|
113 |
function setup_ebtables {
|
|
103 | 114 |
TAP=$INTERFACE |
104 | 115 |
FROM=FROM${TAP^^} |
105 | 116 |
TO=TO${TAP^^} |
106 | 117 |
|
107 | 118 |
ebtables -N $FROM |
119 |
# do not allow changes in ip-mac pair |
|
108 | 120 |
ebtables -A $FROM --ip-source \! $IP -p ipv4 -j DROP |
109 | 121 |
ebtables -A $FROM -s \! $MAC -j DROP |
110 |
ebtables -A INPUT -i $TAP -j $FROM |
|
111 | 122 |
ebtables -A FORWARD -i $TAP -j $FROM |
112 | 123 |
ebtables -N $TO |
113 | 124 |
ebtables -A FORWARD -o $TAP -j $TO |
114 |
ebtables -A OUTPUT -o $TAP -j $TO |
|
115 | 125 |
#accept dhcp responses from host (nfdhcpd) |
116 | 126 |
ebtables -A $TO -p ipv4 --ip-protocol=udp --ip-destination-port=68 -j ACCEPT |
117 | 127 |
if [ $TYPE == "private" ]; then |
118 |
ebtables -A $TO -s \! $MAC/$MAC_MASK -j DROP |
|
119 | 128 |
if [ ! -z $GATEWAY ]; then |
129 |
# allow packets from/to router (for masquerading |
|
120 | 130 |
ebtables -A $TO -s $ROUTER_MAC -j ACCEPT |
131 |
ebtables -A INPUT -i $TAP -j $FROM |
|
132 |
ebtables -A OUTPUT -o $TAP -j $TO |
|
121 | 133 |
fi |
134 |
# allow only packets from the same mac prefix |
|
135 |
ebtables -A $TO -s \! $MAC/$MAC_MASK -j DROP |
|
122 | 136 |
fi |
123 | 137 |
} |
124 | 138 |
|
125 | 139 |
#FIXME: import router mac from the config files |
126 | 140 |
# must know node group!! how??? |
127 |
ROUTER_MAC=6e:10:e1:a0:c3:0f
|
|
141 |
ROUTER_MAC=e4:11:5b:b2:8d:ca
|
|
128 | 142 |
MAC_MASK=ff:ff:ff:0:0:0 |
129 | 143 |
|
130 | 144 |
TABLE=rt_$NETWORK |
... | ... | |
134 | 148 |
|
135 | 149 |
if [ "$MODE" = "routed" ]; then |
136 | 150 |
# special proxy-ARP/NDP routing mode |
137 |
|
|
151 |
clear_tap |
|
138 | 152 |
# use a constant predefined MAC address for the tap |
139 | 153 |
ip link set $INTERFACE addr $TAP_CONSTANT_MAC |
140 | 154 |
# bring the tap up |
141 | 155 |
ifconfig $INTERFACE 0.0.0.0 up |
142 | 156 |
|
143 | 157 |
# Drop unicast BOOTP/DHCP packets |
144 |
iptables -D FORWARD -i $INTERFACE -p udp --dport 67 -j DROP 2>/dev/null |
|
145 | 158 |
iptables -A FORWARD -i $INTERFACE -p udp --dport 67 -j DROP |
146 | 159 |
|
147 | 160 |
routed_setup_ipv4 |
148 |
routed_setup_ipv6 |
|
149 |
routed_setup_firewall |
|
150 |
routed_setup_nfdhcpd $INTERFACE
|
|
151 |
reset_ebtables
|
|
161 |
# routed_setup_ipv6
|
|
162 |
# routed_setup_firewall
|
|
163 |
setup_nfdhcpd $INTERFACE |
|
164 |
clear_ebtables >/dev/null 2>&1
|
|
152 | 165 |
elif [ "$MODE" = "bridged" ]; then |
153 |
while ip rule del dev $INTERFACE; do :; done |
|
166 |
clear_tap |
|
167 |
clear_ebtables >/dev/null 2>&1 |
|
154 | 168 |
ifconfig $INTERFACE 0.0.0.0 up |
155 | 169 |
brctl addif $BRIDGE $INTERFACE |
156 |
routed_setup_nfdhcpd $BRIDGE |
|
157 |
reset_ebtables |
|
158 |
set_ebtables |
|
170 |
setup_nfdhcpd $BRIDGE |
|
171 |
setup_ebtables |
|
159 | 172 |
fi |
Also available in: Unified diff