Я использую iptables, чтобы отметить пакеты для пользователя VPN и сделать раздельное туннелирование. пользователь VPN туннелирован по интерфейсу tun0, и у других пользователей есть прямой доступ к Интернету. Все работает как ожидалось, но у меня есть проблема с одним правилом ОТКЛОНЕНИЯ, а именно, я не понимаю то, что то, которые управляют точно выполнением и синтаксисом. Теперь я хотел бы открыть порт по соединению VPN. Я могу сделать это, когда я удаляю последнее ВЫХОДНОЕ правило ОТКЛОНЕНИЯ, затем это работает отлично. Какое правило я должен добавить перед правилом ОТКЛОНЕНИЯ позволить порту работать и все еще сохранять правило ОТКЛОНЕНИЯ?
export INTERFACE="tun0"
export VPNUSER="vpn"
export LOCALIP="192.168.1.28"
export NETIF="eth0"
# flushes all the iptables rules, if you have other rules to use then add them into the script
iptables -F -t nat
iptables -F -t mangle
iptables -F -t filter
# mark packets from $VPNUSER
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p udp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p tcp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! --src $LOCALIP -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -j CONNMARK --save-mark
# allow responses
iptables -A INPUT -i $INTERFACE -m conntrack --ctstate ESTABLISHED -j ACCEPT
# allow open TCP port 47657
iptables -A INPUT i $INTERFACE -p tcp --dport 47657 -j ACCEPT
# block everything incoming on $INTERFACE to prevent accidental exposing of ports
iptables -A INPUT -i $INTERFACE -j REJECT
# let $VPNUSER access lo and $INTERFACE
iptables -A OUTPUT -o lo -m owner --uid-owner $VPNUSER -j ACCEPT
iptables -A OUTPUT -o $INTERFACE -m owner --uid-owner $VPNUSER -j ACCEPT
# all packets on $INTERFACE needs to be masqueraded
iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE
# reject connections from predator IP going over $NETIF
iptables -A OUTPUT ! --src $LOCALIP -o $NETIF -j REJECT
Проблема с последней строкой:
iptables -A OUTPUT ! --src $LOCALIP -o $NETIF -j REJECT
1) Я не понимаю то, что точно эта строка делает, и синтаксис.
2) Если я удаляю эту последнюю строку, порт 47657 открыт и активен. Если строка выше включена, порт закрывается. Какое правило я должен вставить перед ВЫХОДНЫМ правилом ОТКЛОНЕНИЯ сделать только порт 47 657 открытыми?
Большое спасибо!
Примерно так:
iptables -I INPUT -p tcp --dport 47657 -j ПРИНЯТЬ
Если TCP - это протокол, который вы будете использовать на этом порту. Помните, что: -А это добавить правило в IPTABLES, оно всегда будет в конце. Если вы используете -I, это должно дать ему приоритет, чтобы оно поместило правило в начало правил. Возможно, вам придется поставить его точно в такое положение, если у вас есть больше правил, которые могут нарушить это правило.