Появилась задача поднять интернет-шлюз, но столкнулся с небольшой проблемой. Сейчас экспериментирую на виртуалке
Сервер debian 8.3, два интерфейса
# WAN
allow-hotplug eth0
iface eth0 inet dhcp
# LAN
allow-hotplug eth1
iface eth1 inet static
address 12.0.0.2
netmask 255.255.255.0
Поднял dhcp для локалки, bind9, прозрачный сквид (80 и 443 порты)
Вот основные данные
root@debian:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:76:1a:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.18.130/24 brd 192.168.18.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe76:1a19/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:76:1a:23 brd ff:ff:ff:ff:ff:ff
inet 12.0.0.2/24 brd 12.0.0.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe76:1a23/64 scope link
valid_lft forever preferred_lft forever
root@debian:/etc/network# ip r
default via 192.168.18.2 dev eth0
12.0.0.0/24 dev eth1 proto kernel scope link src 12.0.0.2
192.168.18.0/24 dev eth0 proto kernel scope link src 192.168.18.130
root@debian:/etc/network# iptables -L -n -v
Chain INPUT (policy DROP 54 packets, 6791 bytes)
pkts bytes target prot opt in out source destination
2 100 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
646 59105 ACCEPT all -- eth1 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 3
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 11
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
409 272K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 4 packets, 224 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
0 0 ACCEPT all -- eth1 eth0 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- eth0 eth1 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 318 packets, 20865 bytes)
pkts bytes target prot opt in out source destination
2 100 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
673 386K ACCEPT all -- * eth1 0.0.0.0/0 0.0.0.0/0
415 44912 ACCEPT all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
net.ipv4.ip_forward = 1
===========
На этом этапе все работает корректно, просто обычный шлюз. Теперь описание проблемы
Есть некая организация «ABC», у нее стоит abc-proxy:3128 на одном из внутренних серваков. Проксик доступен только изнутри клиентам их локалки. Нам необходимо для определенных сайтов выходить через этот прокси.
Сейчас старый шлюз просто пускает весь трафик через openvpn организации ABC и у пользователей нашей сети в браузере прописан их прокси.
Хочется сделать на нашем новом шлюзе разделение трафика, т.е. весь трафик пускается через нашего провайдера, через eth0 (80 и 443 проходит дополнительно через сквид), а если в браузере у пользователя указан abc-proxy:3128, то перенаправлять трафик на tun0
Я предполагаю, что нужно с помощью iptables поставить перенаправление трафика на основе порта 3128. Но совершенно не знаю как быть с маршрутами и остальном.
После поднятия tun0 вывод таблиц такой
root@debian:# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:76:1a:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.18.130/24 brd 192.168.18.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe76:1a19/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:76:1a:23 brd ff:ff:ff:ff:ff:ff
inet 12.0.0.2/24 brd 12.0.0.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe76:1a23/64 scope link
valid_lft forever preferred_lft forever
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 121.139.47.67/27 brd 121.139.47.95 scope global tun0
valid_lft forever preferred_lft forever
root@debian:# ip r
0.0.0.0/1 via 121.139.47.65 dev tun0
default via 192.168.18.2 dev eth0
12.0.0.0/24 dev eth1 proto kernel scope link src 12.0.0.2
128.0.0.0/1 via 121.139.47.65 dev tun0
192.168.18.0/24 dev eth0 proto kernel scope link src 192.168.18.130
121.139.32.72 via 192.168.18.2 dev eth0
121.139.47.64/27 dev tun0 proto kernel scope link src 121.139.47.67
root@debian:# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 121.139.47.65 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.18.2 0.0.0.0 UG 0 0 0 eth0
12.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
128.0.0.0 121.139.47.65 128.0.0.0 UG 0 0 0 tun0
192.168.18.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
121.139.32.72 192.168.18.2 255.255.255.255 UGH 0 0 0 eth0
121.139.47.64 0.0.0.0 255.255.255.224 U 0 0 0 tun0
Естественно после поднятия openVPN тунеля все встает на мертво.
proxy имеет ip 121.139.32.7
# Generated by iptables-save v1.4.21 on Tue Feb 16 21:13:12 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state INVALID -j DROP
-A FORWARD -i eth1 -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth1 -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
COMMIT
# Completed on Tue Feb 16 21:13:12 2016
# Generated by iptables-save v1.4.21 on Tue Feb 16 21:13:12 2016
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -s 12.0.0.0/24 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3129
-A PREROUTING -s 12.0.0.0/24 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
-A POSTROUTING -s 12.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT
# Completed on Tue Feb 16 21:13:12 2016
# Generated by iptables-save v1.4.21 on Tue Feb 16 21:13:12 2016
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Tue Feb 16 21:13:12 2016