Proses openvpn yang sama tidak dapat mendengarkan pada soket UDP dan TCP secara bersamaan.
Anda memiliki dua opsi bagus:
gunakan dua antarmuka tap untuk openvpn. Memiliki dua proses server openvpn, satu untuk setiap antarmuka sentuh; yang satu harus mendengarkan di UDP, yang lain di TCP. Menjembatani dua antarmuka ketuk ini di server.
gunakan dua antarmuka tun. Ini tidak dapat dijembatani, jadi jika Anda ingin berbagi ruang IP antara klien TCP dan UDP, Anda harus menggunakan learn-address
skrip seperti yang ada di http://thomas.gouverneur.name/2014/02/openvpn- Listen-on-tcp-dan-udp-with-tun / (namun, skrip khusus ini rentan terhadap serangan symlink / tmp, jadi hapus logging ke / tmp jika Anda menggunakannya).
Opsi ketiga adalah menjalankan dua instance openvpn dan menetapkan ruang IP klien terpisah untuk keduanya (misalnya, satu / 25 dari subnet yang sama / 24 masing-masing). Ini menghindari menjembatani dan kebutuhan untuk naskah alamat-belajar.
EDIT: karena saya membutuhkan skrip belajar-alamat sendiri, saya menulis satu. Saya menempatkannya di domain publik.
#!/bin/sh
#
# This script allows an openvpn server with several openvpn instances that
# use tun interfaces to share client IP space by adjusting the routing table
# to create entries towards specific clients as needed
action="$1"
addr="$2"
cn="$3" # not used, but it's there; you could e.g. log it
case "$action" in
add)
echo "sudo ip ro add $addr/32 dev $dev" >&2
exec sudo ip ro add $addr/32 dev $dev
;;
delete)
echo "sudo ip ro del $addr/32 dev $dev" >&2
sudo ip ro del $addr/32
exit 0 # ignore errors
;;
update)
echo "sudo ip ro change $addr/32 dev $dev" >&2
exec sudo ip ro change $addr/32 dev $dev
;;
esac
Script ini masuk ke stderr, yang seharusnya berakhir di log openvpn.
tun
antarmuka tidak memiliki lapisan MAC dan dengan demikian tidak dapat menjadi anggota jembatan. Jika Anda ingin menjembatani, Anda perlu menggunakantap
antarmuka.