3
3
# Script to maintain ip rules on the host when starting up a transparent
4
4
# proxy server for docker.
5
5
6
- CACHEDIR=" /tmp/squid3" # Change this to place the cache somewhere else
6
+ CACHEDIR=${CACHEDIR:-/ tmp/ squid3}
7
+ CONTAINER_NAME=${CONTAINER_NAME:- docker-proxy}
7
8
8
9
set -e
9
10
10
- # Guard for my own scripts
11
- # Note, if you're running this script direct, it will rebuild if it can't see
12
- # the image.
13
- [ -z ${RUNNING_DRUN} ] && {
14
- RUN_DOCKER=" docker run"
15
- CONTAINER_NAME=' docker-proxy'
16
- docker images | grep " ^${CONTAINER_NAME} " > /dev/null || docker build -q --rm -t ${CONTAINER_NAME} " $( dirname $0 ) "
17
- }
11
+ sudo docker images | grep -q " ^${CONTAINER_NAME} " \
12
+ || (echo " Build ${CONTAINER_NAME} image first" && exit 1)
18
13
19
14
start_routing () {
20
15
# Add a new route table that routes everything marked through the new container
@@ -28,13 +23,15 @@ start_routing () {
28
23
sudo ln -s /usr/local/etc/iproute2/rt_tables /etc/iproute2/rt_tables
29
24
fi
30
25
fi
31
- ([ -e /etc/iproute2/rt_tables ] && grep TRANSPROXY /etc/iproute2/rt_tables > /dev/null) || \
32
- sudo sh -c " echo '1 TRANSPROXY' >> /etc/iproute2/rt_tables"
33
- ip rule show | grep TRANSPROXY > /dev/null || \
34
- sudo ip rule add from all fwmark 0x1 lookup TRANSPROXY
26
+ ([ -e /etc/iproute2/rt_tables ] && grep -q TRANSPROXY /etc/iproute2/rt_tables) \
27
+ || sudo sh -c " echo '1 TRANSPROXY' >> /etc/iproute2/rt_tables"
28
+ ip rule show | grep -q TRANSPROXY \
29
+ || sudo ip rule add from all fwmark 0x1 lookup TRANSPROXY
35
30
sudo ip route add default via " ${IPADDR} " dev docker0 table TRANSPROXY
36
- # Mark packets to port 80 external, so they route through the new route table
31
+ # Mark packets to port 80 and 443 external, so they route through the new
32
+ # route table
37
33
sudo iptables -t mangle -I PREROUTING -p tcp --dport 80 \! -s " ${IPADDR} " -i docker0 -j MARK --set-mark 1
34
+ sudo iptables -t mangle -I PREROUTING -p tcp --dport 443 \! -s " ${IPADDR} " -i docker0 -j MARK --set-mark 1
38
35
# Exemption rule to stop docker from masquerading traffic routed to the
39
36
# transparent proxy
40
37
sudo iptables -t nat -I POSTROUTING -o docker0 -s 172.17.0.0/16 -j ACCEPT
@@ -44,22 +41,19 @@ stop_routing () {
44
41
# Remove the appropriate rules - that is, those that mention the IP Address.
45
42
set +e
46
43
[ " x$IPADDR " != " x" ] && {
47
- ip route show table TRANSPROXY | grep default > /dev/null && \
48
- sudo ip route del default table TRANSPROXY
49
- sudo iptables -t mangle -L PREROUTING -n | grep ' tcp dpt:80 MARK set 0x1' > /dev/null && \
50
- sudo iptables -t mangle -D PREROUTING -p tcp --dport 80 \! -s " ${IPADDR} " -i docker0 -j MARK --set-mark 1
44
+ ip route show table TRANSPROXY | grep -q default \
45
+ && sudo ip route del default table TRANSPROXY
46
+ sudo iptables -t mangle -L PREROUTING -n | grep -q ' tcp dpt:80 MARK set 0x1' \
47
+ && sudo iptables -t mangle -D PREROUTING -p tcp --dport 80 \! -s " ${IPADDR} " -i docker0 -j MARK --set-mark 1 \
48
+ && sudo iptables -t mangle -D PREROUTING -p tcp --dport 443 \! -s " ${IPADDR} " -i docker0 -j MARK --set-mark 1 \
51
49
sudo iptables -t nat -D POSTROUTING -o docker0 -s 172.17.0.0/16 -j ACCEPT 2> /dev/null
52
50
}
53
51
set -e
54
52
}
55
53
56
54
stop () {
57
- # Ideally we'd leave the container around and re-use it, but I really
58
- # need a nice way to query for a named container first. Doesn't cost much
59
- # to create a new container anyway, especially given the cache volume is mapped.
60
55
set +e
61
- docker kill ${CONTAINER_NAME} > /dev/null 2>&1
62
- docker rm ${CONTAINER_NAME} > /dev/null 2>&1
56
+ sudo docker rm -f ${CONTAINER_NAME} > /dev/null 2>&1
63
57
set -e
64
58
stop_routing
65
59
}
@@ -85,18 +79,17 @@ run () {
85
79
# Because we're named, make sure the container doesn't already exist
86
80
stop
87
81
# Run and find the IP for the running container
88
- CID=$( ${RUN_DOCKER} --privileged -d -v " ${CACHEDIR} " :/var/spool/squid3 --name ${CONTAINER_NAME} ${CONTAINER_NAME} )
89
- IPADDR=$( docker inspect --format ' {{ .NetworkSettings.IPAddress }}' ${CID} )
82
+ CID=$( sudo docker run --privileged -d -v " ${CACHEDIR} " :/var/spool/squid3 --name ${CONTAINER_NAME} ${CONTAINER_NAME} )
83
+ IPADDR=$( sudo docker inspect --format ' {{ .NetworkSettings.IPAddress }}' ${CID} )
90
84
start_routing
91
85
# Run at console, kill cleanly if ctrl-c is hit
92
86
trap interrupted INT
93
87
trap terminated TERM
94
88
echo ' Now entering wait, please hit "ctrl-c" to kill proxy and undo routing'
95
- docker logs -f " ${CID} "
89
+ sudo docker logs -f " ${CID} "
96
90
echo ' Squid exited unexpectedly, cleaning up...'
97
91
stop
98
92
}
99
93
100
- # Guard so I can include this script into my own scripts
101
- [ -z ${RUNNING_DRUN} ] && run
94
+ run
102
95
echo
0 commit comments