iptables-complex.sh 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. #!/bin/bash
  2. # Firewall script for XXX.
  3. #
  4. # General notes:
  5. # - ISC DHCP server uses raw sockets for DHCPv4, which bypasses the firewall.
  6. # - DHCP responses from a server counts as established/related,
  7. # so responses from WAN DHCP servers with private addresses are not blocked.
  8. # - Linux with bridge-netfilter may filter bridged traffic, meaning bridge-internal
  9. # traffic passes through IPTables, therefore packets forwarded from and to
  10. # the same bridge subnet must be accepted for bridged devices to communicate.
  11. #
  12. # Notes about this network and script:
  13. # - All policies are set to DROP while updating the rules,
  14. # to prevent both unauthorized access (ACCEPT) and disconnects (REJECT).
  15. # - External traffic is bogon filtered.
  16. # - Internal traffic is source verified.
  17. # - Both IPv4 and IPv6 is NATed.
  18. # - Automatic rules and chains, e.g. from Docker and Fail2Ban, will be removed when this script is run.
  19. ################################################################################
  20. set -eu
  21. ### Config
  22. # Network subnets used to verify source
  23. NET_LAN_SUPER=( [4]="10.0.0.0/16" [6]="fd00:0:0::0/48" )
  24. NET_CORE_MGMT=( [4]="10.0.10.0/24" [6]="fd00:0:0:a::0/64" )
  25. NET_PERF_MGMT=( [4]="10.0.11.0/24" [6]="fd00:0:0:b::0/64" )
  26. NET_APPS=( [4]="10.0.30.0/24" [6]="fd00:0:0:1e::0/64" )
  27. NET_USERS=( [4]="10.0.100.0/24" [6]="fd00:0:0:64::0/64" )
  28. NET_GUESTS=( [4]="10.0.101.0/24" [6]="fd00:0:0:65::0/64" )
  29. NET_ADMINS=( [4]="10.0.102.0/24" [6]="fd00:0:0:66::0/64" )
  30. IF_WAN="enp0s0"
  31. IF_CORE_MGMT="enp0s0"
  32. IF_PERF_MGMT="enp0s0"
  33. IF_APPS="enp0s0"
  34. IF_USERS="enp0s0"
  35. IF_GUESTS="enp0s0"
  36. IF_ADMINS="enp0s0"
  37. HOST_UNIFI=( [4]="10.0.30.7" [6]="fd00:0:0:1e::7" )
  38. IPT4="iptables"
  39. IPT6="ip6tables"
  40. IPT_SAVE="netfilter-persistent"
  41. ################################################################################
  42. ### Helper structures
  43. find_cmd() {
  44. set +e
  45. val=$(which $1)
  46. if [ -z "$val" ]; then
  47. echo "Error: $1 missing." 1>&2
  48. return -1
  49. fi
  50. echo "$val"
  51. }
  52. IPT4_CMD="$(find_cmd "$IPT4")"
  53. IPT6_CMD="$(find_cmd "$IPT6")"
  54. IPT_SAVE_CMD="$(find_cmd "$IPT_SAVE") save"
  55. ipt4() {
  56. $IPT4_CMD "$@" || return $?
  57. }
  58. ipt6() {
  59. $IPT6_CMD "$@" || return $?
  60. }
  61. ipt46() {
  62. ipt4 "$@" || return $?
  63. ipt6 "$@" || return $?
  64. }
  65. ipt_save() {
  66. $IPT_SAVE_CMD || return $?
  67. }
  68. ## Add accept rules for specified services the specified chain.
  69. # Syntax: add_chain_services <chain> [service]*
  70. add_chain_services() {
  71. [[ $# -lt 1 ]] && { echo "In ${FUNCNAME[0]}: Missing argument 1"; return -1; }
  72. chain=$1
  73. shift
  74. for srv in "$@"; do
  75. case "$srv" in
  76. # In alphabetic order
  77. dns)
  78. ipt46 -A $chain -p udp --dport 53 -j ACCEPT
  79. ;;
  80. iperf3)
  81. ipt46 -A $chain -p tcp --dport 5201 -j ACCEPT
  82. ;;
  83. ntopng)
  84. ipt46 -A $chain -p tcp --dport 3000 -j ACCEPT
  85. ;;
  86. ntp)
  87. ipt46 -A $chain -p udp --dport 123 -j ACCEPT
  88. ;;
  89. ping)
  90. ipt4 -A $chain -p icmp --icmp-type echo-request -j ACCEPT
  91. ipt6 -A $chain -p icmpv6 --icmpv6-type echo-request -j ACCEPT
  92. ;;
  93. ssh)
  94. ipt46 -A $chain -p tcp --dport 22 -j ACCEPT
  95. ;;
  96. *)
  97. echo "Cannot add unknown service: $srv"
  98. return -1
  99. ;;
  100. esac
  101. done
  102. }
  103. ################################################################################
  104. echo "Deleting existing rules and chains, then adding new ones ..."
  105. ################################################################################
  106. ### Temporary policies
  107. ipt46 -P INPUT DROP
  108. ipt46 -P OUTPUT DROP
  109. ipt46 -P FORWARD DROP
  110. ################################################################################
  111. ### Clear all
  112. # TODO whitelist to not remove all chains
  113. ipt46 -F
  114. ipt46 -X
  115. ipt46 -t nat -F
  116. ipt46 -t nat -X
  117. ipt46 -t mangle -F
  118. ipt46 -t mangle -X
  119. ipt46 -t raw -F
  120. ipt46 -t raw -X
  121. ipt46 -t security -F
  122. ipt46 -t security -X
  123. ################################################################################
  124. ### Filter chains
  125. ## IPv4 source bogon filter
  126. chain="bogon-src-filter"
  127. ipt4 -N $chain
  128. ipt4 -A $chain -s 0.0.0.0/8 -j DROP # "This" Network
  129. ipt4 -A $chain -s 10.0.0.0/8 -j DROP # Private-Use Networks
  130. ipt4 -A $chain -s 100.64.0.0/10 -j DROP # Shared Address Space
  131. ipt4 -A $chain -s 127.0.0.0/8 -j DROP # Loopback
  132. ipt4 -A $chain -s 169.254.0.0/16 -j DROP # Link local
  133. ipt4 -A $chain -s 172.16.0.0/12 -j DROP # Private-Use Networks
  134. ipt4 -A $chain -s 192.0.0.0/24 -j DROP # IETF Protocol Assignments
  135. ipt4 -A $chain -s 192.0.2.0/24 -j DROP # TEST-NET-1
  136. ipt4 -A $chain -s 192.168.0.0/16 -j DROP # Private-Use Networks
  137. ipt4 -A $chain -s 198.18.0.0/15 -j DROP # Network Interconnect Device Benchmark Testing
  138. ipt4 -A $chain -s 198.51.100.0/24 -j DROP # TEST-NET-2
  139. ipt4 -A $chain -s 203.0.113.0/24 -j DROP # TEST-NET-3
  140. ipt4 -A $chain -s 224.0.0.0/4 -j DROP # Multicast
  141. ipt4 -A $chain -s 240.0.0.0/4 -j DROP # Reserved for Future Use
  142. ipt4 -A $chain -s 255.255.255.255/32 -j DROP # Limited Broadcast
  143. ## IPv4 destination bogon filter
  144. # Duplicate of source filter
  145. chain="bogon-dst-filter"
  146. ipt4 -N $chain
  147. ipt4 -A $chain -d 0.0.0.0/8 -j DROP
  148. ipt4 -A $chain -d 10.0.0.0/8 -j DROP
  149. ipt4 -A $chain -d 100.64.0.0/10 -j DROP
  150. ipt4 -A $chain -d 127.0.0.0/8 -j DROP
  151. ipt4 -A $chain -d 169.254.0.0/16 -j DROP
  152. ipt4 -A $chain -d 172.16.0.0/12 -j DROP
  153. ipt4 -A $chain -d 192.0.0.0/24 -j DROP
  154. ipt4 -A $chain -d 192.0.2.0/24 -j DROP
  155. ipt4 -A $chain -d 192.168.0.0/16 -j DROP
  156. ipt4 -A $chain -d 198.18.0.0/15 -j DROP
  157. ipt4 -A $chain -d 198.51.100.0/24 -j DROP
  158. ipt4 -A $chain -d 203.0.113.0/24 -j DROP
  159. ipt4 -A $chain -d 224.0.0.0/4 -j DROP
  160. ipt4 -A $chain -d 240.0.0.0/4 -j DROP
  161. ipt4 -A $chain -d 255.255.255.255/32 -j DROP
  162. ## IPv6 source bogon filter
  163. chain="bogon-src-filter"
  164. ipt6 -N $chain
  165. ipt6 -A $chain -s ::/8 -j DROP # Unspecified, loopback and compatible and mapped IPv4
  166. # Covered
  167. #ipt6 -A $chain -s ::/128 -j DROP # Unspecified
  168. #ipt6 -A $chain -s ::1/128 -j DROP # Loopback
  169. #ipt6 -A $chain -s ::/96 -j DROP # IPv4-compatible
  170. #ipt6 -A $chain -s ::ffff:0:0/96 -j DROP # IPv4-mapped
  171. ipt6 -A $chain -s 64:ff9b::/96 -j DROP # IPv4-IPv6 Translation
  172. ipt6 -A $chain -s 100::/64 -j DROP # Discard-Only
  173. ipt6 -A $chain -s 200::/7 -j DROP # OSI NSAP-mapped prefix set (deprecated)
  174. ipt6 -A $chain -s 2001::/23 -j DROP # IETF Protocol Assignments
  175. # Covered
  176. #ipt6 -A $chain -s 2001::/32 -j DROP # TEREDO
  177. ipt6 -A $chain -s 2001:2::/48 -j DROP # Benchmarking
  178. ipt6 -A $chain -s 2001:db8::/32 -j DROP # Documentation
  179. ipt6 -A $chain -s 2001:10::/28 -j DROP # ORCHID
  180. ipt6 -A $chain -s 2002::/16 -j DROP # All 6to4
  181. ipt6 -A $chain -s 3ffe::/16 -j DROP # 6bone (decommissioned)
  182. ipt6 -A $chain -s fc00::/7 -j DROP # Unique-Local
  183. ipt6 -A $chain -s fe80::/10 -j DROP # Linked-Scoped Unicast
  184. ipt6 -A $chain -s fec0::/10 -j DROP # Site-local unicast (deprecated)
  185. ipt6 -A $chain -s ff00::/8 -j DROP # Multicast (includes solicited-node)
  186. ## IPv6 destination bogon filter
  187. # Duplicate of source filter
  188. chain="bogon-dst-filter"
  189. ipt6 -N $chain
  190. ipt6 -A $chain -d ::/8 -j DROP
  191. ipt6 -A $chain -d 64:ff9b::/96 -j DROP
  192. ipt6 -A $chain -d 100::/64 -j DROP
  193. ipt6 -A $chain -d 200::/7 -j DROP
  194. ipt6 -A $chain -d 2001::/23 -j DROP
  195. ipt6 -A $chain -d 2001:2::/48 -j DROP
  196. ipt6 -A $chain -d 2001:db8::/32 -j DROP
  197. ipt6 -A $chain -d 2001:10::/28 -j DROP
  198. ipt6 -A $chain -d 2002::/16 -j DROP
  199. ipt6 -A $chain -d 3ffe::/16 -j DROP
  200. ipt6 -A $chain -d fc00::/7 -j DROP
  201. ipt6 -A $chain -d fe80::/10 -j DROP
  202. ipt6 -A $chain -d fec0::/10 -j DROP
  203. ipt6 -A $chain -d ff00::/8 -j DROP
  204. ################################################################################
  205. ### Input
  206. ## Input basic
  207. ipt46 -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  208. ipt46 -A INPUT -m conntrack --ctstate INVALID -j DROP
  209. # IPv6 NDP
  210. ipt6 -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
  211. ipt6 -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
  212. ipt6 -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
  213. ipt6 -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
  214. # DHCPv6 client+server (v6 doesn't use raw sockets)
  215. ipt6 -A INPUT -p udp --dport 546 -j ACCEPT
  216. ipt6 -A INPUT -p udp --dport 547 -j ACCEPT
  217. ## Input from localhost
  218. ipt46 -A INPUT -i lo -j ACCEPT
  219. ## Input from wan
  220. chain="in-from-wan"
  221. echo $chain
  222. ipt46 -N $chain
  223. ipt46 -A INPUT -i $IF_WAN -j $chain
  224. # Bogon filter src
  225. ipt46 -A $chain -j bogon-src-filter
  226. # Drop external traffic from internal addresses
  227. ipt4 -A $chain -s ${NET_LAN_SUPER[4]} -j DROP # IPv4
  228. ipt6 -A $chain -s ${NET_LAN_SUPER[6]} -j DROP # IPv6
  229. # Services
  230. add_chain_services $chain ping
  231. # Default action
  232. ipt46 -A $chain -j DROP
  233. ## Input from core-mgmt
  234. chain="in-from-core-mgmt"
  235. echo $chain
  236. ipt46 -N $chain
  237. ipt46 -A INPUT -i $IF_CORE_MGMT -j $chain
  238. ipt4 -A $chain ! -s ${NET_CORE_MGMT[4]} -j DROP # IPv4
  239. ipt6 -A $chain ! -s ${NET_CORE_MGMT[6]} -j DROP # IPv6
  240. add_chain_services $chain ping dns ntp iperf3 ssh ntopng
  241. ipt46 -A $chain -j REJECT
  242. ## Input from perf-mgmt
  243. chain="in-from-perf-mgmt"
  244. echo $chain
  245. ipt46 -N $chain
  246. ipt46 -A INPUT -i $IF_PERF_MGMT -j $chain
  247. ipt4 -A $chain ! -s ${NET_PERF_MGMT[4]} -j DROP # IPv4
  248. ipt6 -A $chain ! -s ${NET_PERF_MGMT[6]} -j DROP # IPv6
  249. add_chain_services $chain ping dns ntp iperf3
  250. ipt46 -A $chain -j REJECT
  251. ## Input from apps
  252. chain="in-from-apps"
  253. echo $chain
  254. ipt46 -N $chain
  255. ipt46 -A INPUT -i $IF_APPS -j $chain
  256. ipt4 -A $chain ! -s ${NET_APPS[4]} -j DROP # IPv4
  257. ipt6 -A $chain ! -s ${NET_APPS[6]} -j DROP # IPv6
  258. add_chain_services $chain ping dns ntp
  259. ipt46 -A $chain -j REJECT
  260. ## Input from users
  261. chain="in-from-users"
  262. echo $chain
  263. ipt46 -N $chain
  264. ipt46 -A INPUT -i $IF_USERS -j $chain
  265. ipt4 -A $chain ! -s ${NET_USERS[4]} -j DROP # IPv4
  266. ipt6 -A $chain ! -s ${NET_USERS[6]} -j DROP # IPv6
  267. add_chain_services $chain ping dns ntp iperf3
  268. ipt46 -A $chain -j REJECT
  269. ## Input from guest
  270. chain="in-from-guests"
  271. echo $chain
  272. ipt46 -N $chain
  273. ipt46 -A INPUT -i $IF_GUESTS -j $chain
  274. ipt4 -A $chain ! -s ${NET_GUESTS[4]} -j DROP # IPv4
  275. ipt6 -A $chain ! -s ${NET_GUESTS[6]} -j DROP # IPv6
  276. add_chain_services $chain ping dns ntp
  277. ipt46 -A $chain -j REJECT
  278. ## Input from admins
  279. chain="in-from-admins"
  280. echo $chain
  281. ipt46 -N $chain
  282. ipt46 -A INPUT -i $IF_ADMINS -j $chain
  283. ipt4 -A $chain ! -s ${NET_ADMINS[4]} -j DROP # IPv4
  284. ipt6 -A $chain ! -s ${NET_ADMINS[6]} -j DROP # IPv6
  285. add_chain_services $chain ping dns ntp iperf3 ssh ntopng
  286. ipt46 -A $chain -j REJECT
  287. ################################################################################
  288. ### Output
  289. ## Output basic
  290. ipt46 -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  291. ipt46 -A OUTPUT -m conntrack --ctstate INVALID -j DROP
  292. # IPv6 NDP
  293. ipt6 -A OUTPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
  294. ipt6 -A OUTPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
  295. ## Output to localhost
  296. ipt46 -A OUTPUT -o lo -j ACCEPT
  297. ## Output to WAN
  298. chain="out-to-wan"
  299. echo $chain
  300. ipt46 -N $chain
  301. ipt46 -A OUTPUT -o $IF_WAN -j $chain
  302. # Block LAN leakage
  303. ipt4 -A $chain -d ${NET_LAN_SUPER[4]} -j DROP # IPv4
  304. ipt6 -A $chain -d ${NET_LAN_SUPER[6]} -j DROP # IPv6
  305. # Default action
  306. ipt46 -A $chain -j ACCEPT
  307. ## Output to LAN
  308. chain="out-to-lan"
  309. echo $chain
  310. ipt46 -N $chain
  311. ipt46 -A OUTPUT -o $IF_CORE_MGMT -j $chain
  312. ipt46 -A OUTPUT -o $IF_PERF_MGMT -j $chain
  313. ipt46 -A OUTPUT -o $IF_APPS -j $chain
  314. ipt46 -A OUTPUT -o $IF_USERS -j $chain
  315. ipt46 -A OUTPUT -o $IF_GUESTS -j $chain
  316. ipt46 -A OUTPUT -o $IF_ADMINS -j $chain
  317. ipt46 -A $chain -j ACCEPT
  318. ################################################################################
  319. ### Forward
  320. ## Forward basic
  321. ipt46 -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  322. ipt46 -A FORWARD -m conntrack --ctstate INVALID -j DROP
  323. ## Verify source for stub LANs
  324. ipt4 -A FORWARD -i $IF_CORE_MGMT ! -s ${NET_CORE_MGMT[4]} -j DROP
  325. ipt6 -A FORWARD -i $IF_CORE_MGMT ! -s ${NET_CORE_MGMT[6]} -j DROP
  326. ipt4 -A FORWARD -i $IF_PERF_MGMT ! -s ${NET_PERF_MGMT[4]} -j DROP
  327. ipt6 -A FORWARD -i $IF_PERF_MGMT ! -s ${NET_PERF_MGMT[6]} -j DROP
  328. ipt4 -A FORWARD -i $IF_APPS ! -s ${NET_APPS[4]} -j DROP
  329. ipt6 -A FORWARD -i $IF_APPS ! -s ${NET_APPS[6]} -j DROP
  330. ipt4 -A FORWARD -i $IF_USERS ! -s ${NET_USERS[4]} -j DROP
  331. ipt6 -A FORWARD -i $IF_USERS ! -s ${NET_USERS[6]} -j DROP
  332. ipt4 -A FORWARD -i $IF_GUESTS ! -s ${NET_GUESTS[4]} -j DROP
  333. ipt6 -A FORWARD -i $IF_GUESTS ! -s ${NET_GUESTS[6]} -j DROP
  334. ipt4 -A FORWARD -i $IF_ADMINS ! -s ${NET_ADMINS[4]} -j DROP
  335. ipt6 -A FORWARD -i $IF_ADMINS ! -s ${NET_ADMINS[6]} -j DROP
  336. ## Forward from wan
  337. chain="fwd-from-wan"
  338. echo $chain
  339. ipt46 -N $chain
  340. ipt46 -A FORWARD -i $IF_WAN -j $chain
  341. # Bogon filter src and dst addresses
  342. ipt46 -A $chain -j bogon-src-filter
  343. ipt46 -A $chain -j bogon-dst-filter
  344. # Drop external traffic from internal addresses
  345. ipt4 -A $chain -s ${NET_LAN_SUPER[4]} -j DROP # IPv4
  346. ipt6 -A $chain -s ${NET_LAN_SUPER[6]} -j DROP # IPv6
  347. # Drop external traffic to internal addresses (because NAT44 + NAT66)
  348. ipt4 -A $chain -d ${NET_LAN_SUPER[4]} -j DROP # IPv4
  349. ipt6 -A $chain -d ${NET_LAN_SUPER[6]} -j DROP # IPv6
  350. # Return
  351. ## Forward to wan
  352. chain="fwd-to-wan"
  353. echo $chain
  354. ipt46 -N $chain
  355. ipt46 -A FORWARD -o $IF_WAN -j $chain
  356. # Block LAN leakage
  357. ipt4 -A $chain -d ${NET_LAN_SUPER[4]} -j DROP # IPv4
  358. ipt6 -A $chain -d ${NET_LAN_SUPER[6]} -j DROP # IPv6
  359. # LANs
  360. ipt46 -A $chain -i $IF_CORE_MGMT -j ACCEPT
  361. ipt46 -A $chain -i $IF_PERF_MGMT -j ACCEPT
  362. ipt46 -A $chain -i $IF_APPS -j ACCEPT
  363. ipt46 -A $chain -i $IF_USERS -j ACCEPT
  364. ipt46 -A $chain -i $IF_GUESTS -j ACCEPT
  365. ipt46 -A $chain -i $IF_ADMINS -j ACCEPT
  366. # Default action
  367. ipt46 -A $chain -j DROP
  368. ## Forward to core-mgmt
  369. chain="fwd-to-core-mgmt"
  370. echo $chain
  371. ipt46 -N $chain
  372. ipt46 -A FORWARD -o $IF_CORE_MGMT -j $chain
  373. # LANs
  374. ipt46 -A $chain -i $IF_CORE_MGMT -j ACCEPT # Self
  375. ipt46 -A $chain -i $IF_PERF_MGMT -j REJECT
  376. ipt46 -A $chain -i $IF_APPS -j REJECT
  377. ipt46 -A $chain -i $IF_USERS -j REJECT
  378. ipt46 -A $chain -i $IF_GUESTS -j REJECT
  379. ipt46 -A $chain -i $IF_ADMINS -j ACCEPT # Admin
  380. # Default action
  381. ipt46 -A $chain -j DROP
  382. ## Forward to perf-mgmt
  383. chain="fwd-to-perf-mgmt"
  384. echo $chain
  385. ipt46 -N $chain
  386. ipt46 -A FORWARD -o $IF_PERF_MGMT -j $chain
  387. # LANs
  388. ipt46 -A $chain -i $IF_CORE_MGMT -j REJECT
  389. ipt46 -A $chain -i $IF_PERF_MGMT -j ACCEPT # Self
  390. ipt46 -A $chain -i $IF_APPS -j REJECT
  391. ipt46 -A $chain -i $IF_USERS -j REJECT
  392. ipt46 -A $chain -i $IF_GUESTS -j REJECT
  393. ipt46 -A $chain -i $IF_ADMINS -j ACCEPT # Admin
  394. # Default action
  395. ipt46 -A $chain -j DROP
  396. ## Forward to apps
  397. chain="fwd-to-apps"
  398. echo $chain
  399. ipt46 -N $chain
  400. ipt46 -A FORWARD -o $IF_APPS -j $chain
  401. # UniFi: From APs to controller
  402. ipt4 -A $chain -i $IF_PERF_MGMT -d ${HOST_UNIFI[4]} -p tcp --dport=8080 -j ACCEPT # IPv4
  403. ipt6 -A $chain -i $IF_PERF_MGMT -d ${HOST_UNIFI[6]} -p tcp --dport=8080 -j ACCEPT # IPv6
  404. ipt4 -A $chain -i $IF_PERF_MGMT -d ${HOST_UNIFI[4]} -p udp --dport=3478 -j ACCEPT # IPv4
  405. ipt6 -A $chain -i $IF_PERF_MGMT -d ${HOST_UNIFI[6]} -p udp --dport=3478 -j ACCEPT # IPv6
  406. # LANs
  407. ipt46 -A $chain -i $IF_CORE_MGMT -j REJECT
  408. ipt46 -A $chain -i $IF_PERF_MGMT -j REJECT
  409. ipt46 -A $chain -i $IF_APPS -j ACCEPT # Self
  410. ipt46 -A $chain -i $IF_USERS -j REJECT
  411. ipt46 -A $chain -i $IF_GUESTS -j REJECT
  412. ipt46 -A $chain -i $IF_ADMINS -j ACCEPT # Admin
  413. # Default action
  414. ipt46 -A $chain -j DROP
  415. ## Forward to users
  416. chain="fwd-to-users"
  417. echo $chain
  418. ipt46 -N $chain
  419. ipt46 -A FORWARD -o $IF_USERS -j $chain
  420. # LANs
  421. ipt46 -A $chain -i $IF_CORE_MGMT -j REJECT
  422. ipt46 -A $chain -i $IF_PERF_MGMT -j REJECT
  423. ipt46 -A $chain -i $IF_APPS -j REJECT
  424. ipt46 -A $chain -i $IF_USERS -j ACCEPT # Self
  425. ipt46 -A $chain -i $IF_GUESTS -j REJECT
  426. ipt46 -A $chain -i $IF_ADMINS -j ACCEPT # Admin
  427. ## Forward to guests
  428. chain="fwd-to-guests"
  429. echo $chain
  430. ipt46 -N $chain
  431. ipt46 -A FORWARD -o $IF_GUESTS -j $chain
  432. # LANs
  433. ipt46 -A $chain -i $IF_CORE_MGMT -j REJECT
  434. ipt46 -A $chain -i $IF_PERF_MGMT -j REJECT
  435. ipt46 -A $chain -i $IF_APPS -j REJECT
  436. ipt46 -A $chain -i $IF_USERS -j ACCEPT # Allow
  437. ipt46 -A $chain -i $IF_GUESTS -j REJECT # Self, client isolation
  438. ipt46 -A $chain -i $IF_ADMINS -j ACCEPT # Admin
  439. ## Forward to admins
  440. chain="fwd-to-admins"
  441. echo $chain
  442. ipt46 -N $chain
  443. ipt46 -A FORWARD -o $IF_ADMINS -j $chain
  444. # LANs
  445. ipt46 -A $chain -i $IF_CORE_MGMT -j REJECT
  446. ipt46 -A $chain -i $IF_PERF_MGMT -j REJECT
  447. ipt46 -A $chain -i $IF_APPS -j REJECT
  448. ipt46 -A $chain -i $IF_USERS -j REJECT
  449. ipt46 -A $chain -i $IF_GUESTS -j REJECT
  450. ipt46 -A $chain -i $IF_ADMINS -j ACCEPT # Self, admin
  451. ################################################################################
  452. ### NAT
  453. ## SNAT + masquerade
  454. ipt4 -t nat -A POSTROUTING -o $IF_WAN -j MASQUERADE # IPv4
  455. ipt6 -t nat -A POSTROUTING -o $IF_WAN -j MASQUERADE # IPv6
  456. ## DNAT + port Forward
  457. # Port range for direct-wan: 50000-50999
  458. # Forward HTTP+HTTPS to Nginx container
  459. #ipt4 -t nat -A PREROUTING -i $IF_PUBLIC_WAN -p tcp -m multiport --dports 80,443 -j DNAT --to-destination ${HOST_NGINX_MASTER[4]}
  460. #ipt6 -t nat -A PREROUTING -i $IF_PUBLIC_WAN -p tcp -m multiport --dports 80,443 -j DNAT --to-destination ${HOST_NGINX_MASTER[6]}
  461. ################################################################################
  462. ### Final policies
  463. ipt46 -P INPUT DROP
  464. ipt46 -P OUTPUT DROP
  465. ipt46 -P FORWARD DROP
  466. ################################################################################
  467. ### Finish
  468. num_rules=$(iptables -n --list --line-numbers | sed '/^num\|^$\|^Chain/d' | wc -l)
  469. echo
  470. # TODO chain count
  471. echo "Rule count: $num_rules"
  472. echo
  473. echo "Please verify that you have not locked yourself out!"
  474. echo "Try opening another SSH session."
  475. echo "This can not easily be undone!"
  476. echo
  477. finished=false
  478. while [[ $finished != true ]]; do
  479. echo "Save running config to startup config?"
  480. read -p "Type \"YES\" to continue or CTRL+C to abort: " input
  481. if [[ $input == "YES" ]]; then
  482. finished=true
  483. else
  484. echo "Invalid input, try again."
  485. fi
  486. done
  487. ipt_save
  488. echo "Updated iptables startup config"